Java - KeyReleased在KeyPressed事件后立即调用

时间:2014-02-08 01:01:04

标签: java input keypress keyevent keyrelease

当用户按下四个箭头键(或wasd)时,我试图让一个角色在一个简单的框架上移动。只要按住箭头键,角色就应该继续移动,并且一旦用户释放钥匙就应该停止移动。

在大多数情况下,这种情况正在发生变化。但是,当快速切换方向时,我会遇到一些奇怪的延迟。看起来,当我按下键盘按钮时,java的keylistener将此解释为一个键&#34;点击&#34;,AKA快速按下并释放,然后确定按钮实际被按下。< / p>

因此,玩家模型的动作会稍微停滞不前。

我是否正确地解释了这一点?这是我的代码,如果有人能理解这一点。

处理密钥发布的代码

    @Override
public void keyReleased(KeyEvent e) 
{

    switch(e.getKeyCode())
    {

    case KeyEvent.VK_W:
    case KeyEvent.VK_UP:
    case KeyEvent.VK_A:
    case KeyEvent.VK_LEFT:
    case KeyEvent.VK_S:
    case KeyEvent.VK_DOWN:
    case KeyEvent.VK_D:
    case KeyEvent.VK_RIGHT:

        GameController.hero.stopMoving();
        break;

    case KeyEvent.VK_SPACE:
        break;
    case KeyEvent.VK_ESCAPE:
        break;

    }

    keyPress = false;
} 

我处理按键的代码

@Override
public void keyPressed(KeyEvent e) 
{

    keyPress = true;
    keyCode = e.getKeyCode();


    switch(e.getKeyCode())
    {


    case KeyEvent.VK_W:
    case KeyEvent.VK_UP:
        GameController.hero.setSpeedBase(new Point(0,-1));
        break;
    case KeyEvent.VK_A:
    case KeyEvent.VK_LEFT:
        GameController.hero.setSpeedBase(new Point(-1,0));
        break;
    case KeyEvent.VK_S:
    case KeyEvent.VK_DOWN:
        GameController.hero.setSpeedBase(new Point(0,1));
        break;
    case KeyEvent.VK_D:
    case KeyEvent.VK_RIGHT:
        GameController.hero.setSpeedBase(new Point(1,0));
        break;
        }

}

我希望这是足够的信息。任何帮助表示赞赏!如果我能做出任何澄清,请告诉我。有更简单的方法吗?

1 个答案:

答案 0 :(得分:1)

这是一篇很老的帖子,但对于未来可能访问此页面的人来说,这是我的回答

KeyListener将按键作为文本编辑器处理。当您按住某个键时,您会注意到编辑器开始重复之前有一段延迟。

要使用Java制作游戏,我们通常会创建另一个线程来处理输入,KeyListener只会更改在游戏循环中检查的一些标志

我前段时间制作了一段视频,标题是葡萄牙语,但代码在那里有可见的字体大小。

https://www.youtube.com/watch?v=f7M9eAkNS8s

最好的问候。