【问题标题】:Observing keydown events in JavaScript when two keys are pressed simultaneously同时按下两个键时在 JavaScript 中观察 keydown 事件
【发布时间】:2011-01-25 14:11:26
【问题描述】:

我正在使用 JavaScript 开发一个浏览器游戏,玩家可以在其中向所有四个方向移动头像。

为了记录同时按下的按键,我观察keydownkeyup 事件并跟踪按下和释放的按键。这样,如果同时按下 cursor upcursor right,我可以沿对角线方向移动头像。

这与 StackOverflow In Javascript, how do I tell if a user is pressing two keys at the same time? 上的回复与此演示 http://jsbin.com/iloxi 的原理相同。

但是,该解决方案存在一个缺陷,也可以在演示中重现。例如按下 cursor down,然后也开始按下 cursor right。该框现在移动到右下角。现在释放向右光标,同时按住向下光标。盒子停止移动。应该发生的是盒子一直向下移动。

问题是 JavaScript 停止发送 cursor down keydown 事件,只要 cursor right 被按下。一旦 向右光标 被释放,就无法知道 向下光标 仍然被按下。

这个问题有解决办法吗?

更新: 演示的问题是该框在keydownkeyup 事件侦听器中移动。但是,一旦释放第二个键,就不会再为第一个键触发 keydown 事件。我想知道是否有解决方案,或者这是否是标准的 JavaScript 行为?

要修复演示代码,您必须在超时迭代 (window.setTimeout()) 中调用 move() 函数。

【问题讨论】:

    标签: javascript events keypress key simultaneous


    【解决方案1】:

    也许我误解了你,但你不应该等待光标向下的keyup 事件吗?即按下光标直到你得到一个keyup - 你不应该依赖重复发送的keydown事件。

    【讨论】:

    • 我认为他希望头像在按住键时移动,然后在 keyup 时停止。
    • ghoppe 是对的。我只是想知道为什么演示(见上面的链接)不能按预期工作。我从头开始编写的代码也有同样的问题。
    • 好吧,我明白了。我是说你应该做的只是使用 keydown 和 keyup 事件来跟踪按下了哪些键,然后在你的计时器循环中进行实际移动。 (假设您将有一个计时器循环,因为这是一个游戏,您将需要处理其他游戏逻辑。)这也将消除您在第一个和第二个“步骤”之间获得的稍长的延迟。
    • kprevas,这正是我现在的想法 :) 我更新了问题以进行澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2013-03-18
    相关资源
    最近更新 更多