检测同时按下多个键以移动“角色/玩家”

4
我已经有了一个示例,你可以在这里(示例1)查看,需要点击“结果”窗口,以便按下键盘上的w、a、s和d键来移动角色。请注意,这个示例还没有经过浏览器测试,只能在一些现代浏览器中使用。
现在,我已经可以根据需要使图像向上/下/左/右移动,并且根据“健康”状态移动特定速度。我找到了一个很好的示例,它可以随着鼠标旋转,因此适用于鸟瞰视角的游戏。
现在,我有点困惑如何让图像斜向移动。我尝试使用多个if语句连接可能的键组合,但它总是采用最后按下的键。
我不知道该如何解决这个问题,我需要把它们放在某种while循环中吗?当按下某个键时,将其移动到该方向?这样是否可以消除对斜线/多键按下的需求?
    if ((key == key_W && key == key_D) || (key == key_w && key == key_d) || (key == key_W && key == key_d) || (key == key_w && key == key_D)) {

        // Player Up/Right

    }

我需要设置一种数组来生成按键列表吗?

我知道在Javascript / jQuery中制作游戏并不是最好的方法,这只是一个实验。

编辑

现在有一个更可行的、移动的角色 这里(示例2),但移动有延迟,那么,有没有办法减少这个延迟?


嘿嘿 - 让小家伙四处奔跑真是有趣。很酷的项目。对于查看此内容的人,请使用WASD移动角色,它也会跟随鼠标移动。 - mrtsherman
顺便提一下,我只能在IE9中使其工作,而不能在Chrome或Firefox中。 - Andy Rose
@Jleagle - 你是正确的,它确实可以,但在Firefox中不行。 - Andy Rose
@AndyRose 可能是因为我正在使用 CSS3 的 rotate,这可能会引起问题。而且我还没有检查它在跨浏览器兼容性方面的表现。但感谢您指出这一点 :) - no.
2个回答

4
这看起来是一个有趣的项目,引起了我的好奇心,于是我开始四处寻找。我在Quirksmode上找到了一篇文章,讲述了使用键码与字符码的区别。我发现你正在检测大小写字母。下面这段话似乎表明这是不必要的。该文章还包含有关浏览器兼容性和系统之间特殊键的重要文档,例如Mac键盘上的命令按钮。它是什么?如何在各种浏览器中检测并表现出不同的行为?
“例如,小写字母'a'和大写字母'A'具有相同的keyCode,因为用户按下了相同的键,但由于生成的字符不同,所以具有不同的charCode。” http://www.quirksmode.org/js/keys.html 那么问题就变成了,如何检测多个键的按下。我在StackOverflow上找到了一个非常简单直接的答案。 Can jQuery .keypress() detect more than one key at the same time?
var keys = {};

$(document).keydown(function (e) {
    keys[e.which] = true;
});

$(document).keyup(function (e) {
    delete keys[e.which];
})

更新

基本上我只是引入了上面的代码,删除了你的对角线代码,并迭代了所有移动操作的键数组。

http://jsfiddle.net/mrtsherman/8NW2K/3/


哦,以防不明显,我希望你能将所有当前按下的键保留在keys数组中。然后遍历该数组,并为每个键计算一个移动事件。我猜你理论上可以做一些奇怪的事情,比如同时按上下箭头键,导致没有移动。 - mrtsherman
使用示例更新后的Fiddle。 - mrtsherman
啊,这个可行!谢谢!我可能需要稍微调整一下,以使事情更加顺畅,但这绝对可以让事情更进一步!在我选择最佳答案之前,我会等待看看是否有其他解决方案的答案,但这非常感激! - no.
@HelloJoe - 是的,我注意到在切换键组合时的行为不够流畅。我不确定为什么会发生这种情况。如果你找到了解决方法,请发布出来,因为我很想看看! - mrtsherman
我会的 :) 这很奇怪,因为如果你刷新并同时按下 S 和 D 键,然后释放 S(保持 D 按下),它将平稳地继续从下/右移动到仅向右移动。但是之后就有延迟了。我想这可能与 keyup 有关,它会自行删除。虽然我不完全确定,但我会继续尝试,玩弄它很有趣哈哈。 - no.

3

这看起来很有趣,将来肯定会派上用场,感谢Jleagle :) - no.

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