2017-06-07 47 views
0

後,球員經常繼續移動,我的球員對象在移動鍵釋放後繼續移動。速度停留在玩家的移動速度上,直到鬆開按鍵並再次釋放。當看着velX和velY的控制檯輸出時,我會看到它在幾秒鐘的持續時間內將每幀從8幀切換到16幀。偶爾在釋放鑰匙後,速度將保持在8或-8。由於某些原因,釋放鍵

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

這裏是上述(Calculations.clamp)作爲用於我的鉗位方法

//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

其中是ID.player定義的?它是一個全局變量/單身? –

+0

ID是一個枚舉,我用它來識別我的角色以區分不同的對象類型。 .player是該枚舉的一個元素。具有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本身固定這一點。

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

     } 
    } 
} 
相關問題