В моей игре я использую прослушиватели событий keyup
и keydown
для отслеживания нажатых клавиш (this.input
— это ссылка на функцию Input
ниже):
$(document.body).on('keydown', this.input.keyPress.bind(this.input));
$(document.body).on('keyup', this.input.keyPress.bind(this.input));
Все работает как положено, пока не нажму сразу 2 клавиши. Левая клавиша перемещает игрока влево, клавиша Shift стреляет из оружия. По отдельности работают нормально. Однако, если обе кнопки одновременно нажаты и удерживаются, игрок стреляет дважды.
Вот код, который я использую для обработки входных данных (для краткости удалены другие ключевые события)
shootSpecial
следует вызывать только один раз, так как keyMap.shift
является только true
на keydown
. После срабатывания keyup
устанавливается значение false
: keyMap[key] = e.type === 'keydown';
var Input = function () {
var keyMap = {};
this.handleKeyPress = function () {
if (keyMap.arrowleft === true) {
game.player.moving.left = true;
} else if (keyMap.shift === true) {
game.player.shootSpecial();
}
};
this.keyPress = function (e) {
var key = e.key.toLowerCase();
if (key === ' ') {
key = 'space';
}
keyMap[key] = e.type === 'keydown';
console.log(key, keyMap[key]);
this.handleKeyPress();
};
};
console.log
сообщает, что left и shift равны true
на keydown
, а затем оба false
на keyup
, так что я не совсем уверен, почему событие shootSpecial
будет запускаться дважды.
var keyMap = {};
var handleKeyPress = function () {
if (keyMap.arrowleft === true) {
console.log('left');
} else if (keyMap.shift === true) {
console.log('shift');
}
};
var keyPress = function (e) {
var key = e.key.toLowerCase();
keyMap[key] = e.type === 'keydown';
if (document.getElementById(key))
document.getElementById(key).innerText = e.type === 'keydown';
handleKeyPress();
}
document.addEventListener('keydown', keyPress);
document.addEventListener('keyup', keyPress);
LEFT:<div id="arrowleft">false</div>
SHIFT:<div id="shift">false</div>
Как видно по скрипке, одно событие вызывается дважды.