SpriteCollideは衝突ごとに1回だけ実行されます

Nov 28 2020

私がチェックしてるmissileGroupのインスタンスのいずれかがどうかを確認するためにmissileすべてのインスタンスと衝突enemyの中でenemyGroup。実行すると、最初のループに対して「ヒット」が出力されますが、2番目の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またはを返しませんFalseが、別のスプライトと交差するグループ内のすべてのスプライトを含むリストを返します。結果を:と比較する代わりに、リストが空でないかどうかを評価する必要があります。True

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

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

とにかくpygame.sprite.groupcollide()、2つのグループ間で衝突するすべてのスプライトを見つけるために使用します。

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

参照pygame.sprite.spritecollide():

別のスプライトと交差するグループ内のすべてのスプライトを含むリストを返します。

見る pygame.sprite.groupcollide()

これにより、2つのグループのすべてのスプライト間の衝突が検出されます。

したがって、への引数spritecollide()はpygame.sprite.Spriteオブジェクトとオブジェクトでなければなりませんpygame.sprite.Group。の引数groupcollide()は2つの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番目のループが失敗します。