我正在用Java制作游戏,我正在研究玩家的移动,但每当按下方向键时,玩家移动但在我释放按键时不会停止。
我似乎无法看到我做错了什么。有人能指出我正确的方向吗?
//输入类实现KeyListener
public static final int LEFT = 0;
public static final int RIGHT = 1;
public static final int UP = 2;
public static final int DOWN = 3;
public boolean[] keys = new boolean[64];
public void getKeys(KeyEvent e, boolean move) {
switch(e.getKeyCode()) {
case KeyEvent.VK_LEFT:
keys[LEFT] = move;
break;
case KeyEvent.VK_RIGHT:
keys[RIGHT] = move;
break;
case KeyEvent.VK_UP:
keys[UP] = move;
break;
case KeyEvent.VK_DOWN:
keys[DOWN] = move;
break;
case KeyEvent.VK_BACK_QUOTE:
keys[BQUOTE] = move;
break;
}
keys[OTHER] = move;
}
@Override
public void keyPressed(KeyEvent e) {
getKeys(e, true);
}
@Override
public void keyReleased(KeyEvent e) {
getKeys(e, false);
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
// Player Class
public void tick() {
if (Engine.key_input.keys[KInput.LEFT]) {
dx = -speed;
animDir = SpriteLoader.L;
sprite = SpriteLoader.anim(SpriteLoader.ANIM_PLAYER, animDir);
}
if (Engine.key_input.keys[KInput.RIGHT]){
dx = speed;
animDir = SpriteLoader.R;
sprite = SpriteLoader.anim(SpriteLoader.ANIM_PLAYER, animDir);
}
if (Engine.key_input.keys[KInput.UP]){
dy = -speed;
animDir = SpriteLoader.U;
sprite = SpriteLoader.anim(SpriteLoader.ANIM_PLAYER, animDir);
}
if (Engine.key_input.keys[KInput.DOWN]){
dy = speed;
animDir = SpriteLoader.D;
sprite = SpriteLoader.anim(SpriteLoader.ANIM_PLAYER, animDir);
}
}
//引擎类
public class Engine {
public Input key_input;
public Engine() {
key_input = new Input();
}
// add keyListener(Input) to component
}
答案 0 :(得分:1)
这不是你的信息。但这很可疑:
public boolean[] keys = new boolean[64]
代码在哪里说“我已经使用了这个keys
值,现在我想在下次忽略它”?
答案 1 :(得分:1)
在tick
方法中,您只检查“按下”状态,从不重置移动增量
例如......
public void tick() {
if (Engine.key_input.keys[KInput.LEFT]) {
dx = -speed;
} else {
dx = 0;
}
在您更新增量后,我会根据animDir
和sprite
变量确定dx
和dy
。
我也会检查左右,并在一个if
区块中上下查看......
例如
if (Engine.key_input.keys[KInput.LEFT]) {
dx = -speed;
} else if (Engine.key_input.keys[KInput.RIGHT]) {
dx = speed;
} else{
dx = 0;
}
这可确保您不会意外重置动作
答案 2 :(得分:0)
在你的处理程序中,你只是设置了键[] = true,但是你永远不会将它们恢复为假。
您需要添加一个keyReleased()方法,该方法将移除已释放的所有密钥。