gpt4 book ai didi

python - 高效的碰撞检测

转载 作者:行者123 更新时间:2023-11-28 22:01:55 24 4
gpt4 key购买 nike

我在 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

它检查与每个 Sprite 的距离,“目标”是另一个 Sprite 。我不确定的是“我应该检查所有 Sprite 之间的碰撞吗?”我有超过 200 个生物(我希望在成品中更多)并且在检查碰撞时变得无法播放。有没有办法只检查一定距离内的 Sprite 而不损失速度?

编辑:

我在谷歌上看了一圈,发现很多速度都花在了同样的碰撞上。即用 sprite2 检查 sprite1,用 sprite1 检查 sprite2。所以我对检查碰撞功能做了一些更改,它现在运行得更快但仍然低于 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 作为 Sprite 库。碰撞又快又容易。我将上面的代码 ^^ 替换为:

rabbyt.collisions.collide(mobs_to_collide)

这将返回一个包含碰撞对象的列表列表(我不确定这是不是正确的术语)。我仍在研究如何将其转换为“if collided:”类型的语句,但我正在取得进展。如果有人遇到类似情况,我会推荐使用 rabbyt。

最佳答案

提高速度的一个简单方法是删除平方根运算

def distancesq(self,target):
return (self.x-target.x)**2 + (self.y-target.y)**2
def check_collision(self):
for i in list_of_mobs:
# Square this distance to compensate
if self.distancesq(i) < (self.width/2 + i.width/2)**2:
return True

关于python - 高效的碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12456201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com