如何在Dart中重复监听游戏按键?

10

我知道你可以使用Dart监听按键按下和释放事件,像这样:

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

但是问题在于它只能触发一次,我想要重复触发。

所以,我尝试使用keyPress,但它会有微小的延迟才会重复触发。我正在开发一个游戏,我希望它可以立刻并且重复地触发。

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键。


在游戏循环结束后,您可能希望清除所有键盘按键。另请参见 https://github.com/sethladd/bad-aliens-dart,我现在意识到我可能需要更新 :) - Seth Ladd
我写了一篇有关Dart游戏键盘处理的文章:http://dartgamedevs.org/blog/2012/12/11/keyboard-input/。 - Cutch
@Cutch,链接已失效。可能是这个链接:https://github.com/dartgamedevs/dartgamedevs.org/blob/master/source/_posts/2012-12-11-keyboard-input.markdown - Amsakanna
我在回合制非常简单的游戏中使用了键盘类中的代码。当我切换到另一个窗口或应用程序时,它无法正常工作。我添加了一个额外的监听器来使其正常工作:window.onFocus.listen((onData){ _keys.clear(); }); - Gryffe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接