您可能还希望将您的子弹Sprites
分组以Batch
更快地执行(在大火的情况下)。pyglet
文档显示了它是如何完成的:
batch = pyglet.graphics.Batch()
bullet_image = pyglet.image.load('bullet.png')
bullet_sprites = [] # I've changed the variable names to fitting our issue
for i in range(100):
x, y = i * 10, 50
bullet_sprites.append(pyglet.sprite.Sprite(bullet_image, x, y, batch=batch)
Batch
首先,创造一个新鲜的。接下来,实例化 100 个不同的Sprite
对象,每个对象都充当一个非常适合容纳一颗子弹(或多个球,但我们假设这里有子弹)的容器。构造函数的每次调用都会Sprite
传递一个对我们的可选引用batch
,从而将所有新创建的子弹附加Sprites
到子弹上Batch
。
它的美妙之处在于课堂的draw()
方法。Batch
调用它时,会注意批次中每个子弹的 blitting。您不必自己调用每个 bulletSprite
的draw()
方法,因为只需一次调用即可更有效地完成此操作:
@window.event
def on_draw():
batch.draw()
您会认识到,这个示例与@Xymotech 在第一个答案中给出的非常相似,它也填充了一个包含所有项目符号实例的列表。您仍然需要像这样的 Collection 结构来保留对您Sprite
的 s 的引用,因为Batch
没有函数可以返回附加到它的对象列表。
因此,您将坚持使用上一个答案中的解决方案,当然除了 Image blitting。
使用的另一个优点Sprites
是您不必为bullet
类配备自己的位置字段,因为您可以使用对象的相应参数Sprite
。除了允许更新其(x, y)
坐标外,Sprites
还可以旋转和淡出。
实际上,您应该考虑通过继承bullet
来将您的类修改为该类的扩展。Sprite
class Bullet(pyglet.sprite.Sprite): # btw, class names usually start with an Uppercase letter
def __init__(self):
super(pyglet.sprite.Sprite, self).__init__()
self.x = player.pos_x
...