为什么CraftyJS/Chrome限制同时按键事件的数量
Why does CraftyJS/Chrome limit the number of concurrent key press events?
我正在尝试使用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)。这是大多数现有键盘内部设计的结果。。。
由于不是每个消费者都有游戏键盘(尤其是不会遇到这个问题),我想你唯一能做的就是设计你的游戏,不需要同时按下三个或更多的键。
- 分派点击事件并保留击键修饰符
- 模糊事件的Javascript测试
- keyup事件处理程序更改焦点不适用于快速键入
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 如何使Javascript动态html表及其上的事件
- 使用类从一个标记中双击事件
- 如何在未直接触发的情况下停止事件
- 如何在elfinder插件(一个文件管理器插件)上获得上传前事件
- 对iPad上的点击事件反应缓慢
- 事件和状态
- Fancybox是否将Click事件静音
- 主干-不管怎样,检查事件以前是否绑定过
- 从控制器返回后Ajax启动事件激发
- 如何从画布上的某个移动事件中获取X和Y
- Jquery:未触发select事件
- JsFiddle上的鼠标事件不起作用
- 只覆盖箭头键滚动事件
- $window.ga在AngularJS事件中未定义
- cron作业与Javascript计时事件
- 为什么CraftyJS/Chrome限制同时按键事件的数量