Массив [объект] как атрибут в проблеме рекурсии объектов (p5. js)? - PullRequest
3 голосов
/ 19 июня 2020

Я делаю небольшую 2D-игру на p5. js и у меня есть этот класс Player, который ... является игроком (сюрприз: D) (Код упрощен)

class Player{

constructor(x,y){
   this.x = x;
   this.y = y;

  }
}

И они Плеер хранится в глобальном массиве. Массив также содержит другие объекты игроков.

let globalPlayers = [new Player(0,0), new Player(0,0), new Player(0,0), new Player(0,0)]

Чтобы все игроки могли столкнуться друг с другом, каждый игрок должен знать каждого игрока.

Следовательно, у каждого игрока есть метод, обновляющий копию глобального массива игроков.

class Player{

constructor(x,y){
   this.x = x;
   this.y = y;
   this.otherPlayer;
  }

  update(otherPlayers){
    this.otherPlayer = otherPlayers;
  }
}

Я постоянно обновляю этот конкретный массив для каждого игрока в массиве.

function draw() {
  for(let i = 0; i < globalPlayers.length; i++){
   globalPlayers[i].update(globalPlayers);
 }
}

Проблема в том, что массив внутри объектов player становится рекурсивным. Потому что у каждого игрока есть массив с игроками. У каждого игрока в этом массиве есть массив со всеми игроками и так далее ...

Мой вопрос: как я могу улучшить его производительность? Могу ли я каким-то образом предотвратить это?

Я знаю, что можно просто передать массив globalPlayer в методы Player, когда они мне действительно нужны (например, Player.checkCollision (globalPlayers)). Но мне нужно, чтобы массив постоянно обновлялся внутри самого объекта.

Заранее спасибо :)

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Делая это: this.otherPlayer = otherPlayers вы постоянно переназначаете this.otherPlayer на otherPlayers как ссылку (не копию значений), так что это то же самое, как если бы вы сделали это только один раз.

Ваша реализация Player.checkCollision(globalPlayers) может просто получить доступ к самой globalPlayers:

Player.prototype.checkCollision = function() {
    const otherPlayers = globalPlayers.filter(x => x !== this);
    const radius = 10;
    for(otherPlayer of otherPlayers) {
        if(Math.sqrt((this.x - otherPlayer.x) ** 2 + (this.y - otherPlayer.y) ** 2) < radius) {
            console.log('Collision!');
        }
    }
}
1 голос
/ 19 июня 2020

Вот пример . Вам не нужно постоянно переназначать массивы. Просто передайте глобальный массив в качестве ссылки один раз каждому игроку.

В скетче каждый игрок dr aws имеет длину своего собственного массива this.otherPlayers. Когда вы нажимаете мышку, новый игрок добавляется на холст и в массив globalPlayers. Вы можете видеть, что другие игроки также имеют доступ к новому игроку (длина их массива this.otherPlayers увеличивается на единицу).

...