У меня проблема, когда кажется, что я перезаписываю индексы массива после объединения, по крайней мере, я так думаю.Это небольшая игра, созданная с использованием Phaser 2. По сути, это всего лишь небольшая многопользовательская игра с прыжками, чтобы получить опыт работы с архитектурой клиент / сервер.Использовали socket.io и express.Кажется, моя проблема на сервере, где, когда клиент отключается, когда его удаляют из списка игроков, другой игрок, все еще находящийся в игре, кажется, перезаписывает индекс игрока, который отключился.Для отладки этого я в основном использовал консольные журналы, используя цикл for, чтобы перебрать список и распечатать идентификаторы сокетов плеера.Так, например, если я присоединяюсь к игроку 1 с идентификатором гнезда 1, присоединяется игрок 2 с идентификатору гнезда 2, а затем игрок 2 уходит, цикл for выводит 1, 1. Если после игрока присоединяется новый игрок 3 с идентификатором гнезда 32 осталось, распечатка идентификаторов игроков выведет 1, 1, 3. Сначала я подумал, что проблема в том, что в функции onNewPlayer (data) у меня возникла проблема с алиасингом, потому что я использовал var currentInfo в двухв разных местах, поэтому я изменил второй объект на var info.Кажется ли, что это какая-то проблема с псевдонимами, или я должен искать эту проблему где-то еще?Я могу предоставить дополнительный код при необходимости, пока все наши обратные вызовы для создания и перемещения игроков работали нормально.Благодарю.
ниже - соответствующий код на стороне сервера
var players[];
//When a new player is made, save it
function onNewPlayer(data) {
var newPlayer = new Player(data.x, data.y, this.id);
var currentInfo = {
x: newPlayer.x,
y: newPlayer.y,
id: newPlayer.id,
};
for(i = 0; i < players.length; i++) {
//broadcast the new player out to all the other players in the list
this.broadcast.emit("newEnemy", currentInfo);
}
//check for if there are already players,
//if so, send the player's who are already in the game to the new player
if(players.length > 0) {
for(i = 0; i < players.length; i++) {
var info = {
x: players[i].x,
y: players[i].y,
id: players[i].id,
};
this.emit("newEnemy", info);
}
}
players.push(newPlayer);
for(i = 0; i < players.length; i++) {
console.log(players[i].id);
}
}
function onDisconnect(){
console.log("User " + this.id + " disconnected");
//find the user in the list of players and remove them, then tell the client
for(i = 0; i < players.length; i++) {
if(players[i].id === this.id) {
console.log("removing this player " + this.id);
//TODO trying a different broadcast
this.broadcast.emit("playerDisconnect", this.id);
console.log(players[i].id);
players.splice(i, 1);
}
}
}
ниже - соответствующий код на стороне клиента
//We've lost connection with the server!
function onSocketDisconnect() {
console.log("Lost connection with server!");
};
//When the server notifies the client an enemy has disconnected,
//search for it in the enemies list and stop rendering it
function onEnemyDisconnect(data) {
//TODO
for(i = 0; i < enemies.length; i++) {
if(enemies[i].id == data) {
//TODO
console.log("destroying");
enemies[i].destroy();
enemies.splice(i, 1);
}
}
}