释放钥匙时停止玩家移动

时间:2013-06-07 21:58:45

标签: 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 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
}

3 个答案:

答案 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;
    }

在您更新增量后,我会根据animDirsprite变量确定dxdy

我也会检查左右,并在一个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()方法,该方法将移除已释放的所有密钥。