1

I have a problem, and I have no idea why. Any help would be appreciated.

I am making my little engine, maybe for some little game. I have it currently set up for 2 players, but I want to be able to add more in future. The problem I have is that controls (arrows) work only for player 1. I have WSAD for player2, but that does not work. I have tried debugging it, changing it etc. .. and cant figure out the problem.

Here is the key-logging code:

//========== 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]; } }); 
1
  • What does playerList look like? Commented Jun 30, 2013 at 21:30

1 Answer 1

3

The answer to your specific problem lies here:

$.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); } }); 

Let's say w is pushed. This code iterates through the player list, beginning with Player 1 (currentPlayer.id is 0). Let's say that initially pressedKeys is empty. Since w was pressed, pressedKeys[87] is set to be a pointer to this new interval, which runs Move every 0 milliseconds.

So Move runs. However, you have this check in Move:

if(checkId == 0) ... 

Since 'w' is only valid for Player 2 (checkId is 1), nothing happens and Move returns.

Then we go back to your $.each. Now we get to work with Player 2. However, we reach this:

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

But pressedKeys[87] is already set. Nothing happened, but it was set. So the program skips over this step and moves on. Hence, none of Player 2's actions will ever work.

You could do something like this:

Add an array with the keys that are valid for each player. Before doing if (!pressedKeys[e.which]), check if the key that has been pressed is valid:

if (validkeys[currentPlayer.id].indexOf(e.which) == -1) return true; 
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks very much, I see the problem now. What else do you not like / would you change there?