Array[Object] as attribute in Object recursion problem(p5.js)?

Array[Object] as attribute in Object recursion problem(p5.js)?

我正在 p5.js 制作一个 2D 小游戏,我有这个玩家 class,它是一个玩家(惊喜 :D) (代码已简化)

class Player{

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

  }
}

并且他们的 Player 存储在一个全局数组中。该数组还包含其他播放器对象。

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

问题是玩家对象中的数组是递归的。因为每个玩家都有一个玩家数组。该数组的每个玩家都有一个包含所有玩家的数组,依此类推...

我的问题是:如何提高它的性能?我能以某种方式阻止这种情况发生吗?

我知道在我真正需要时将 globalPlayer 数组传递给 Player 的方法的方法。(例如 Player.checkCollision(globalPlayers))。但是我需要在对象本身内不断更新数组。

提前致谢:)

通过这样做:this.otherPlayer = otherPlayers 您不断地将 this.otherPlayer 重新分配给 otherPlayers 作为 reference(不是值的副本)所以就跟只做一次一样。

您的 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!');
        }
    }
}

Here就是一个例子。您不必继续重新分配数组。只需将全局数组作为参考一次传递给每个玩家。

在草图中,每个玩家绘制自己的 this.otherPlayers 数组的长度。当您按下鼠标时,一个新玩家将添加到 canvas 和 globalPlayers 数组中。您可以看到其他玩家也可以访问新玩家(他们的 this.otherPlayers 数组的长度增加了一个)。