我有一个循环来检查游戏中对象之间的碰撞,所有对象都收集在同一个数组中。我使用这样的代码来匹配每个对象:
for (var i = 0; i < objs.length; i++) {
for (var j = i + 1; j < objs.length; j++) {
collision(objs[i], objs[j]);
}
}
现在这似乎并没有实现与彼此的所有碰撞,我注意到它也跳过了一些......
然后我提出了这个解决方案:
for (var i = 0; i < objs.length; i++) {
for (var j = 0; j < objs.length; j++) {
if (j != i) {
collision(objs[i], objs[j]);
}
}
}
这个解决方案似乎没有任何问题,但我想知道是否有任何方法可以不使用if (j != i)
语句,或者是否有完全不同的解决方案?
答案 0 :(得分:1)
Soo,谁是正确的......?
这取决于游戏中 collision 的定义。
如果collision
是symmetric function(例如,当A与B碰撞时,A与B发生碰撞),请使用:
for (var i = 0; i < objs.length; i++) {
for (var j = i + 1; j < objs.length; j++) {
collision(objs[i], objs[j]);
}
}
因为如果您之前检查过(A,B),则无需检查(B,A)。
但是如果可以使A与B发生碰撞而不使B与A发生碰撞,反之亦然,那么你必须检查所有可能的不同对,所以使用
for (var i = 0; i < objs.length; i++) {
for (var j = 0; j < objs.length; j++) {
if (j != i) {
collision(objs[i], objs[j]);
}
}
}