0
我是Java编程新手,已经开始编写游戏。我有一个角色随着wasd移动,但发现时:未找到Java密钥版本?
- 移动键被按下。
- JFrame点击离开。 (所以它变得没有重点。)
- 相同的密钥被释放。
- JFrame重新聚焦。
......游戏不会捡起玩家不应该移动的东西。所以,我想通过改变所有的按键排列为false来解决它:
public class KeyManager implements KeyListener {
private Game game;
private boolean[] keys;
public boolean up, down, left, right; //Player class reads these variables
public KeyManager(Game game) {
this.game = game;
keys = new boolean[256];
}
public void tick() {
if(!game.getDisplay().getFrame().isFocused()) { //Here is the problem
for(int i = 0; i < keys.length; i++) {
keys[i] = false; //Repeats 256 x 60 times a second
}
}
up = keys[KeyEvent.VK_W]; //I realize that I could just change
down = keys[KeyEvent.VK_S]; //up, down, left, right to false but
left = keys[KeyEvent.VK_A]; //when the JFrame is refocused the game
right = keys[KeyEvent.VK_D]; //still doesn't know the key was released
}
@Override
public void keyPressed(KeyEvent e) {
keys[e.getKeyCode()] = true;
}
@Override
public void keyReleased(KeyEvent e) {
keys[e.getKeyCode()] = false;
}
@Override
public void keyTyped(KeyEvent e) {
}
}
它的工作,但想在代码后,我意识到,由于该记号()方法被调用60次的速率和按键阵列长度为256个密钥,因此每秒只更新15,900个关键布尔值,只有4个重要密钥需要更改为false。
什么是最有效的方法来做到这一点?我觉得我错过了很简单的事情。
这可能是有益的:http://rahalsblogs.blogspot.com/2015/08/how-to-use-keyeventdispatcher-with.html –
使用的键绑定的API,它不是关键监听 – MadProgrammer
我“可能“的做法是使用键绑定API来设置”键“标志的状态,然后这些标志将独立于游戏循环。然后,我会在'JFrame'上使用'FocusListener'来(可能)暂停游戏并重置键标志 – MadProgrammer