충돌 당 한 번만 실행되는 SpriteCollide

Nov 28 2020

나는 확인하고있어 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 Rabbid76 Nov 28 2020 at 19:11

pygame.sprite.spritecollide()True또는을 반환하지 않지만 다른 Sprite 와 교차 하는 그룹의False 모든 Sprite 를 포함하는 목록을 반환합니다 . 결과를 다음 과 비교하는 대신 목록이 비어 있지 않은지 평가해야합니다 .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():

다른 Sprite와 교차하는 그룹의 모든 Sprite를 포함하는 목록을 반환합니다.

보다 pygame.sprite.groupcollide()

이렇게하면 두 그룹의 모든 스프라이트간에 충돌이 발생합니다.

따라서 인수 spritecollide()는 pygame.sprite.Sprite객체와 객체 여야 pygame.sprite.Group합니다. 인수 groupcollide()는 두 개의 pygame.sprite.Group객체 여야 합니다. 그룹 대신 개체
목록이 작동하지 않습니다.pygame.sprite.Sprite

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

더 읽어보기 kill()

스프라이트가 포함 된 모든 그룹 에서 제거됩니다 .

따라서 kill()첫 번째 루프 를 호출 하면 스프라이트가 모든 그룹 에서 제거되기 때문에 두 번째 루프가 작동하지 않습니다 .

당신은 전화 kill()reset방법. missile.reset()각각 eachEnemy.reset()두 번째 루프가 실패합니다.