我在 2d 游戏中使用 python 和 pyglet,但在碰撞检测中遇到了问题。我检查碰撞的代码如下所示:
def distance(self,target):
return math.sqrt((self.x-target.x)**2 + (self.y-target.y)**2)
def check_collision(self):
for i in list_of_mobs:
if self.distance(i) < (self.width/2 + i.width/2):
return True
它检查与每个精灵的距离,其中“目标”是另一个精灵。我不确定的是“我应该检查所有精灵之间的碰撞吗?” 我有超过 200 个小怪(我希望在成品中更多),当检查碰撞时它变得无法播放。有没有办法只检查一定距离内的精灵而不会失去速度?
编辑:
我在 google 上进行了阅读,发现很多速度都花在了相同的碰撞上。即 sprite1 用 sprite2 检查, sprite2 用 sprite1 检查。所以我对检查碰撞功能进行了一些更改,它现在运行得更快但仍然低于 20 fps
def check_collision(self):
global mobs_to_collide
if mobs_to_collide == []:
mobs_to_collide = list_of_mobs[:]
if self in mobs_to_collide:
mobs_to_collide.remove(self)
for i in mobs_to_collide:
if self.distance(i) < (self.width/2 + i.width/2):
return True
(它可能包含一些低效的代码/无用的东西。我玩了一下)
编辑2:
我决定使用 rabbyt 作为精灵库。碰撞又快又容易。我将^^上面的代码替换为:
rabbyt.collisions.collide(mobs_to_collide)
这将返回一个包含碰撞对象的列表列表(我不确定这是否是正确的术语)。我仍在研究如何将其转换为“如果碰撞:”类型声明,但我正在取得进展。如果有人遇到类似情况,我建议使用 rabbyt。