1

当用户按下四个箭头键(或 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;
        }

}

我希望这是足够的信息。任何帮助表示赞赏!让我知道我是否可以做出任何澄清。有没有更简单的方法来做到这一点?

4

1 回答 1

1

这是一个旧帖子,但是对于可能访问此页面的未来人们,这是我的答案

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

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

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

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

此致。

于 2016-01-11T10:36:47.497 回答