SpriteCollide每次碰撞仅运行一次 [英] SpriteCollide Only Running Once Per Collision

查看:121
本文介绍了SpriteCollide每次碰撞仅运行一次的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在检查 missileGroup ,以查看导弹的任何实例是否与 enemyGroup 中的任何实例 enemy 发生冲突.在运行时,它会打印"Hit".对于第一个循环,但它忽略了第二个for循环.为什么会这样?

I'm checking missileGroup to see if any instances of missile collided with any instances enemy in enemyGroup. When run, it prints "Hit" for the first loop, but it ignores the second for loop. Why is that?

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

推荐答案

pygame.sprite.spritecollide() doesn't return True or False, but it return a list containing all Sprites in a Group that intersect with another Sprite. You have to evaluate whether the list is not empty instead of comparing the result with True:

如果pygame.sprite.spritecollide(enemy,missileGroup,False)==真:

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


无论如何都使用 pygame.sprite.groupcollide() 来查找在两组之间碰撞的所有精灵.


Anyway use pygame.sprite.groupcollide() to find all sprites that collide between two groups.

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


请参见 pygame.sprite.spritecollide() :

返回一个列表,其中包含一个组中与另一个Sprite相交的所有Sprite.

Return a list containing all Sprites in a Group that intersect with another Sprite.

请参见 pygame.sprite.groupcollide()

这将查找两组中所有Sprite之间的碰撞.

This will find collisions between all the Sprites in two groups.

因此, spritecollide()的参数必须是 pygame.sprite.Sprite 对象和 pygame.sprite.Group 对象. groupcollide()的参数必须是两个 pygame.sprite.Group 对象.
pygame.sprite.Sprite 对象而不是 Group 的列表不起作用.

Therefore the arguments to spritecollide() must be a pygame.sprite.Sprite object and a pygame.sprite.Group object. the arguments to groupcollide() must be two pygame.sprite.Group objects.
A list of pygame.sprite.Sprite objects instead of the Group does not work.

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

进一步了解 kill()

Furthermore read about kill()

该精灵已从包含它的所有组中删除.

因此,如果您在第一个循环中调用 kill(),则第二个循环将不起作用,因为该精灵已从所有组中删除.

Hence if you call kill() in the 1st loop, the 2nd loop won't work, because the sprite is removed from all Groups.

您可以在 reset 方法中调用 kill(). missile.reset()分别 eachEnemy.reset()导致第二个循环失败.

You call kill() in the reset methods. missile.reset() respectively eachEnemy.reset() causes the 2nd loop to fail.

这篇关于SpriteCollide每次碰撞仅运行一次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆