デルタタイム
CoddyのPygameジャーニー「ゲームループ」セクションの一部。レッスン 18/32。
clock.tick(60)は待つだけではありません。前回呼び出されてから経過したミリ秒数を返します。1秒間に60フレームなら約17ミリ秒、処理が追いつかない低速なコンピューターではそれより長くなります。1000で割ると、フレームの長さを秒で表したdtが得られます。
dt = 0
while running:
# イベント処理、更新、描画、画面の切り替え
dt = clock.tick(60) / 1000最初のフレームではdtは0で、それ以降は直前のフレームの長さになります。これを合計すると、ゲーム開始からの経過時間が得られます。
elapsed += dtGem Huntで行ったようにフレームを数える方法では、ゲームが毎秒60フレームで動いている間しか時間を計れません。dtで測った時間なら、どのコンピューターでも正確です。この章の残りでは、時間に応じてオブジェクトを動かします。
チャレンジ
簡単導火線は1フレームごとに1ピクセル燃えます。時間に応じて燃えるようにしましょう。
- ループの前に、
elapsed = 0とdt = 0を設定します。 clock.tick(60)をdt = clock.tick(60) / 1000に置き換えます。- ループ内で
dtをelapsedに加算し、導火線の幅をmax(0, 480 - elapsed * 40)に設定します。これで1秒あたり40ピクセル燃えます。
自分で試してみよう
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Fuse")
clock = pygame.time.Clock()
width = 480
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
width = max(0, width - 1)
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (255, 150, 40), (0, 170, width, 20))
pygame.display.flip()
clock.tick(60)
pygame.quit()
ゲームループのすべてのレッスン
自分で練習してみよう: Pygameプレイグラウンド