2017-11-02 8 views
0

お詫び申し上げます。私は独学で1ヶ月間しか学習していません。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;} 

動きは意図したとおりに正しく動作します。キーを押す間に遅れがなく、動きが滑らかで、斜めの動きが働きます。 問題は.. 私がホールドアップすると、プレイヤーは意図したとおりに上に移動します。次に、DOWNを押し続けます。プレーヤーは意図したとおりに下に移動します。しかし、DOWNをリリースすると、私は決してリリースしませんでした。 最後にUPをリリースすると、プレーヤーは最後まで まで移動します。 ありがとうございます。

Iキーを押してもgetVelocityは更新されませんか? 数学によれば、押し上げるとvelocityXが-5に設定されます。その後、押し続けるとvelocityXに+5が加算されます。したがって、0にする。しかし、プレーヤーはとにかく下に移動する。 私はこれを10時間修正しようとしています。どんな助けも素晴らしいだろう。

+3

問題があるかどうかわかりませんが、文字列オブジェクトを比較する方法は間違っています。https://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java – Berger

+0

私は知っていますそれは正しくありませんが、何らかの理由でそれらを正しく比較するので、私はそれを修正しませんでした。 –

+0

keyPressedとkeyReleasedが逆の理由は何ですか? – MystyxMac

答えて

1

keyPressedの問題は、押されている限り、特定のキーに対して多くのイベントが送信されるということです。

最後に同じキーが押された場合は、そのイベントを無視します。

あなたのクラスでは、あなたが最後のキーの値を格納するために、いくつかの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); 
} 

private int lastKey = 0; 

次に、このよう(コード内のコメントを参照)、それを使用この例ではString comparisonが修正されました。

関連する問題