我正在开发一个游戏,其中每个对象都应检查它是否与任何其他对象发生碰撞。我有一个所有对象的清单,还有一个函数可以确定两个对象是否碰撞并销毁它们。我当前使用的方法效率很低。
for i in list1:
for j in list1:
if collide(i, j):
i.kill()
j.kill()
最初,两个对象被杀死后,我将它们从列表中删除,但是发生了一些碰撞,但没有检测到,因此我恢复了此代码。可以,但是我想要更有效的方法。
答案 0 :(得分:1)
首先,这要测试两次,并且还要测试一个对象是否与自身碰撞:
for i in list1:
for j in list1:
if collide(i, j):
i.kill()
j.kill()
这恰好循环len(list1)**2
次。
一种非常简单的方法将测试次数除以2(并避免针对自身进行测试):
for i,obj1 in enumerate(list1):
for j in range(i+1,len(list1)):
obj2 = list1[j]
if collide(obj1,obj2):
obj1.kill()
obj2.kill()
利用collide(obj1,obj2)
与collide(obj2,obj1)
相同的事实。
这时,由于obj1现在已死,您可能想break
退出内部循环。但这取决于您想做什么。
如果准确的碰撞测试价格昂贵,则可以考虑进行更粗略的检查(距离,矩形边界,任何快速方法),因此可以丢弃彼此相距太远的项目而无需执行“昂贵”的测试。 / p>