我知道你可以使用Dart监听按键按下和释放事件,像这样:
var el = query('#el');
el.on.keyDown.add((e) {});
但是问题在于它只能触发一次,我想要重复触发。
所以,我尝试使用keyPress
,但它会有微小的延迟才会重复触发。我正在开发一个游戏,我希望它可以立刻并且重复地触发。
首先,不要监听 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
键。