2013-02-21 56 views
0

我正在使用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 

所以,我应该怎么创造尽可能多的子弹球员的意愿,仍然能够给他们的速度和屏幕上更新自己的位置?

回答

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

您可能还需要你的子弹是Sprites分组到Batchfaster 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构造函数的每次调用传递一个可选参考我们的batch,因此,所有新创建的子弹Sprites连接到子弹Batch

它的妙处是Batch类的draw()方法。在调用它时,要注意批次中每个子弹的blitting。你不必调用每一颗子弹Spritedraw()方法自己,因为这只能在一个单一的调用来做到more efficiently

@window.event 
def on_draw(): 
    batch.draw() 

你会认识到这个例子,很像一个@Xymostech让步第一个答案,填充一个包含所有项目符号实例的列表。您仍然需要像这样的Collection结构来保留对您的Sprite的引用,因为Batch没有函数会返回附加到它的对象的列表。

所以,你会坚持在以前的答案的解决方案,除了当然的图像的blitting。
使用Sprites的另一个优点是,你不必有自己的位置字段来装备你的bullet类,因为你可以使用相应的parameters of your Sprite objects。除了允许更新其(x, y)坐标,Sprites也可以rotatefade out

实际上,你应该考虑修改你的bullet类,使其成为Sprite类的扩展名inheriting

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 
    ... 
+0

我认为添加到批量精灵后不能移动,我一定会尝试,谢谢! – solusipse 2013-02-22 10:59:35

相关问题