2017-11-02 2 views
0

사과. 나는 스스로 가르치고 있으며 한 달 동안 만 학습했습니다.자바 : 플레이어 이동 버그

이것은 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을 누르고, 플레이어는 의도 한대로 아래로 움직일 것이다. 하지만 내가 내려 놓을 때까지 결코 내리지 않을 것입니다. 그런 다음 마지막으로 UP을 놓으면 플레이어가 아래쪽의 까지 계속 이동합니다. 감사합니다.

I 키를 누르면 getVelocity가 업데이트되지 않습니까? 수학에 따르면, 누르고 있으면 velocityX가 -5로 설정됩니다. 그런 다음 누르고 있으면 velocityX에 +5가 추가됩니다. 따라서 0이됩니다.하지만 플레이어는 어쨌든 아래로 움직입니다. 저는 이것을 10 시간 동안 고치려고 노력해 왔습니다. 어떤 도움이라도 훌륭 할 것입니다.

+3

문제인지는 모르겠지만 String 객체를 비교하는 방법은 잘못되었습니다. https://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java – Berger

+0

알아요. 그게 정확하지는 않지만, 어떤 이유로 든 그것들을 정확하게 비교하기 때문에 고치지 않았습니다. –

+0

keyPressed와 keyReleased가 반대의 이유는 무엇입니까? – MystyxMac

답변

1

keyPressed의 문제점은 눌린 상태로 유지되는 한 많은 이벤트가 주어진 키에 대해 전송된다는 것입니다.

마지막으로 동일한 키를 누른 경우 이벤트를 무시할 수 있습니다. 그런 다음

private int lastKey = 0; 

이런 식 (코드의 주석을 참조)를 사용 :

클래스에서

, 당신은 마지막 키의 값을 저장하기 위해 몇 가지 int를 선언 할 수있다 또한

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이 수정되었습니다.

관련 문제