Java 释放钥匙时停止玩家移动
我正在用Java制作一个游戏,我正在研究玩家的移动,但每当按下方向键时,玩家就会移动,但当我松开方向键时,玩家不会停止 我似乎看不出我做错了什么。有人能给我指一下正确的方向吗 //输入类实现KeyListenerJava 释放钥匙时停止玩家移动,java,swing,awt,Java,Swing,Awt,我正在用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 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
}
//球员级别
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
}
您提供的信息不够。但这是可疑的:
public boolean[] keys = new boolean[64]
其中的代码是这样写的:“我已经使用了这个
键
值,现在我想下次忽略它”在处理程序中,您只需将键[]=true,但不会将它们返回false
您需要添加一个keyReleased()方法,该方法将取消移动所有已释放的按键。在您的
勾选方法中,您只检查“按下”状态,从不重置移动增量
例如
public void tick() {
if (Engine.key_input.keys[KInput.LEFT]) {
dx = -speed;
} else {
dx = 0;
}
更新增量后,我将根据dx
和dy
变量来确定animDir
和sprite
我还会在一个块中检查左右和上下
比如说
if (Engine.key_input.keys[KInput.LEFT]) {
dx = -speed;
} else if (Engine.key_input.keys[KInput.RIGHT]) {
dx = speed;
} else{
dx = 0;
}
这可以确保您不会意外地使用调试器重置移动,并检查发生了什么情况?哪个类包含键、getKeys()
、和keyPressed()
?是否应改为调用setKeys()
?