如何在pygame中只检测两个对象之间的碰撞?

时间:2016-08-14 07:49:23

标签: python pygame sprite collision detection

在我的游戏中,我有一群鱼(10)。每条鱼都有一条视线(它们前面有一个弧形物体)。有鲨鱼,它们是掠食者(它们随机地在房间里移动)。每条鱼在开始时被分配一个情报号码。当一条鲨鱼进入一条鱼的视线时,我希望只有当他的智力数量大于随机生成的数字时,鱼才会改变方向(或者至少在最佳方向上离开)。

问题在于,当我尝试实现这个并且鲨鱼进入鱼的视线时,pygame会一直检测到碰撞,因此python会不断生成一个随机数。例如,一条鱼可能具有非常低的智力水平,但仍然很有可能从鲨鱼中逃脱,因为python一直在检测碰撞,并且它有很多尝试通过该条。就那个例子而言,当鲨鱼在视线中时,我实际上希望鱼很可能不会改变方向。

理想情况下,我希望python能够一次性检测到碰撞,当然,如果鲨鱼再次在另一个时间内再次通过视线,则会再次检测到它。

这是我的代码,不知道它有多大帮助:

class RedFish(pygame.sprite.Sprite):
    def __init__(self, newDNA):
        pygame.sprite.Sprite.__init__(self)
        self.direction = random.uniform(0, math.pi*2)
        self.speed = 2
        self.intelligence = 100
    def update(self):
        self.rect.x -= math.sin(self.direction) * self.speed
        self.rect.y -= math.cos(self.direction) * self.speed
        for shark in sharks:
            if pygame.sprite.collide_mask(arcsList[self.arcIndex], shark):
                temp = random.randrange(400)
                if (temp < self.intelligence):
                    self.direction = self.direction*-1

谢谢!

2 个答案:

答案 0 :(得分:2)

你可以存放鱼和#34;&#34;并在更新循环的每次迭代中进行比较。

  • 如果鱼再次看到同一条鲨鱼,请不要重新计算。
  • 如果鱼看到另一条鲨鱼,重新计算并记住那条鲨鱼。
  • 如果它没有看到鲨鱼,请重置其内存&#34;。

注意:我故意遗漏了很多计算代码,以使这个示例尽可能简单。

class RedFish(pygame.sprite.Sprite):
    def __init__(self, newDNA):
        self.last_shark_seen = None

    def update(self):
        # track how many sharks we have collisions with
        shark_collisions = 0

        for shark in sharks:
            if pygame.sprite.collide_mask(arcsList[self.arcIndex], shark):
                shark_collisions += 1

                if shark != self.last_shark_seen:
                    self.last_shark_seen = shark
                    # calculate new direction here
                    break

        # no collisions means no sharks seen, reset the fish's memory
        self.last_shark_seen = None

答案 1 :(得分:1)

你需要追踪鲨鱼何时被看到,或者看到了哪条鲨鱼。基本上更新碰撞检测器十分之一(或12或100)更新位置。

或者,一旦鱼没有看到鲨鱼,它就注定了,所以你可以将该列表添加到它看到的鲨鱼列表中并且未能避免(如果它看到另一条鲨鱼),那么当你更新时你可以只是通过列表说,为了改变方向,一条鱼必须打败随机数发生器,也没有输给鲨鱼

你可以尝试不同的随机分布,也许是左倾的东西,所以即使愚蠢的鱼有多次尝试,合并的概率仍然很低

然后,如果你试图模拟“真正的”鱼类,有些人可能会做出反应较慢,但他们仍然有多次机会。

也许你可以缩短弧线?