ObjectA внутри ListA, ListA внутри ObjectB, ObjectB внутри ListC

Я делаю игру 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

я бы сказал плохой дизайн. лучше использовать другую структуру данных, которая лучше подходит. Например, есть список игроков и список пуль или чего-то еще по этим линиям.

Nikos M. 30.03.2019 15:29

@НикосМ. Как я увижу, какая пуля связана с каким игроком?

user10925323 30.03.2019 15:30

у вас может быть структура данных сопоставления между идентификатором игрока и идентификатором пули или sth в этих строках

Nikos M. 30.03.2019 15:31

@НикосМ. У меня нет большого опыта работы с Js, поэтому я не знаю, что вы подразумеваете под структурой данных сопоставления.

user10925323 30.03.2019 15:32

Я имею в виду способ избежать всей этой вложенности. Структура данных mappingfg — это просто объект, который сопоставляет идентификаторы маркеров с идентификаторами игроков, например {'bullet1':'player1','bullet2':'player2'} и так далее. это просто способ сгладить всю эту вложенность. или что-то в этом роде

Nikos M. 30.03.2019 15:34

Например, я бы предложил создать еще один Class Bullet вместе с классом Player, теперь player.bullets будет иметь ссылки на экземпляры Bullet. Также Bullet.player будет иметь ссылку на экземпляр игрока, тогда вы сможете лучше с этим справиться, поскольку каждая пуля также знает, какому игроку она принадлежит, и может обмениваться информацией. Эта двойная ссылка, я думаю, поможет вам решить проблему.

Nikos M. 30.03.2019 15:39

@НикосМ. Я посмотрю.

user10925323 30.03.2019 15:39

также не используйте self в классе Player, как сейчас. self — глобальная переменная, лучше использовать this

Nikos M. 30.03.2019 15:41
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
8
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Следуя линии рассуждений, которые я выразил в своих комментариях, ваш код может быть преобразован в что-то вроде следующего, чтобы помочь вам решить эту проблему вложенности:

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

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

Другие вопросы по теме