【Java 2D游戏开发】监听键盘输入 / 方向键控制人物

时间:2024-03-21 14:15:04

最终效果:
【Java 2D游戏开发】监听键盘输入 / 方向键控制人物


我们必须用键盘来控制游戏,所以下面来实现监听键盘按键

监听按键十分简单,只需要实现 KeyListener 接口就可以了
假设现在已经可以监听到键盘的输入,那怎样让 Player 类中监听按键呢?

	@Override
	public void onTick()
	{
		if(按下左方向键)
			左移;
		if(按下右方向键)
			右移;
	}

解决方法是创建一个类 Input,监听游戏窗口的键盘输入,将按下的键都记录下来,再实现方法 getKeyDown,在调用时传入要监听的按键,方法就会返回这个键是否被按下

	@Override
	public void onTick()
	{
		if(Input.getKeyDown(左方向键))
			左移;
		if(Input.getKeyDown(右方向键))
			右移;
	}

那如何将按键的状态(是否按下)都记录下来?
这些数据都是按键 - 状态的形式,即键 - 值的形式,用 HashMap 记录下来即可

键    - 值
按键A - 按下
按键B - 未按下
按键C - 按下
...

如何使用 HashMap:

public static void main(String[] args)
{
	HashMap<Integer, Boolean> map = new HashMap<>(300);
	map.put(0, true);//HashMap.put(key, valua) 向HashMap里添加一对键值(如果有相同的键就替换已经有的)
	map.put(22, true);
	map.put(666, false);
	
	System.out.println(map.get(666));//HashMap.get(key) 获取对应键的值
	System.out.println(map.get(0));
	
	map.put(0, false);//修改键0的值为false
	
	System.out.println(map.get(0));
}

输出:

false
true
false

新建 Input 类

package com.game.input;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.HashMap;

public class Input implements KeyListener
{
	private static HashMap<Integer, Boolean> keys;
	public final static int KEY_COUNTS = 300;//存放的按键数量
	
	public void init()
	{
		keys = new HashMap<Integer, Boolean>(KEY_COUNTS);
		for(int i = 0; i < KEY_COUNTS; i++)
		{
			keys.put(i, false);
		}
	}
	
	@Override
	public void keyPressed(KeyEvent key)//有按键按下时
	{
		keys.put(key.getKeyCode(), true);//设置对应按键状态为true
	}

	@Override
	public void keyReleased(KeyEvent key)//有按键松开时
	{
		keys.put(key.getKeyCode(), false);//设置对应按键状态为false
	}

	@Override
	public void keyTyped(KeyEvent key)
	{
	}
	
	public static boolean getKeyDown(int keyCode)
	{
		return keys.get(keyCode);//返回对应按键的状态
	}

}

在 Game 类里初始化一下 Input 类

	//Game 类构造方法
	public Game(int windowWidth, int windowHeight, int fps)
	{
		width = windowWidth;
		height = windowHeight;
		this.fps = fps;
		windowTitle = "Game";
		backgroundColor = Color.BLACK;
		
		gameObjects = new ArrayList<GameObject>();
		createWindow();
		render = new RenderThread(this);
		render.start();
		
		//初始化输入设备
		Input input = new Input();
		input.init();
		this.addKeyListener(input);//设置游戏窗口的键盘监听器
	}

在 Player 类里监听一下按键,做出相应的移动

private int speed = 4;//移动速度
	@Override
	public void onTick()
	{
		if(Input.getKeyDown(KeyEvent.VK_LEFT))//按下左方向键时
			this.transfer(-1 * speed, 0);//左移(x轴负方向)
		if(Input.getKeyDown(KeyEvent.VK_RIGHT))
			this.transfer(1 * speed, 0);//右移(x轴正方向)
		if(Input.getKeyDown(KeyEvent.VK_UP))
			this.transfer(0, -1 * speed);//上移(y轴负方向)
		if(Input.getKeyDown(KeyEvent.VK_DOWN))
			this.transfer(0, 1 * speed);//下移(y轴负方向)
	}

值得注意的是,java swing 里的坐标系是这样的
【Java 2D游戏开发】监听键盘输入 / 方向键控制人物
而不是这样的的
【Java 2D游戏开发】监听键盘输入 / 方向键控制人物
所以向上移动y轴坐标要 -1 而不是 +1

运行效果:
【Java 2D游戏开发】监听键盘输入 / 方向键控制人物