Как слушать нажатие клавиш в Dart для игр?

Я знаю, что вы можете слушать события нажатия клавиш и нажатия клавиш Dart, например:

var el = query('#el');
el.on.keyDown.add((e) {});

Но проблема здесь в том, что он срабатывает только один раз. Я хочу повторения.

Итак, я попробовал keyPress вместо этого, но у него есть небольшая задержка перед повторением. Я работаю над игрой и хочу, чтобы она запускалась мгновенно и периодически.

1 ответ

Решение

Прежде всего, не слушайте keyPress события, потому что "начальная задержка" зависит от конфигурации операционной системы! По факту, keyPress события могут даже не повторяться.

Что вам нужно сделать, это слушать keyDown а также keyUp События. Вы можете сделать помощника для этого.

class Keyboard {
  HashMap<int, int> _keys = new HashMap<int, int>();

  Keyboard() {
    window.onKeyDown.listen((KeyboardEvent e) {
      // If the key is not set yet, set it with a timestamp.
      if (!_keys.containsKey(e.keyCode))
        _keys[e.keyCode] = e.timeStamp;
    });

    window.onKeyUp.listen((KeyboardEvent e) {
      _keys.remove(e.keyCode);
    });
  }

  /**
   * Check if the given key code is pressed. You should use the [KeyCode] class.
   */
  isPressed(int keyCode) => _keys.containsKey(keyCode);
}

Тогда, в зависимости от того, что вы делаете в своей игре, у вас, вероятно, есть какой-то "игровой цикл" в своем роде. update() метод, который вызывается время от времени:

class Game {
  Keyboard keyboard;

  Game() {
    keyboard = new Keyboard();

    window.requestAnimationFrame(update);
  }

  update(e) {
    if (keyboard.isPressed(KeyCode.A))
      print('A is pressed!');

    window.requestAnimationFrame(update);
  }
}

Теперь ваш игровой цикл периодически проверяется на A нажатие клавиши.

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