Как слушать повторное нажатие клавиши в 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.