Java - KeyReleased вызывается сразу после события KeyPressed

Я пытаюсь заставить персонажа перемещаться по простому кадру, когда пользователь нажимает четыре клавиши со стрелками (или wasd). Персонаж должен продолжать двигаться, пока нажата клавиша со стрелкой, и должен прекратить движение, как только пользователь отпустит клавишу.

По большей части это движется. Тем не менее, я получаю странную задержку при быстром переключении направлений. Похоже, что когда я нажимаю кнопку клавиатуры, Java Keylistener интерпретирует это как нажатие клавиши, быстрое нажатие и отпускание AKA, прежде чем определить, что кнопка действительно удерживается нажатой.

Таким образом, модель плеера немного заикается в своем движении.

Я правильно интерпретирую это? Вот мой код, если кто-то может понять это.

Код для обработки выпуска ключа

    @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 ответ

Это старый пост, но для будущих людей, которые могут посетить эту страницу, вот мой ответ

KeyListener обрабатывает нажатие клавиши как текстовый редактор. Когда вы держите клавишу, вы заметите, что есть задержка, прежде чем редактор начнет ее повторять.

Чтобы сделать игру на Java, мы обычно создаем другой поток для обработки ввода, KeyListener просто меняет некоторые флаги, которые проверяются в игровом цикле.

Я сделал видео об этом некоторое время назад, подписи на португальском языке, но код там с видимым размером шрифта.

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

С наилучшими пожеланиями.

Другие вопросы по тегам