【问题标题】:How can I detect collision between two objects only once in pygame?如何在pygame中只检测一次两个对象之间的碰撞?
【发布时间】:2016-12-20 18:45:30
【问题描述】:

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

问题是,当我尝试实现这一点并且鲨鱼进入鱼的视线时,pygame 不断检测到碰撞,因此 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

谢谢!

【问题讨论】:

    标签: python pygame sprite collision detection


    【解决方案1】:

    您需要跟踪看到鲨鱼的时间,或者看到了哪条鲨鱼。基本上更新碰撞检测器的频率是更新位置的十分之一(或 12 或 100)。

    或者,一旦一条鱼看不到鲨鱼,它就注定了,所以你可以将该列表添加到它见过但未能避免的鲨鱼列表中(以防它看到另一条鲨鱼),然后当你更新时,你可以遍历列表说为了改变方向,一条鱼必须击败随机数生成器并且还没有输给鲨鱼

    你可以尝试不同的随机分布,也许是左偏的东西,所以即使一条哑鱼多次尝试,组合的概率仍然很低

    再一次,如果你想模拟“真实”的鱼,有些鱼的反应可能会慢一些,但它们仍然有很多机会。

    也许你可以缩短弧线?

    【讨论】:

    • 我尝试了您的第二个建议,将其添加到它见过但未能避免的鲨鱼列表中,我相信它有效。谢谢
    【解决方案2】:

    您可以存储鱼“看到”的最后一条鲨鱼,并在更新循环的每次迭代中进行比较。

    • 如果鱼再次看到同一条鲨鱼,请不要重新计算。
    • 如果鱼看到另一条鲨鱼,请重新计算并记住这条鲨鱼。
    • 如果它没有看到鲨鱼,重置它的“记忆”。

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

    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
    

    【讨论】:

      猜你喜欢
      • 2020-12-13
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多