2

このコードをどのように機能させますか?このコードをファイルに保存したディレクトリに保存されているイメージの名前をpygletインストールして変更するだけです。"fireball.png"

import pyglet

class Fireball(pyglet.sprite.Sprite):
    def __init__(self, batch):
        pyglet.sprite.Sprite.__init__(self, pyglet.resource.image("fireball.png"))
        # replace "fireball.png" with your own image stored in dir of fireball.py
        self.x =  10 # Initial x coordinate of the fireball
        self.y =  10 # Initial y coordinate of the fireball

class Game(pyglet.window.Window):
    def __init__(self):
        pyglet.window.Window.__init__(self, width = 315, height = 220)
        self.batch_draw = pyglet.graphics.Batch()
        self.fps_display = pyglet.clock.ClockDisplay()
        self.fireball = []

    def on_draw(self):
        self.clear()
        self.fps_display.draw()
        self.batch_draw.draw()
        if len(self.fireball) != 0:             # Allow drawing of multiple
            for i in range(len(self.fireball)): # fireballs on screen
                self.fireball[i].draw()         # at the same time

    def on_key_press(self, symbol, modifiers):
        if symbol == pyglet.window.key.A:
            self.fireball.append(Fireball(batch = self.batch_draw))
            pyglet.clock.schedule_interval(func = self.update, interval = 1/60.)
            print "The 'A' key was pressed"

    def update(self, interval):
        for i in range(len(self.fireball)):
            self.fireball[i].x += 1 # why do fireballs get faster and faster?

if __name__ == "__main__":
    window = Game()
    pyglet.app.run()

このコードは、黒い背景画面を作成します。この画面では、キーを押すたびにfpsが表示され、位置(10、10)からx方向に沿って火の玉が発射されAます。

発射する火の玉が多いほど、すべての火の玉が速く進み始めることに気付くでしょう。

質問:

  1. Aを押すたびに火の玉がどんどん速くなるのはなぜですか?

  2. Aを押すたびに火の玉が加速するのを防ぐにはどうすればよいですか?

4

1 に答える 1

3

を押すたびにスケジューラAに別の呼び出しを追加するため、火の玉はどんどん速くなります。self.updateそのself.updateため、毎回呼び出される回数が増え、その結果、ポジションが更新されます。これを修正するには、下の行をに移動します__init__()

pyglet.clock.schedule_interval(func = self.update, interval = 1/60.)
于 2012-06-27T09:04:57.543 に答える