我正在做一个游戏,其中每个物体都应该检查它是否与任何其他物体发生碰撞。我有一个所有对象的列表和一个函数,该函数可以确定两个对象是否发生碰撞并销毁它们。我目前使用的方法效率非常低。
for i in list1:
for j in list1:
if collide(i, j):
i.kill()
j.kill()
最初,我在两个对象被删除后将它们从列表中删除,但在没有检测到的情况下发生了一些冲突,所以我恢复到了这个代码。它很好用,但我想要更有效的。
发布于 2018-08-03 04:31:24
首先,这是两次过多的测试,也是测试一个对象是否与自身发生碰撞:
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)
相同的事实。
此时,您可能想要break
出内部循环,因为obj1现在已经死了。但这取决于你想做什么。
如果精确的碰撞测试是昂贵的,你可以考虑一个更粗糙的检查(距离,矩形边界,任何快速方法),这样你就可以丢弃彼此太远的项目,而不执行“昂贵”的测试。
https://stackoverflow.com/questions/51661522
复制相似问题