Щелчок мыши иногда вызывает ввод с клавиатуры, как? - PullRequest
1 голос
/ 26 февраля 2012

Позвольте мне объяснить мою ситуацию ... Я делаю 2D платформерную игру, где вы можете ходить и снимать вещи. Для перемещения используются клавиши W, A и D, а съемка осуществляется с помощью мыши. Когда я выполняю все действия по отдельности, все работает, но когда я нажимаю кнопку мыши и одновременно нажимаю клавишу, мой код начинает работать так, как будто клавиша все еще нажата. Такое бывает только иногда.

Я регистрирую все события клавиатуры следующим образом:

<body onload="init()" onkeydown="press(event);" onkeyup="release(event);">

Вот скрипт, который обрабатывает это:

var KEY = {W: 87, A: 65, S:83, D: 68, E: 69};

var input = {
    right: false,
    up: false,
    left: false,
    down: false,
    e: false
};

function press(evt) {
    var code = evt.keyCode;

    switch(code) 
    {
        case KEY.W: input.up = true; break;
        case KEY.A: input.left = true; break;
        case KEY.S: input.down = true; break;
        case KEY.D: input.right = true; break;
        case KEY.E: input.e = true; break;
    }
}

function release(evt)
{
    var code = evt.keyCode; 
    input.code = code;

    switch(code) 
    {
        case KEY.W: input.up = false; break;
        case KEY.A: input.left = false; break;
        case KEY.S: input.down = false; break;
        case KEY.D: input.right = false; break;        
        case KEY.E: input.e = false; break;
    }
}

Даже когда я не регистрирую события мыши, такое случается. Может кто-нибудь объяснить, почему? И как мне это исправить?

1 Ответ

1 голос
/ 26 февраля 2012

EDITED

Кажется, что отрывистое поведение не случайно.Если нажать и удерживать left, а затем нажать up и отпустить left, движение продолжится.Но если через некоторое время вы отпустите up, движение остановится.То есть.вы можете делать непрерывные круговые движения, но вы не можете вернуться к первоначальному направлению.Это, возможно, связано с процессом обработки событий, использующим сохранение типа стека для вызовов событий и их точек возврата.

Ниже приведен пример кода, который добивается цели.Он использует клавиши со стрелками для перемещения пятна.Код находится в глобальном пространстве для ясности и сделан только для IE, но вы просто редактируете его, как хотите.

<html>
<head>
<script>
function move(elem){
    if(i[37])elem.style.left=elem.style.pixelLeft-2;
    if(i[38])elem.style.top=elem.style.pixelTop-2;
    if(i[39])elem.style.left=elem.style.pixelLeft+2;
    if(i[40])elem.style.top=elem.style.pixelTop+2;
    return;
}   

function keyDn(){
    var key=window.event.keyCode;
    if(i[key]!==undefined) i[key]=true;
    return;
}

function keyUp(){
    var key=window.event.keyCode;
    if(i[key]!==undefined) i[key]=false;
    return;
}

window.onload=function (){
    spot=document.getElementById('movablespot');
    i={'37':false,'38':false,'39':false,'40':false};
    document.body.onkeydown=keyDn;
    document.body.onkeyup=keyUp;    
    a=setInterval(function (){move(spot);return;},5);
}    
</script>
</head>
<body>
<span id="movablespot" style="position:absolute;top:100px;left:100px;">O</span>
</body>
</html>
...