2013-06-30 2 views
1

У меня проблема, и я понятия не имею, почему. Любая помощь будет оценена по достоинству.jQuery - keyDown

Я делаю свой маленький двигатель, возможно, для небольшой игры. В настоящее время я настроен для 2 игроков, но я хочу иметь возможность добавлять в будущем. Проблема в том, что элементы управления (стрелки) работают только для игрока 1. У меня есть WSAD для player2, но это не работает. Я попытался отладить его, изменив его и т. Д .. и не могу понять проблему.

Вот код ключа регистрации:

//========== KEY LOGGING ========== 
var pressedKeys = []; 
//declare as globals coz of debug 
var x; 
var y; 
var x2; 
var y2; 

function moveLeft(checkId, checkX, checkY, cSize, cSpeed, cKey) { 
    if (x > 0) { 
    playerList[checkId].x = checkX - cSpeed; 
    } else { 
    playerList[checkId].x = 0; 
    } 
} 
function moveUp(checkId, checkX, checkY, cSize, cSpeed, cKey) { 
    if (y > 0) { 
    playerList[checkId].y = checkY - cSpeed; 
    } else { 
    playerList[checkId].y = 0; 
    } 
} 
function moveRight(checkId, checkX, checkY, cSize, cSpeed, cKey) { 
    if (x2 < width) { 
    playerList[checkId].x = checkX + cSpeed; 
    } else { 
    playerList[checkId].x = width - cSize; 
    } 
} 
function moveDown(checkId, checkX, checkY, cSize, cSpeed, cKey) { 
    if (y2 < height) { 
    playerList[checkId].y = checkY + cSpeed; 
    } else { 
    playerList[checkId].y = height - cSize; 
    } 
} 
function Move(checkId, checkX, checkY, cSize, cSpeed, cKey) { 
    x = checkX - cSpeed; 
    y = checkY - cSpeed; 
    x2 = checkX + cSize + cSpeed; 
    y2 = checkY + cSize + cSpeed; 
    //player 1 
    if(checkId == 0) { 
    switch (cKey) { 
     case 37: 
     // left 
     moveLeft(checkId, checkX, checkY, cSize, cSpeed, cKey); 
     break; 
     case 38: 
     // up 
     moveUp(checkId, checkX, checkY, cSize, cSpeed, cKey); 
     break; 
     case 39: 
     // right 
     moveRight(checkId, checkX, checkY, cSize, cSpeed, cKey); 
     break; 
     case 40: 
     // down 
     moveDown(checkId, checkX, checkY, cSize, cSpeed, cKey); 
     break; 
     default: 
     return; // exit this handler for other keys 
    } 
    } 
    //player 2 
    if(checkId == 1) { 
    switch (cKey) { 
     case 65: 
     // left - A 
     moveLeft(checkId, checkX, checkY, cSize, cSpeed, cKey); 
     break; 
     case 87: 
     // up - W 
     moveUp(checkId, checkX, checkY, cSize, cSpeed, cKey); 
     break; 
     case 68: 
     // right - D 
     moveRight(checkId, checkX, checkY, cSize, cSpeed, cKey); 
     break; 
     case 83: 
     // down - S 
     moveDown(checkId, checkX, checkY, cSize, cSpeed, cKey); 
     break; 
     default: 
     return; // exit this handler for other keys 
    } 
    } 
} 

// == KEYDOWN == 
$(document.body).keydown(function (e) { 
    e.preventDefault(); 
    //go through all players 
    $.each(playerList, function (i, currentPlayer) { 
    if (!pressedKeys[e.which]){ 
     //set interval for the function 
     pressedKeys[e.which] = setInterval(function(){ 
     Move(currentPlayer.id, currentPlayer.x, currentPlayer.y, currentPlayer.size, currentPlayer.speed, e.which) 
     }, 0); 
    } 
    }); 
    //+ 
    if (pressedKeys[107]) { 
    currentPlayer.speed += 1; } 
    // - 
    if (pressedKeys[109] && currentPlayer.speed > 1) { 
     currentPlayer.speed -= 1; 
    } 
    //addplayer 
    if (pressedKeys[80]) { 
     addPlayer("red", size, width/2 + id * size, height/2 + id * size); 
    } 
    }); 
    // == KEYUP == 
    $(document.body).keyup(function (e) { 
    if (pressedKeys[e.which]){ 
     clearInterval(pressedKeys[e.which]); 
     delete pressedKeys[e.which]; 
    } 
    }); 
+0

Как выглядит плеерList? – musicnothing

ответ

3

Ответ на вашу конкретную проблему лежит здесь:

$.each(playerList, function (i, currentPlayer) {    
    if (!pressedKeys[e.which]){ 
    //set interval for the function 
    pressedKeys[e.which] = setInterval(function() { 
     Move(currentPlayer.id, currentPlayer.x, currentPlayer.y, currentPlayer.size, currentPlayer.speed, e.which); 
    }, 0); 
    } 
}); 

Скажет w выталкиваются. Этот код повторяется через список игроков, начиная с Player 1 (currentPlayer.id равен 0). Предположим, что изначально pressedKeys пуст. Так как w был нажат, pressedKeys[87] установлен в качестве указателя на этот новый интервал, который запускается Move каждые 0 миллисекунд.

Move работает. Тем не менее, у вас есть этот чек в Move:

if(checkId == 0) ... 

С «ш» справедливо только для игрока 2 (checkId не 1), ничего не происходит, и Move возвращается.

Затем мы возвращаемся к вашему $.each. Теперь мы перейдем к работе с игроком 2. Тем не менее, мы достигаем этого:

if (!pressedKeys[e.which]) ... 

Но pressedKeys[87] уже установлен. Ничего не случилось, но оно было установлено. Таким образом, программа пропускает этот шаг и движется дальше. Следовательно, ни один из действий игрока 2 никогда не будет работать.

Вы могли бы сделать что-то вроде этого:

Добавить массив с ключами, которые действительны для каждого игрока. Прежде чем делать if (!pressedKeys[e.which]), проверьте, действительно ли нажатый ключ действителен:

if (validkeys[currentPlayer.id].indexOf(e.which) == -1) return true; 
+0

Большое спасибо, я вижу проблему сейчас. Что еще вам не нравится/вы бы там изменились? –

+0

См. Мое последнее изменение. – musicnothing

Смежные вопросы