2017-06-07 3 views
0

aus irgendeinem Grund losgelassen hat, mein Spielerobjekt bewegt sich weiter, nachdem die Bewegungstaste losgelassen wurde. Die Geschwindigkeit bleibt bei der Spielergeschwindigkeit, bis die Taste losgelassen wird und wieder losgelassen wird. während ich auf die Konsolenausgabe von VelX und VelY schaue, sehe ich etwas, das jeden Frame nach einigen Sekunden von 8 auf 16 umschaltet. und gelegentlich nach dem Loslassen der Taste wird die Geschwindigkeit sowieso bei 8 oder -8 bleiben.Der Spieler bewegt sich oft weiter, nachdem er die Taste

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

hier ist meine Clamp-Methode, wie meine Tastatur oben (Calculations.clamp) verwendet Eingabemethode

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

wo ist ID.player definiert? Ist es eine globale Variable/Singleton? –

+0

ID ist eine Enumeration, mit der ich meine Zeichen identifiziere, um verschiedene Objekttypen zu unterscheiden. .player ist ein Element dieser Enumeration. Das einzige Objekt mit dem getID() "player" ist der Spieler. –

+0

Mögliches Duplikat von [So verwenden Sie Key Bindings statt Key Listeners] (https://stackoverflow.com/questions/22741215/how-to-use-key-bindings-instead-of-key-listeners) – user1803551

Antwort

0

die Geschwindigkeit auf die maximale Geschwindigkeit einstellen oder Null

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

schließlich statt Das Addieren oder Subtrahieren der maximalen Geschwindigkeit könnte das Problem lösen.

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

während dies geschieht Verhindere, dass der Spieler sich weiter bewegt, es verursacht auch eine ziemlich klebrige Bewegung, da du nicht sagen kannst, halte sowohl a als auch d und dann d los, um dich nach links zu bewegen. –

0

ich das Problem behoben haben, trat es, wenn der Schlüssel nach der zusätzlichen Geschwindigkeit freigegeben wurde hinzugefügt wurde, aber bevor die Klammer in gekickt. I fixiert dies allein auf die keyinput Geschwindigkeitskontrollen hinzufügen.

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

     } 
    } 
} 
Verwandte Themen