Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 玩家经常在释放钥匙后继续移动_Java_Input_Keyboard - Fatal编程技术网

Java 玩家经常在释放钥匙后继续移动

Java 玩家经常在释放钥匙后继续移动,java,input,keyboard,Java,Input,Keyboard,由于某些原因,我的玩家对象在释放移动键后继续移动。速度保持在玩家移动速度,直到释放按键并再次按下释放。在查看velX和Fly的控制台输出时,我看到它在按住几秒钟后将每个帧从8切换到16。偶尔在释放键后,速度会保持在8或-8 //Player tick method public void tick() { //Dissalow Exceess Velocity velX = Calculations.clamp(velX, -getMaxSpeed(), getMaxSpeed

由于某些原因,我的玩家对象在释放移动键后继续移动。速度保持在玩家移动速度,直到释放按键并再次按下释放。在查看velX和Fly的控制台输出时,我看到它在按住几秒钟后将每个帧从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)


将“速度”设置为“最大速度”或“零”,而不是添加或减去“最大速度”,可以解决此问题

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

我已经解决了这个问题,它发生在增加额外速度后释放钥匙时,但在夹钳启动之前。我通过向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());

        }
    }
}

在哪里定义ID.player?它是一个全局变量/单例吗?ID是一个枚举,我使用它来标识我的字符,以便区分不同的对象类型。player是该枚举的一个元素。getID()为“player”的唯一对象是播放器。可能的重复虽然这会阻止播放器继续移动,但也会导致相当粘性的移动,因为您无法说同时按住a和d,然后释放d向左移动。
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);
        }
    }
}
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());

        }
    }
}