Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 释放钥匙时停止玩家移动_Java_Swing_Awt - Fatal编程技术网

Java 释放钥匙时停止玩家移动

Java 释放钥匙时停止玩家移动,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;

我正在用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

}
//球员级别

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()