2016-08-14 16 views
0

В моей игре у меня есть популяция рыбы (10). У каждой рыбы есть линия зрения (перед ней - объект дуги). Есть акулы, которые являются хищниками (они случайно перемещаются по комнате). Каждой рыбе присваивается номер разведки в начале. Когда акула входит в линию видимости рыбы, я хочу, чтобы рыба отклоняла его направление (или, по крайней мере, уходила в лучшем направлении), только если его номер разведки больше, чем случайный сгенерированный номер.Как обнаружить столкновение двух объектов только один раз в pygame?

Проблема в том, что когда я пытаюсь реализовать это, и акула попадает в линию зрения рыбы, 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 

Спасибо!

ответ

1

Вам нужно отслеживать, когда была замечена акула или какая акула была замечена. В основном обновите детектор столкновений один десятый (или 12-й или 100-й) столько раз, сколько вы обновите положение.

Или, как только рыба не увидит акулу, она обречена, поэтому вы можете добавить этот список в список акул, которых он видел и которых не удалось избежать (если он видит другую акулу), то при обновлении вы можете просто перейдите в список, говоря, что для того, чтобы изменить направление, рыба должна бить генератора случайных чисел, а также не потеряла для акулы уже

Вы можете попробовать другое случайное распределение, возможно, что-то, что перегибает влево, поэтому даже если у немой рыбы было несколько попыток, объединенная вероятность все равно была бы низкой

Опять же, если вы пытаетесь имитировать «настоящую» рыбу, некоторые могут быть медленнее реагировать, но у них все еще есть много шансов.

Возможно, вы могли бы сократить дугу?

+0

Я попробовал ваше второе предложение добавить его в список акул, которых он видел, и этого не избежать, и я считаю, что это сработало. благодаря – gamelanguage

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 

 Смежные вопросы

  • Нет связанных вопросов^_^