我遇到了问题,我不明白为什么。任何帮助将不胜感激。
我正在制作我的小引擎,也许是为了一些小游戏。我目前已经为2名玩家设置了它,但我希望将来可以添加更多玩家。我遇到的问题是控件(箭头)仅适用于播放器1.我有播放器2的WSAD,但这不起作用。我已经尝试过调试它,改变它等等。并且无法弄清楚问题。
以下是密钥记录代码:
//========== 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 :(得分: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
被推了。此代码遍历播放器列表,从播放器1开始(currentPlayer.id
为0)。假设最初pressedKeys
为空。由于w
被按下,pressedKeys[87]
被设置为指向此新间隔的指针,该间隔每0毫秒运行Move
。
所以Move
运行。但是,您已在Move
:
if(checkId == 0) ...
由于'w'仅对玩家2有效(checkId
为1),所以没有任何反应,Move
会返回。
然后我们回到你的$.each
。现在我们开始使用Player 2.然而,我们达到了这个目标:
if (!pressedKeys[e.which]) ...
但pressedKeys[87]
已设定。什么都没发生,但它确定了。所以程序会跳过这一步并继续前进。因此,玩家2的任何动作都不会起作用。
你可以这样做:
添加一个数组,其中包含对每个玩家有效的键。在执行if (!pressedKeys[e.which])
之前,请检查已按下的键是否有效:
if (validkeys[currentPlayer.id].indexOf(e.which) == -1) return true;