SpriteCollide केवल टक्कर के अनुसार एक बार चल रहा है

Nov 28 2020

मैं missileGroupयह देखने के लिए जाँच कर रहा हूँ कि क्या किसी missileभी उदाहरण enemyमें किसी भी तरह की टक्कर हुई है enemyGroup। जब चलाया जाता है, तो यह पहले लूप के लिए "हिट" प्रिंट करता है, लेकिन यह लूप के लिए दूसरे को अनदेखा करता है। ऐसा क्यों है?

 #### 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, लेकिन यह सब युक्त एक सूची प्रदान Sprites एक में समूह है कि दूसरे के साथ एक दूसरे को काटना स्प्राइट । आपको मूल्यांकन करना होगा कि परिणाम की तुलना करने के बजाय सूची खाली नहीं है 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वस्तु और एक pygame.sprite.Groupवस्तु होना चाहिए । तर्क groupcollide()दो pygame.sprite.Groupवस्तुओं होना चाहिए । समूह के बजाय ऑब्जेक्ट्स
की एक सूची काम नहीं करती है।pygame.sprite.Sprite

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

इसके अलावा के बारे में पढ़ा kill()

स्प्राइट उन सभी समूहों से हटा दिया जाता है जिनमें यह शामिल है।

इसलिए यदि आप kill()1 लूप में कॉल करते हैं, तो दूसरा लूप काम नहीं करेगा, क्योंकि स्प्राइट को सभी समूहों से हटा दिया जाता है ।

तुम विधियों kill()में पुकारते हो resetmissile.reset()क्रमशः eachEnemy.reset()दूसरा लूप विफल होने का कारण बनता है।