在没有重复的数组上迭代数组

rut*_*ydm 3 javascript arrays iteration loops game-engine

我正在用简单的碰撞检测系统编写一个简单的游戏.

我目前有这个代码用于在同一个数组上迭代数组,所以我可以检查对象是否彼此接近以及它们是否会发生冲突:

var objects = []; //assume this is not empty


for(i=0;i<objects.length;i++){
  for(a=0;a<objects.length;a++){
    if(a != i){
      //collision handling
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是这段代码的主要问题是我有重复.例如,我检查我和一个但稍后我检查a和i具有相同的值.

我尝试使用一个数组来保存检查哪些对象与哪些对象,但它给了我一个大的fps下降.

这样做的最佳方法是什么?

Dek*_*kel 7

for在第一个for循环的当前位置开始第二个循环:

for(i=0;i<objects.length;i++){
    for(a=i+1;a<objects.length;a++){
      //collision handling
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,您只能针对当前项目前面的项目检查阵列中的每个项目.

让我们检查您的原始代码:

objects = ['a', 'b', 'c']
for(i=0;i<objects.length;i++){
  for(a=0;a<objects.length;a++){
    if(a != i){
      console.log("Checking "+ objects[i]+ "vs. "+objects[a]);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,让我们看一下我的例子:

objects = ['a', 'b', 'c']
for(i=0;i<objects.length;i++){
  for(a=i+1;a<objects.length;a++){
    console.log("Checking "+ objects[i]+ "vs. "+objects[a]);
  }
}
Run Code Online (Sandbox Code Playgroud)

一般的想法是仅将每个项目与数组中遵循的项目进行比较:

[a, b, c, d]
 a => vs b, c, d    ar[0] vs ar[1], ar[2], ar[3]
    b => vs c, d    ar[1] vs        ar[2], ar[3]
       c => vs d    ar[2] vs               ar[3]
Run Code Online (Sandbox Code Playgroud)