3

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

4

2 回答 2

4

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

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
于 2012-09-17T10:01:05.830 回答
2

可能已经太晚了,但我遇到了完全相同的问题。我设法通过仅计算可见对象的碰撞来解决它,如下所示:

for object_ in objects:
    if not object_.visible: # pyglet.sprite.Sprite() provides this flag
        continue
    # rest of your collision detection
于 2015-01-19T13:34:15.667 回答