使用 HTML5 画布和 javascript 开发一个小游戏。它工作得很好,除了键盘键偶尔会“卡住”,即。它会注册一个 keydown 事件,但有时它不会注册 keyup 事件。这通常发生在一次按下多个键时,因此部分是硬件或操作系统故障,但我希望有人对如何解决这个问题有想法。我的代码的相关部分(用咖啡脚本编写):
press = (direction) ->
switch direction
when 'W'
game.keys.W = true
when 'S'
game.keys.S = true
when 'A'
game.keys.A = true
when 'D'
game.keys.D = true
release = (direction) ->
switch direction
when 'W'
game.keys.W = false
when 'S'
game.keys.S = false
when 'A'
game.keys.A = false
when 'D'
game.keys.D = false
doKeyDown = (evt) ->
switch evt.keyCode
when 87 then press 'W'
when 83 then press 'S'
when 65 then press 'A'
when 68 then press 'D'
doKeyUp = (evt) ->
switch evt.keyCode
when 87 then release 'W'
when 83 then release 'S'
when 65 then release 'A'
when 68 then release 'D'
window.addEventListener('keydown', doKeyDown, false)
window.addEventListener('keyup', doKeyUp, false)
基本的东西。如果 javascript 不完全是事件驱动的,那将不是问题,但你能做什么。我目前关于如何规避该问题的想法是添加一个按键队列,可容纳 2 个或 3 个键,当超出限制时,删除第一个键并切换为“假” . 尽管如此,在应该可以避免的情况下添加这样的人为限制似乎很奇怪!
那么,问题是,是否有一种直接的方法可以确保准确保存关键状态,而无需求助于变通方法?最好是独立于游戏帧率工作的东西(无论它是以 1000 fps 还是 3 fps 运行,都应该同样好用)。