如何将精灵函数应用于精灵组中的所有精灵?
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
我对编程还比较陌生,我正在尝试了解精灵的基础知识。
所以我有我的精灵 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