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
を装備する必要がないことです。座標を更新できるほか、回転してフェードアウトすることもできます。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
...