我正在用一个简单的碰撞检测系统编写一个简单的游戏。
我目前有这个代码用于在同一个数组上迭代数组,所以我可以检查对象是否彼此接近以及它们是否会发生碰撞:
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
}
}
}
&#13;
但这段代码的主要问题是我有重复。 例如,我检查我和一个但稍后我检查a和i具有相同的值。
我尝试使用一个数组来保存哪些对象与哪些对象一起检查,但它给了我一个很大的fps下降。
这样做的最佳方法是什么?
答案 0 :(得分:7)
在第一个for
循环的当前位置开始第二个for
循环:
for(i=0;i<objects.length;i++){
for(a=i+1;a<objects.length;a++){
//collision handling
}
}
这样,您只能针对当前项目前面的项目检查数组中的每个项目。
让我们检查您的原始代码:
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]);
}
}
}
现在,让我们检查一下我的例子:
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]);
}
}
一般的想法是仅将每个项目与数组中遵循的项目进行比较:
[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]
答案 1 :(得分:1)
如果您可以使用ES2015,Set
仅允许该集的唯一成员。来自MDN:
Set对象允许您存储任何类型的唯一值,无论是原始值还是对象引用。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
[...new Set(objects)]