我正在研究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
那么我应该如何创建玩家希望的子弹数量,并且仍然可以给他们速度并更新他们在屏幕上的位置?
答案 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)
还可以rotate和fade out。
实际上,您应该考虑将Sprites
课程修改为bullet
课程的inheriting课程的延伸。
Sprite