#javascript #arrays #sockets #websocket
#javascript #массивы #сокеты #websocket
Вопрос:
Я создаю сокет.игра ввода-вывода и хранение маркированных данных становятся для меня проблемой. Как мне поместить маркированный объект внутри списка маркированных объектов, который находится внутри объекта, который находится внутри списка всех основных объектов.
Серверный код:
var Player = function(id) {
var self = {
canshot: false,
bullets: []
}
}
socket.on('shoot', function(data){
if(player.canshot){
console.log("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
Комментарии:
1. я бы сказал, плохой дизайн. лучше использовать другую структуру данных, которая лучше подходит. Например, иметь список игроков и список маркеров или sth вдоль этих строк
2. @NikosM. Как бы я увидел, какой маркер подключен к какому проигрывателю?
3. у вас может быть структура данных сопоставления между идентификатором игрока и идентификатором маркера или что-то еще в этих строках
4. @NikosM. У меня нет большого опыта работы с Js, поэтому я не знаю, что вы подразумеваете под структурой данных сопоставления.
5. Я имею в виду способ избежать всей этой вложенности. Структура данных mappinfg — это просто объект, который сопоставляет идентификаторы маркеров с идентификаторами игроков, например,
{'bullet1':'player1','bullet2':'player2'}
и так далее. это просто способ сгладить всю эту вложенность. или что-то в этом роде
Ответ №1:
Следуя рассуждениям, которые я изложил в своих комментариях, ваш код может быть переработан до sth следующим образом, чтобы помочь вам решить эту проблему вложенности:
// 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.log("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);
}
});
Теперь каждый маркер может обрабатываться самостоятельно, поскольку он знает, к какому проигрывателю он относится, и вы можете избежать всего этого вложения игроков и маркеров