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

时间:2016-09-11 16:55:15

标签: python-2.7 pygame sprite

我对编程很新,我想弄清楚精灵的基础知识。

所以我有我的精灵课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

我创建了一个sprite组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()

1 个答案:

答案 0 :(得分:0)

如果您正在遍历该组,则应该使用循环变量:

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

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

for bullet in bullet_list:
    bullet.test()

fired_bullet变量只是指您解雇的 last 项目符号。

此外,您永远不应该在精灵的__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