我们必须用键盘来控制游戏,所以下面来实现监听键盘按键
监听按键十分简单,只需要实现 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轴负方向)
}