有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

游戏物理Java:玩家移动错误

事先道歉。我自学成才,只学了一个月

这是一个窗口中的简单矩形,我用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;}

运动完全符合我的意图。按键之间没有延迟,移动平稳,对角线移动有效。 问题是。。 如果我坚持住,玩家会按预期向上移动。然后我按住。。玩家也会按预期下移。但当我向下释放时,玩家不会向上移动,即使我从未向上释放过。 然后当我最终释放时,玩家一路移动到 底部。 多谢各位

如果按下I键,它不会更新getVelocity吗? 根据数学计算,延迟会将velocityX设置为-5。然后按住该键将为velocityX增加+5。从而使其为0。但玩家还是向下移动。 我已经试着修了10个小时了。任何帮助都将是惊人的


共 (1) 个答案

  1. # 1 楼答案

    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);
    }
    

    此外,在本例中^{} comparison已被修复