2017-06-07 12 views
0

を解放した後に移動し続け、私の選手オブジェクトが移動キーが解放された後に移動し続けます。鍵盤を離すと再び離されるまで、ベロシティは変化しません。 velXとvelYのコンソール出力を見ながら、私は何か、それが押したままの数秒後に8から16までの各フレームをトグルを参照してください。キーを離した後でも、速度は8または-8にとどまることがあります。 (Calculations.clamp)上に使用されるように、ここでプレーヤーは、多くの場合、何らかの理由でキー

//Player tick method 
public void tick() { 

    //Dissalow Exceess Velocity 
    velX = Calculations.clamp(velX, -getMaxSpeed(), getMaxSpeed()); 
    velY = Calculations.clamp(velY, -getMaxSpeed(), getMaxSpeed()); 

    //move the player 
    x += velX; 
    y += velY; 

    //dissalow exiting room 
    x = Calculations.clamp(x, 0, Game.WIDTH - 32); 
    y = Calculations.clamp(y, 0, Game.HEIGHT - 32); 

    //check for collisions with objects 
    collision(); 
} 

は私クランプ法で

//clamp 
public static int clamp(int var, int min, int max) 
{ 
    if(var >= max) 
     return var = max; 
    else if(var <= min) 
     return var = min; 
    else return var; 
} 

最終的に、私のキーボード入力方法最大速度またはゼロの代わりに速度を設定

import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 

public class KeyInput extends KeyAdapter 
{ 
    private Handler myHandler; 

    public KeyInput(Handler handler) 
    { 
     this.myHandler = handler; 

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

     for(GameObject object : myHandler.objects) 
     { 
      if(object.getId() == ID.player) 
      { 
      if(key == KeyEvent.VK_W) object.setVelY(object.getVelY() - object.getMaxSpeed()); 
      if(key == KeyEvent.VK_S) object.setVelY(object.getVelY() + object.getMaxSpeed()); 
      if(key == KeyEvent.VK_A) object.setVelX(object.getVelX() - object.getMaxSpeed()); 
      if(key == KeyEvent.VK_D) object.setVelX(object.getVelX() + object.getMaxSpeed()); 
      } 
     } 
    } 
    public void keyReleased(KeyEvent e) 
    { 
     int key = e.getKeyCode(); 
     for(GameObject object : myHandler.objects) 
     { 
      if(object.getId() == ID.player) 
      { 
      if(key == KeyEvent.VK_W) object.setVelY(object.getVelY() + object.getMaxSpeed()); 
      if(key == KeyEvent.VK_S) object.setVelY(object.getVelY() - object.getMaxSpeed()); 
      if(key == KeyEvent.VK_A) object.setVelX(object.getVelX() + object.getMaxSpeed()); 
      if(key == KeyEvent.VK_D) object.setVelX(object.getVelX() - object.getMaxSpeed()); 
      } 
     } 
    } 
} 
+0

それはグローバル変数/シングルトンですか? –

+0

IDは、私は別のオブジェクト型を区別するためにIDに自分の文字を使用列挙型です。 .playerはそのenumの要素です。 getID() "player"を持つ唯一のオブジェクトはプレーヤです。 –

+0

[キーリスナーの代わりにキーバインディングを使用する方法](https://stackoverflow.com/questions/22741215/how-to-use-key-bindings-instead-of-key-listeners) – user1803551

答えて

0

最大速度を加算または減算することで問題が解決する可能性があります。

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

    for(GameObject object : myHandler.objects) 
    { 
     if(object.getId() == ID.player) 
     { 
     if(key == KeyEvent.VK_W) object.setVelY(-object.getMaxSpeed()); 
     if(key == KeyEvent.VK_S) object.setVelY(object.getMaxSpeed()); 
     if(key == KeyEvent.VK_A) object.setVelX(-object.getMaxSpeed()); 
     if(key == KeyEvent.VK_D) object.setVelX(object.getMaxSpeed()); 
     } 
    } 
} 

public void keyReleased(KeyEvent e) 
{ 
    int key = e.getKeyCode(); 
    for(GameObject object : myHandler.objects) 
    { 
     if(object.getId() == ID.player) 
     { 
     if(key == KeyEvent.VK_W) object.setVelY(0); 
     if(key == KeyEvent.VK_S) object.setVelY(0); 
     if(key == KeyEvent.VK_A) object.setVelX(0); 
     if(key == KeyEvent.VK_D) object.setVelX(0); 
     } 
    } 
} 
+0

の可能な複製あなたはAとDの両方を保持して、dは左に移動して離すと言うことができないように移動し続けることを未然に防ぐ、それはまた、かなり粘着性の運動を引き起こします。 –

0

私は問題を解決した、追加の速度を添加した後にキーが離されたときに、発生しましたが、クランプは蹴ら前。私はkeyinput自体に速度チェックを追加することによって、これを修正しました。 ID.playerが定義されている?

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

    for(GameObject object : myHandler.objects) 
    { 
     if(object.getId() == ID.player) 
     { 
      if(!(object.getVelY() == 8)) 
      { 
       if(key == KeyEvent.VK_S) object.setVelY(object.getVelY() + object.getMaxSpeed()); 
      } 
      if(!(object.getVelY() == -8)) 
      { 
      if(key == KeyEvent.VK_W) object.setVelY(object.getVelY() - object.getMaxSpeed()); 
      } 
      if(!(object.getVelX() == -8)) 
      { 
      if(key == KeyEvent.VK_A) object.setVelX(object.getVelX() - object.getMaxSpeed()); 
      } 
      if(!(object.getVelX() == 8)) 
      { 
       if(key == KeyEvent.VK_D) object.setVelX(object.getVelX() + object.getMaxSpeed()); 
      } 
     } 
    } 
} 
public void keyReleased(KeyEvent e) 
{ 
    int key = e.getKeyCode(); 
    for(GameObject object : myHandler.objects) 
    { 
     if(object.getId() == ID.player) 
     { 

     if(key == KeyEvent.VK_W) object.setVelY(object.getVelY() + object.getMaxSpeed()); 
     if(key == KeyEvent.VK_S) object.setVelY(object.getVelY() - object.getMaxSpeed()); 
     if(key == KeyEvent.VK_A) object.setVelX(object.getVelX() + object.getMaxSpeed()); 
     if(key == KeyEvent.VK_D) object.setVelX(object.getVelX() - object.getMaxSpeed()); 

     } 
    } 
} 
関連する問題