创建许多类并能够引用它们

时间:2013-02-21 05:40:23

标签: python pyglet

我正在研究Python和Pyglet中的简单游戏。我想给拍摄的可能性,所以我创建了一个子弹类。如果我创建该类的一个实例,例如
self.new_bullet = bullet()
我现在只能有一个实例。我的问题是如何同时创建许多实例并能够引用它们及其变量?示例代码(带有伪代码段):

if key pressed:
    self.new_bullet = bullet()

... somewhere in main loop ...
bullet_image.blit(new_bullet.x, new_bullet.y)
self.new_bullet.x += 5

class bullet:
    def __init__(self):
        self.pos_x = player.pos_x
        self.pos_y = player.pos_y

那么我应该如何创建玩家希望的子弹数量,并且仍然可以给他们速度并更新他们在屏幕上的位置?

2 个答案:

答案 0 :(得分:1)

我认为您需要一个子弹对象列表。然后,您可以使用append添加到列表中,在主循环期间,您可以使用for循环遍历所有这些循环。

self.bullets = []
self.bullets.append(bullet())
self.bullets.append(bullet())

在你的主循环中:

for bullet in self.bullets:
    bullet_image.blit(bullet.x, bullet.y)
    bullet.x += 5

答案 1 :(得分:1)

您可能还希望将您的项目符号Sprites分组为Batch faster execution(如遇重火)。 pyglet文档show how its done

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。您不必亲自调用每个项目Sprite的{​​{1}}方法,因为只需一次调用即可more efficiently

draw()

你会认识到这个例子,就像@Xymostech在第一个答案中给出的一样,也填充了一个包含所有子弹实例的列表。您仍然需要这样的Collection结构来保留对@window.event def on_draw(): batch.draw() 的引用,因为Sprite没有函数会返回附加到它的对象列表。

所以,你会坚持上一个答案中的解决方案,当然除了图像blitting 使用Batch的另一个好处是,您不必为Sprites类配备自己的位置字段,因为您可以使用相应的parameters of your Sprite objects。除了允许更新其bullet坐标外,(x, y)还可以rotatefade out

实际上,您应该考虑将Sprites课程修改为bullet课程的inheriting课程的延伸。

Sprite