SpriteCollide запускается только один раз за столкновение

#python #pygame #collision-detection

#python #pygame #обнаружение столкновений

Вопрос:

Я проверяю missileGroup , сталкивались ли какие-либо экземпляры missile с какими-либо экземплярами enemy enemyGroup . При запуске он выводит «Hit» для первого цикла, но игнорирует второй цикл for. Почему это так?

  #### Imagine this is in a game loop ####
        for missile in missileGroup:
            if pygame.sprite.spritecollide(missile, enemyGroup, False) :
                print("Hit")

        
        for enemy in enemyGroup:
            if pygame.sprite.spritecollide(enemy, missileGroup, False) == True:
                print("HI")
 

Ответ №1:

pygame.sprite.spritecollide() не возвращает True или False , но возвращает список, содержащий все спрайты в группе, которые пересекаются с другим спрайтом. Вы должны оценить, не является ли список пустым, вместо того, чтобы сравнивать результат с True :

if pygame.sprite.spritecollide(enemy, missileGroup, False) == True:

 if pygame.sprite.spritecollide(enemy, missileGroup, False):
 

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

 if pygame.sprite.groupcollide(missileGroup, enemyGroup, False, False):
    print("Hit")
 

См. pygame.sprite.spritecollide() :

Возвращает список, содержащий все спрайты в группе, которые пересекаются с другим спрайтом.

См. pygame.sprite.groupcollide()

Это приведет к обнаружению столкновений между всеми спрайтами в двух группах.

Поэтому аргументами spritecollide() должны быть pygame.sprite.Sprite object и pygame.sprite.Group object . аргументами groupcollide() должны быть два pygame.sprite.Group объекта.
Список pygame.sprite.Sprite объектов вместо группы не работает.

 missileGroup = pygame.sprite.Group()
enemyGroup = pygame.sprite.Group()
 

Кроме того, читайте о kill()

Спрайт удаляется из всех групп, которые его содержат.

Следовательно, если вы вызываете kill() в 1-м цикле, 2-й цикл не будет работать, потому что спрайт удаляется из всех групп.

Вы вызываете kill() reset методы. missile.reset() соответственно eachEnemy.reset() приводит к сбою 2-го цикла.

Комментарии:

1. Он по-прежнему ничего не печатает в консоли

2. @DaeshaunMorrison Итак, в вашем коде есть еще одна ошибка, где-то в другом месте.