0

for some reason, my player object continues to move after the movement key is released. The velocity stays at the players movespeed until the key is released pressed and released again. while looking at console output of velX and velY i see something it toggling each frame from 8 to 16 after a few seconds of hold down. and occasionally after releasing the key the velocity will stay at 8 or -8 anyways.

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

here is my Clamp method as used above (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;
}

finally my Keyboard input method

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());
            }
        }
    }
}
Kohei TAMURA
  • 4,970
  • 7
  • 25
  • 49
  • where is ID.player defined? Is it a global variable / singleton ? – Govinnage Rasika Perera Jun 07 '17 at 03:06
  • ID is an enum which i use to ID my characters in order to differentiate different object types. .player is an element of that enum. the only object with the getID() "player" is the player. – Alex Sharp Jun 07 '17 at 13:42
  • Possible duplicate of [How to use Key Bindings instead of Key Listeners](https://stackoverflow.com/questions/22741215/how-to-use-key-bindings-instead-of-key-listeners) – user1803551 Aug 01 '17 at 14:03

2 Answers2

0

Setting the velocity to the maximum velocity or zero instead of adding or subtracting max velocity might solve the problem.

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);
        }
    }
}
  • while this does prevent the player from continuing to move, it also causes fairly sticky movement as you are unable to say hold both a and d and then release d to move left. – Alex Sharp Jun 07 '17 at 14:10
0

I have resolved the issue, it occured when the key was released after the additional velocity was added, but before the clamp kicked in. i fixed this by adding velocity checks to the keyinput itself.

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

        }
    }
}