Java:玩家移动错误

时间:2017-11-02 08:38:51

标签: java game-physics keyevent

提前道歉。我是自学成才,只学了一个月。

这是我用WASD键移动的窗口中的一个简单矩形。

public LinkedList<Object> object;

public KeyInput(LinkedList<Object> object){
    this.object = object;
}

public void keyPressed(KeyEvent e){

    int key = e.getKeyCode();

        Object myPlayer = Main.object.get(0);

        if(myPlayer.getName() == "PlayerOne"){
            if(key == KeyEvent.VK_W) 
                myPlayer.setVelocityY(myPlayer.getVelocityY() - 5);
            if(key == KeyEvent.VK_S)
                myPlayer.setVelocityY(myPlayer.getVelocityY() + 5);
            if(key == KeyEvent.VK_D) 
                myPlayer.setVelocityX(myPlayer.getVelocityX() + 5);
            if(key == KeyEvent.VK_A)
                myPlayer.setVelocityX(myPlayer.getVelocityX() - 5);
        }

    if(key == KeyEvent.VK_ESCAPE) System.exit(0);
}

public void keyReleased(KeyEvent e){
    int key = e.getKeyCode();

        Object tempObject = Main.object.get(0);

        if(tempObject.getName() == "PlayerOne"){
            if(key == KeyEvent.VK_W) 
                tempObject.setVelocityY(tempObject.getVelocityY() + 5);
            if(key == KeyEvent.VK_S)
                tempObject.setVelocityY(tempObject.getVelocityY() - 5);
            if(key == KeyEvent.VK_D) 
                tempObject.setVelocityX(tempObject.getVelocityX() - 5);
            if(key == KeyEvent.VK_A)
                tempObject.setVelocityX(tempObject.getVelocityX() + 5);
        }
}

/////////////////////////////////////////////// //////////////

public void setVelocityX(int velocityX){        
    this.velocityX = velocityX;
    //Prevent a speed higher than 5.
    if(this.velocityX > 5) this.velocityX = 5;
    if(this.velocityX < -5) this.velocityX = -5;
}
public void setVelocityY(int velocityY){
    this.velocityY = velocityY;
    if(this.velocityY > 5) this.velocityY = 5;
    if(this.velocityY < -5) this.velocityY = -5;}

运动完全符合我的预期。按键之间没有延迟,运动平稳,对角线运动起作用。 问题是...... 如果我按住,则播放器按预期向上移动。然后我按住DOWN ..然后玩家将按照预期向下移动。但是当我释放DOWN时,即使我从未放过,玩家也不会向上移动。 然后,当我最终释放UP时,玩家一直移动到 底部。 谢谢。

如果按下了键,是不是更新了getVelocity? 根据数学计算,保持将velocityX设置为-5。然后按住向velocityX添加+5。因此将其设为0.但是无论如何球员都会向下移动。 我一直试图解决这个问题10个小时。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

keyPressed的问题在于,只要保持按下,就会为给定的密钥发送许多事件。

如果最后一个用于相同的按键,则可以忽略该事件。

在您的课程中,您可以声明一些int来存储最后一个键的值:

private int lastKey = 0;

然后以这种方式使用它(参见代码中的注释):

public void keyPressed(KeyEvent e){

    int key = e.getKeyCode();

    // if last key was the same one, ignore :
    if (key == lastKey) {
        return;
    }

    Object myPlayer = Main.object.get(0);

    if(myPlayer.getName().equals("PlayerOne")){
        if(key == KeyEvent.VK_W) 
            myPlayer.setVelocityY(myPlayer.getVelocityY() - 5);
        if(key == KeyEvent.VK_S)
            myPlayer.setVelocityY(myPlayer.getVelocityY() + 5);
        if(key == KeyEvent.VK_D) 
            myPlayer.setVelocityX(myPlayer.getVelocityX() + 5);
        if(key == KeyEvent.VK_A)
            myPlayer.setVelocityX(myPlayer.getVelocityX() - 5);
    }

    // set the current key as the last key
    lastKey = key;

    if(key == KeyEvent.VK_ESCAPE) System.exit(0);
}

此外,此示例中已修复String comparison