我知道你可以通过Dart收听按键和按下事件,比如:

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

但这里的问题是,它只emits 了once枚.我要重复.

所以,我试了keyPress,但在重复之前有一点延迟.我正在制作一款游戏,我希望它能立即重复emits .

推荐答案

首先,不要听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键的按下情况.

Dart相关问答推荐

如何映射作为DART中其他模型基础的复杂模型

dart - 通过异步等待避免递归 Stackoverflow

使用 dart 中的括号表示法访问对象的属性

Flutter 中带有导航栏的永久视图

如何在 Dart 单元测试中模拟或验证打印调用?

Flutter:Firebase FieldValue.serverTimestamp() 到 DateTime 对象

结合freezed和hive

如何使用Flutter dio 下载文件?

每次我按下导航项时,底部的导航栏都会重新加载所有小部件

如何在 Dart 中使用类型Aliases/Typedefs(也是非函数)?

如何在dart中获取 map 的键列表?

Flutter-当文本字段有焦点时隐藏提示文本

如何实现从左侧滑动的侧边菜单?

无法使用 Flutter 调用 Localhost,将随机端口分配给 HTTP GET 调用

如何在 showModalBottomSheet 中设置状态

断言失败时如何在 Dart 中打印消息?

dart 如何创建、监听和发出自定义事件?

Dart:打印整数和字符串

什么是健全的编程语言?

dart中的max/mi int/double 值是否有常数?