Почему CraftyJS/Chrome ограничивает количество одновременных нажатий клавиш?

Я пытаюсь разработать игру с использованием CraftyJS. я использую

  • Лукавый 0.7.1
  • Chrome 50.0.2661.94
  • Windows 10
  • 2016 Dell XPS15.

Я заметил некоторые странности в том, как обрабатываются события клавиатуры. Я предполагаю, что многое из этого связано с Chrome или, возможно, даже с моей физической клавиатурой, и что Crafty важен только потому, что я использую его API.

Во-первых, вот мой SSCCE. Этот код добавляет ключ в массив ключей при его нажатии, удаляет его при отпускании и выходит из массива каждую секунду.

<!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] Но ВЛЕВО ВПРАВО приводит к: [37, 39, 40]

Что на земле с этим? Я предполагаю, что кто-то между моими пальцами и моим JS пытается ловко исправить ошибочные нажатия клавиш (опечатки), но я не знаю, кто, и я не знаю, какие правила управляют этим.

РЕДАКТИРОВАТЬ: я подозреваю, что это сама моя клавиатура (или ОС) не в состоянии отправлять эти события клавиатуры. Но я все еще ищу хороший способ подтвердить это.

1 ответ

Решение

Как выяснил @David, проблема называется ореолом клавиатуры:

"Ghosting" - это проблема, связанная с тем, что некоторые клавиши клавиатуры не работают при одновременном нажатии нескольких клавиш. Говорят, что нажатия клавиш, которые не отображаются на компьютере или исчезли,"призраки". На большинстве клавиатур, даже на тех, которые явно продаются как "Анти-Ghosting", это происходит со многими тремя комбинациями клавиш. Представьте, что вы играете в свою любимую видеоигру и не можете, скажем, бегать по диагонали и одновременно стрелять из своего оружия (скажем, одновременно нажимая a, w и g). Это результат внутреннего дизайна большинства существующих клавиатур...

Поскольку не у каждого потребителя есть игровая клавиатура (которая особенно не страдает от этой проблемы), я думаю, единственное, что вы можете сделать, - это создать свою игру, не требуя одновременного нажатия трех или более клавиш.

Другие вопросы по тегам