pyglet でゲームループを作成

マウスの入力も取得できましたし、今度は何かアニメーションさせたいですね。そのためには入力に反応する関数だけではなくて、定期的に呼び出されるゲームループが必要です。

以前はテレビに合わせて 30Hz とか 60Hz でループを回していたけれど(もちろん、NTSC だと正確には 1000 / 1001 倍して、だいたい 29.97 Hz や 59.94 Hz ですけれど)。最近は PC のゲーミングモニタだと 144Hz とか 240Hz とか言っていますものね。気にしなくて済むように、可変リフレッシュレートで考えておきましょう。

pyglet では、更新タイミングを関数を呼び出してくれる機能が提供されているようです。pyglet.clock.schedule_interval ですね。

pyglet.clock — pyglet v2.0.15

あとは、GitHub に上がっているサンプルを参考に…

pyglet/examples/game/version2/asteroid.py at master · pyglet/pyglet
pyglet is a cross-platform windowing and multimedia library for Python, for developing games and other visually rich applications. - pyglet/pyglet
import pyglet

window = pyglet.window.Window()

label = pyglet.text.Label('dt=0',
                          font_name='Times New Roman',
                          font_size=36,
                          x=window.width//2, y=window.height//2,
                          anchor_x='center', anchor_y='center')

@window.event
def on_draw():
    window.clear()
    label.draw()

frame_count = 0
def update(dt):
    global frame_count
    label.text = '[{}] dt={:.5f}'.format(frame_count, dt)
    frame_count += 1

pyglet.clock.schedule_interval(update, 1 / 120.0)

pyglet.app.run()

update 関数を作って、1/120 秒ごとに呼び出してもらうように設定してみました。で、実際に呼び出された間隔が引数 dt で取得できます。ついでに、何フレーム目かのカウンタも追加してみました。Python は、関数の中からグローバル変数の値を変えるときは global キーワードが要る、とかも思い出したりして。

自分の PC だとけっこう dt が変わって安定しないな…。何かもっと安定させられるのかな?

何はともあれ、定期的に呼び出される関数を作ることができました。

タイトルとURLをコピーしました