2016-02-04 2 views
2

Я использую объект для записи того, какие клавиши со стрелками нажаты на экземпляр. Удерживая нажатой кнопку left, если я затем также задержу right, то остановитесь, удерживая left, моя функция keydown по-прежнему работает, но если я сделаю ту же настройку, но остановись, удерживая right, функция прекратится.Keydown stopping

Вот функции:

var keys = {}; 

$(document).keydown(function(e){ 
    keys[e.which] = true; 
    console.log('h'); 
    moveBall(); 

}); 

$(document).keyup(function(e){ 
    console.log(e.which); 
    delete keys[e.which]; 
}); 

function moveBall(){ 
    var vals = []; 
    var ball = $("#ball1"); 
    var up = false; 
    var down = false; 
    var left = false; 
    var right = false; 
    for(var key in keys) { 
     if (keys.hasOwnProperty(key)) { 
      vals.push(key); 
     } 
    } 
    if ($.inArray("39", vals)> -1) right = true; // Right 
    if ($.inArray("37", vals)> -1) left = true; 
    if ($.inArray("38", vals)> -1) up = true; 
    if ($.inArray("40", vals)> -1) down = true; 


} 

Может кто-то пожалуйста, объясните, почему упорядоченность, когда я перестану нажатием клавиши изменения ли еще работает функция keydown?

+0

Мне непонятно, что вы пытаетесь сделать. Событие keydown останавливается после того, как «h» записывается в консоль независимо от того, какая клавиша нажата. Это потому, что это просто конец функции. – Roboroads

+0

Я пытаюсь сделать так, чтобы функция выполнялась, если нажата хотя бы 1 клавиша – MarksCode

+0

Какая функция? Пожалуйста, напишите более полный код :) – Roboroads

ответ

3

Итак, вы пытаетесь выполнить цикл «moveBall» и, таким образом, действия, в зависимости от того, какая клавиша нажата.

Я немного поменяю вашу логику.

//Global object for what keys are active right now. 

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

$(document).keydown(function(e){ 
    // Set the right direction = true 
    if (e.which == "39") keysBeingPressed.right = true; 
    if (e.which == "37") keysBeingPressed.left = true; 
    if (e.which == "38") keysBeingPressed.up = true; 
    if (e.which == "40") keysBeingPressed.down = true; 
}); 

$(document).keyup(function(e){ 
    // Set the right direction = false 
    if (e.which == "39") keysBeingPressed.right = false; 
    if (e.which == "37") keysBeingPressed.left = false; 
    if (e.which == "38") keysBeingPressed.up = false; 
    if (e.which == "40") keysBeingPressed.down = false; 
}); 



function moveBall(){ 
    var ball = $("#ball1"); 

    // Going left is decreasing X, right is increasing X. 
    // Going up is decreasing Y, down increases Y. 
    // So, up+left, is diagonal, you move x and y both.. 
    var movement = { 
     x: 0, 
     y: 0 
    } 

    if(keysBeingPressed.right) movement.x++; 
    if(keysBeingPressed.left) movement.x--; //If left+right; x = 1 - 1 = 0 so no movement. 
    if(keysBeingPressed.up) movement.y--; 
    if(keysBeingPressed.down) movement.y++; 

    // add your movement in x/y to top/left 
    ball.css({ 
     top: "+="+movement.y, //+= adds the value 
     left: "+="+movement.x 
    }); 
} 

// Loop this function, you want it to run every "animation frame" 
setInterval(function(){ 
    moveBall(); 
}, 10); 

Я сделал добавить код для перемещения мяча.

+0

Вау, мне нравится, как есть много способов решить проблему, но с помощью опыта можно найти оптимальный способ написать решение. Ваша помощь действительно стала для меня впечатляющим опытом, что, если я буду придерживаться кодирования в течение долгого времени, в конечном итоге, я смогу увидеть различные перспективы того, как что-то делать. – MarksCode

+0

Рад, что я мог бы помочь и вдохновить вас :) – Roboroads

+0

@ Роботы с умным решением) Как насчет «Может ли кто-нибудь объяснить, почему заказ, когда я перестаю нажимать клавиши, меняет, продолжает ли работать функция keydown?» ОП спрашивает? –