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

那么我应该如何根据玩家的意愿创建尽可能多的子弹,并且仍然能够为他们提供速度并更新他们在屏幕上的位置?

4

2 回答 2

1

您可能还希望将您的子弹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。您不必自己调用每个 bulletSpritedraw()方法,因为只需一次调用即可更有效地完成此操作:

@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
    ...
于 2013-02-22T03:41:29.330 回答
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
于 2013-02-21T05:44:23.830 回答