Java——在按键事件后立即调用KeyReleased

Java——在按键事件后立即调用KeyReleased,java,input,keypress,keyevent,keyrelease,Java,Input,Keypress,Keyevent,Keyrelease,当用户按下四个箭头键(或wasd)时,我试图让角色在一个简单的框架上移动。只要按住箭头键,角色应继续移动,并且在用户释放键后应停止移动 在大多数情况下,这是令人感动的。然而,当快速切换方向时,我得到了一些奇怪的延迟。看起来,当我按下键盘按钮时,java的keylistener将其解释为一个键“点击”,即快速按下并释放,然后确定按钮实际上被按下 因此,播放器模型的运动有点结巴 我的解释正确吗?这是我的代码,如果有人能理解的话 处理密钥释放的代码 @Override public void

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

在大多数情况下,这是令人感动的。然而,当快速切换方向时,我得到了一些奇怪的延迟。看起来,当我按下键盘按钮时,java的keylistener将其解释为一个键“点击”,即快速按下并释放,然后确定按钮实际上被按下

因此,播放器模型的运动有点结巴

我的解释正确吗?这是我的代码,如果有人能理解的话

处理密钥释放的代码

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


我希望这是足够的信息。感谢您的帮助!如果有任何需要澄清的地方,请告诉我。有更简单的方法吗?

这是一篇老文章,但对于将来可能访问此页面的人,我的答案如下

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

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

不久前我做了一个视频,字幕是葡萄牙语的,但是代码是以可见的字体显示的


致以最诚挚的问候。

基本测试对我来说似乎很好…也许是一个重复问题的可运行演示…我将包括一个可运行jar演示。谢谢只是开玩笑。我不知道如何在堆栈溢出上做到这一点:(看,它应该有一个主方法来设置程序,可以反复演示您遇到的问题。。。