0

私はPythonとPygletで簡単なゲームに取り組んでいます。射撃の可能性を与えたいので、弾丸クラスを作成します。たとえば、そのクラスのインスタンスを1つ作成する
self.new_bullet = bullet()
と、現時点でインスタンスを1つだけ持つことができます。私の質問は、同時に多くのインスタンスを作成し、それらとその変数を参照できるようにする方法です。サンプルコード(擬似コードの一部を含む):

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

弾丸オブジェクトのリストが必要だと思います。次に、を使用してリストに追加でき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 に答える
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オブジェクトがインスタンス化され、それぞれが1つの弾丸(またはボールですが、ここに弾丸があるとしましょう)に適したコンテナとして機能します。コンストラクターを呼び出すたびにSprite、オプションの参照がに渡され、batch新しく作成されたすべてSpritesの箇条書きが箇条書きに添付されBatchます。

それの美しさはクラスのdraw()方法です。Batchそれを呼び出すとき、バッチ内のすべての弾丸のブリットに注意が払われます。Sprite各弾丸のメソッドを自分で呼び出す必要はありません。これは、1回の呼び出しでより効率的draw()に実行できるためです。

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

この例は、@ Xymostechが最初の回答で示した例と同様に、すべての箇条書きインスタンスもリストに入力していることがわかります。に接続されているオブジェクトのリストを返す関数がないSpriteため、sへの参照を保持するには、このようなコレクション構造が必要です。Batch

したがって、もちろん画像ブリッティングを除いて、前の回答の解決策に固執します。
を使用するもう1つの利点は、オブジェクトの対応するパラメーターを使用できるため、クラスに独自の位置フィールドSpritesを装備する必要がないことです。座標を更新できるほか、回転してフェードアウトすることもできます。bulletSprite(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 に答える