Menu
CoddyTech

デルタタイム

CoddyのPygameジャーニー「ゲームループ」セクションの一部。レッスン 18/32。

clock.tick(60)は待つだけではありません。前回呼び出されてから経過したミリ秒数を返します。1秒間に60フレームなら約17ミリ秒、処理が追いつかない低速なコンピューターではそれより長くなります。1000で割ると、フレームの長さを秒で表したdtが得られます。

dt = 0

while running:
    # イベント処理、更新、描画、画面の切り替え
    dt = clock.tick(60) / 1000

最初のフレームではdtは0で、それ以降は直前のフレームの長さになります。これを合計すると、ゲーム開始からの経過時間が得られます。

elapsed += dt

Gem Huntで行ったようにフレームを数える方法では、ゲームが毎秒60フレームで動いている間しか時間を計れません。dtで測った時間なら、どのコンピューターでも正確です。この章の残りでは、時間に応じてオブジェクトを動かします。

challenge icon

チャレンジ

簡単

導火線は1フレームごとに1ピクセル燃えます。時間に応じて燃えるようにしましょう。

  1. ループの前に、elapsed = 0とdt = 0を設定します。
  2. clock.tick(60)をdt = clock.tick(60) / 1000に置き換えます。
  3. ループ内で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プレイグラウンド