2016-04-18 4 views
0

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

Как найти всех спрайтов, с которыми сталкивается каждый спрайт в группе? Вот моя идея найти все столкновения внутри группы.

@staticmethod 
def check_collision_group(most_sprites: pygame.sprite.Group, screen): 
    for sprite in most_sprites: 
     most_sprites.remove(sprite) 
     collided_sprites = pygame.sprite.Group() 


     for sprite2 in most_sprites: 
      if pygame.sprite.collide_rect(sprite, sprite2): 
       collided_sprites.add(sprite2) 

     sprite.handle_collision(collided_sprites) 

     most_sprites.add(sprite) 

Однако, это медленно. Количество столкновений, которое это должно было проверить, поразило меня, когда я распечатал их.

Немного поиска, и я нашел 2 идеи, которые, вероятно, намного быстрее.

  1. Создание первого спрайта Группой и использование collidegroup из библиотеки pygame.sprite.

  2. Только тестирование спрайтов вокруг спрайта, который вы тестируете. Идея от https://gamedev.stackexchange.com/questions/45392/how-do-i-detect-multiple-sprite-collisions-when-there-are-10-sprites.

Чтобы переформулировать вопрос: Что такое быстрый (но, надеюсь, все еще относительно простой) способ найти любой другой спрайт в группе, которая сталкивается каждый спрайт с?

+1

Посмотрите пример маски в каталоге примеров pygame: в нем есть множество спрайтов, которые могут отскочить друг от друга, возможно, это сработает для вас. Я начинающий, чтобы не полностью понять это сам. (на linux он находится в /usr/local/lib/python2.7/dist-packages/pygame/examples) – marienbad

ответ

0

Чтобы найти все столкновение между спрайтом и всем остальным в его группе.

def check_collision_group(most_sprites, screen): 
    single = pygame.sprite.GroupSingle() 
    for sprite in most_sprites: 
     most_sprites.remove(sprite) 
     single.add(sprite) 

     collided_sprites_dict = pygame.sprite.groupcollide(
      single, most_sprites, False, False) 


     most_sprites.add(sprite) 

Примечание: Важно использовать добавить на groupsingle, переназначение будет продолжать добавлять все больше и больше групп к вашей системе и увязнуть игру. Я не уверен, почему, но меняя его на свои группы и добавляя к нему исправленную проблему.

Скорость, по-видимому, относительно быстрая. Чтобы вычислить все столкновения в группе из 50 спрайтов, потребовалось около 1,4 миллисекунды. Я не пробовал метод 2, который проверяет только столкновения на основе близости, но я не вижу причины, так как скорость groupcollide довольно приличная.

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