Я делаю игру socket.io, и хранение данных о пулях становится для меня проблемой. Как поместить объект маркера в список объектов маркера, который находится внутри объекта, который находится внутри списка всех основных объектов.
Код сервера:
var Player = function(id) {
var self = {
canshot: false,
bullets: []
}
}
socket.on('shoot', function(data){
if (player.canshot){
console.info("FIre")
player.canshot = false
player.bullets.push({
xV:data.xVel,
yV:data.yVel,
x:data.x,
y:data.y
});
time = 1000/player.fireRate
setTimeout(() => {
player.canshot = true;
}, time);
}
});
//Sends data in loop
bullets:player.bullets,
canshot:player.canshot
Код клиента:
///When client recieves server info,
**ctx.fillText(player[i].bullets[data[i].bullets.length],10,20)**
Если вы хотите увидеть весь код, вы можете увидеть его здесь: https://repl.it/@Helixable/FireAway
@НикосМ. Как я увижу, какая пуля связана с каким игроком?
у вас может быть структура данных сопоставления между идентификатором игрока и идентификатором пули или sth в этих строках
@НикосМ. У меня нет большого опыта работы с Js, поэтому я не знаю, что вы подразумеваете под структурой данных сопоставления.
Я имею в виду способ избежать всей этой вложенности. Структура данных mappingfg — это просто объект, который сопоставляет идентификаторы маркеров с идентификаторами игроков, например {'bullet1':'player1','bullet2':'player2'} и так далее. это просто способ сгладить всю эту вложенность. или что-то в этом роде
Например, я бы предложил создать еще один Class Bullet вместе с классом Player, теперь player.bullets будет иметь ссылки на экземпляры Bullet. Также Bullet.player будет иметь ссылку на экземпляр игрока, тогда вы сможете лучше с этим справиться, поскольку каждая пуля также знает, какому игроку она принадлежит, и может обмениваться информацией. Эта двойная ссылка, я думаю, поможет вам решить проблему.
@НикосМ. Я посмотрю.
также не используйте self в классе Player, как сейчас. self — глобальная переменная, лучше использовать this



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Следуя линии рассуждений, которые я выразил в своих комментариях, ваш код может быть преобразован в что-то вроде следующего, чтобы помочь вам решить эту проблему вложенности:
// Player Class
function Player(id)
{
this.id = id;
this.canshot = false;
this.bullets = [];
this.fireRate = 100; // whatever
|
// Bullet class
function Bullet(player, xV,yV,x,y)
{
this.player = player;
this.xV = xV;
this.yV = yV;
this.x = x;
this.y = y;
}
// other code
socket.on('shoot', function(data){
if (player.canshot){
console.info("FIre")
player.canshot = false
var bullet = new Bullet(player, data.xVel, data.yVel, data.x, data.y);
player.bullets.push(bullet);
time = 1000/player.fireRate
setTimeout(() => {
player.canshot = true;
}, time);
}
});
Теперь каждую пулю можно обрабатывать отдельно, так как она знает, какому игроку она принадлежит, и вы можете избежать всей этой вложенности игроков и пуль.
я бы сказал плохой дизайн. лучше использовать другую структуру данных, которая лучше подходит. Например, есть список игроков и список пуль или чего-то еще по этим линиям.