如何将精灵函数应用于精灵组中的所有精灵?

How to apply a sprite function to all the sprites in a sprite group?

我对编程还比较陌生,我正在尝试了解精灵的基础知识。

所以我有我的精灵 class, Bullet:

class Bullet(pygame.sprite.Sprite):
    def __init__(self,id_num):
        super(Bullet, self).__init__()
        self.image = pygame.image.load("bullet.png")
        self.rect = self.image.get_rect()
        self.id = id_num

    def test(self):
        print self.id

我创建了一个精灵组,bullet_list,将所有的子弹精灵放入其中。

然后当鼠标被点击时它会创建一个项目符号,分配一个随机的 id,并将它添加到 bullet_list 组。

if event.type == pygame.MOUSEBUTTONUP:
    id_num = random.randint(1,5)
    fired_bullet = Bullet(id_num)
    bullet_list.add(fired_bullet)

现在我的问题来了...我不知道如何将测试函数应用于 bullet_list 中的所有精灵。在 this post 中,它表示要遍历 bullet_list 并将函数应用于每个实例。所以我试过了,但是当它打印出子弹的 id 时,它们应该都不同,但它们都是一样的。

    for i in bullet_list.sprites():
        fired_bullet.test()

我觉得问题可能是因为我创建的所有项目符号都具有相同的名称,fired_bullet

我可能完全错了,这可能真的很简单,所以提前道歉!

这是我的完整代码:

import pygame,sys,random
pygame.init()
screen = pygame.display.set_mode([800,500])

class Bullet(pygame.sprite.Sprite):
    def __init__(self,id_num):
        super(Bullet, self).__init__()
        self.image = pygame.image.load("bullet.png")
        self.rect = self.image.get_rect()
        self.id = id_num

    def test(self):
        print self.id

bullet_list = pygame.sprite.Group()

main = True
while main == True:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

        if event.type == pygame.MOUSEBUTTONUP:
            id_num = random.randint(1,5)
            fired_bullet = Bullet(id_num)
            bullet_list.add(fired_bullet)
            for i in bullet_list.sprites():
                fired_bullet.test()

如果要遍历组,则应使用循环变量:

for i in bullet_list.sprites():
    i.test()

虽然你应该更好地命名它,并且你不需要调用 sprites() - pygame 精灵组是可迭代的:

for bullet in bullet_list:
    bullet.test()

fired_bullet 变量指的是你发射的 最后 颗子弹。

此外,您永远不应该在精灵的 __init__() 中加载图像文件 - 这意味着每次创建子弹时,您都在从磁盘加载图像。这将非常缓慢和浪费。相反,在开始时加载一次图像(不要忘记 convert() - 它可以加快绘图速度):

bullet_img = pygame.image.load("bullet.png").convert()

class Bullet(pygame.sprite.Sprite):
    def __init__(self,id_num):
        super(Bullet, self).__init__()
        self.image = bullet_img