Объект внутри ListA, Список внутри ObjectB, ObjectB внутри ListC

#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);
    }
 });
  

Теперь каждый маркер может обрабатываться самостоятельно, поскольку он знает, к какому проигрывателю он относится, и вы можете избежать всего этого вложения игроков и маркеров