为什么CraftyJS/Chrome限制同时按键事件的数量

Why does CraftyJS/Chrome limit the number of concurrent key press events?

本文关键字:事件 CraftyJS Chrome 为什么      更新时间:2023-09-26

我正在尝试使用CraftyJS开发一款游戏。我正在使用

  • 巧夺天工0.7.1
  • 铬50.0.2661.94
  • Windows 10
  • 一款2016款戴尔XPS15

我注意到键盘事件的处理方式有些奇怪。我猜这在很大程度上与Chrome有关,甚至可能我的物理键盘,而Crafty只在我使用它的API。

首先,这是我的SSCCE。此代码在按键时向keys数组添加一个键,在释放时将其删除,并每秒注销该数组。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>keyTest</title>
    <script src="../crafty.js"></script>
    <script>
        window.onload = function(){
            Crafty.init(window.innerWidth, window.innerHeight, document.getElementById('game'));
            var keys = [];
            var keyDown = function(e){
                console.log("KeyDown " + e.key);
                keys.push(e.key);
            };
            var keyUp = function(e){
                console.log("KeyUp " + e.key);
                keys.splice(keys.indexOf(e.key), 1);
            };
            Crafty.e("Keyboard").bind("KeyUp", keyUp).bind("KeyDown", keyDown);
            Crafty.e("Delay").delay(function(){console.log(keys)}, 1000, -1);
        };
    </script>
</head>
<body>
<div id="game"></div>
</body>
</html>

我注意到一些奇怪的行为:

  • 首先,看起来Crafty一次只能识别四个字母的按键,除非它们可以用右手和左手打字。例如,一次按住ASDFE会导致:[65, 83, 68, 70]无论我怎么敲击E键,它都无法识别。但是,例如,如果我按住ASDFJKL,那么我会看到:[65, 83, 68, 70, 74, 75, 76]

  • 除非第三个是向下箭头,否则一次只能识别两个箭头键。例如,按LEFT、UP、RIGHT会产生:[37, 38],但LEFT DOWN RIGHT会导致:[37, 39, 40]

这到底是怎么回事?我的猜测是,有人在我的手指和JS之间试图巧妙地纠正错误的按键(打字错误),但我不知道是谁,也不知道是什么规则控制着这一点。

编辑:我怀疑是我的键盘本身(或操作系统)无法发送这些键盘事件。但我仍在寻找一个好方法来证实这一点。

@David已经发现,这个问题被称为键盘重影:

"重影"是指同时按下多个键时,某些键盘键无法工作的问题。那些没有出现在电脑上或似乎已经消失的按键被称为"重影"。在大多数键盘上,即使是一些明确宣传为"防鬼"的键盘,这种情况也会发生在许多三键组合中。想象一下,在玩你最喜欢的电子游戏时,不能,比如说,对角跑,同时开枪(比如同时按a、w和g)。这是大多数现有键盘内部设计的结果。。。

由于不是每个消费者都有游戏键盘(尤其是不会遇到这个问题),我想你唯一能做的就是设计你的游戏,不需要同时按下三个或更多的键。