10

次のような Dart を使用して、キーの押下とダウンのイベントをリッスンできることを知っています。

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

しかし、ここでの問題は、一度しか発火しないことです。リピートしたいです。

keyPressということで、代わりにやってみましたが、繰り返しの前に少し遅れがあります。私はゲームに取り組んでおり、即座に繰り返し起動したいと考えています。

4

1 に答える 1

23

まず第一にkeyPress、「初期遅延」はオペレーティング システムの構成に依存するため、イベントをリッスンしないでください。実際、keyPressイベントは繰り返し発生することさえありません。

あなたがする必要があるのは、リッスンkeyDownkeyUpイベントです。このためのヘルパーを作成できます。

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これで、ゲーム ループはキーの押下を繰り返しチェックします。

于 2012-12-06T15:03:52.380 に答える