SpriteCollide Hanya Berjalan Sekali Per Tabrakan

Nov 28 2020

Saya memeriksa missileGroupuntuk melihat apakah ada contoh missilebertabrakan dengan contoh apa pun enemydi enemyGroup. Saat dijalankan, ia mencetak "Hit" untuk loop pertama, tetapi mengabaikan loop kedua untuk. Mengapa demikian?

 #### 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")

Jawaban

1 Rabbid76 Nov 28 2020 at 19:11

pygame.sprite.spritecollide()tidak mengembalikan Trueatau False, tetapi mengembalikan daftar yang berisi semua Sprite dalam Grup yang berpotongan dengan Sprite lain . Anda harus mengevaluasi apakah daftar tersebut tidak kosong daripada membandingkan hasilnya dengan True:

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

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

Pokoknya gunakan pygame.sprite.groupcollide()untuk menemukan semua sprite yang bertabrakan antara dua kelompok.

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

Lihat pygame.sprite.spritecollide():

Kembalikan daftar yang berisi semua Sprite dalam Grup yang berpotongan dengan Sprite lain.

Lihat pygame.sprite.groupcollide()

Ini akan menemukan tabrakan antara semua Sprite dalam dua kelompok.

Oleh karena itu argumen spritecollide()harus menjadi pygame.sprite.Spriteobyek dan pygame.sprite.Groupobyek. argumen groupcollide()harus dua pygame.sprite.Groupobjek.
Daftar pygame.sprite.Spriteobjek bukannya Grup tidak bekerja.

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

Selanjutnya baca tentang kill()

Sprite dihapus dari semua Grup yang berisi itu.

Karenanya jika Anda memanggil kill()loop pertama, loop kedua tidak akan berfungsi, karena sprite dihapus dari semua Grup.

Anda menelepon kill()di resetmetode. missile.reset()masing-masing eachEnemy.reset()menyebabkan loop ke-2 gagal.