#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 Итак, в вашем коде есть еще одна ошибка, где-то в другом месте.