Menu
CoddyTech

元の状態から回転する

CoddyのPygameジャーニー「スプライトと画像」セクションの一部。レッスン 9/36。

常に回転するトゲ付きボールは、フレームごとに少しずつ回転します。つい次のように書きたくなりますが、これは問題を起こします。

ball = pygame.transform.rotate(ball, 2)  # 間違い

フレームごとに、直前に回転した画像をさらに回転させています。回転するたびに透明な縁が加わるため、Surfaceは1フレームごとに約3パーセントずつ大きくなります。0.5秒後にはサイズが2倍になり、2秒後には幅が約1,800ピクセルになります。回転のたびにピクセルも少しずつにじみます。ゲームはすぐにひどく遅くなります。

元の画像と角度を保持し、フレームごとに元の画像から回転後の画像を作成しましょう。

angle += 2
spun = pygame.transform.rotate(ball, angle)
screen.blit(spun, spun.get_rect(center=(320, 240)))

これなら、角度にかかわらず、spunはファイルの画像を一度だけ回転させたものです。サイズが67×67ピクセルを超えることも、回転を一度行った場合よりぼやけることもありません。すべての変換に同じルールが当てはまります。直前のコピーではなく、元の画像を使いましょう。

challenge icon

チャレンジ

中級
  1. ループの前に、angle = 0にします。
  2. 各フレームで、angleに2を加えます。
  3. 元のballをangleだけ回転させ、中心が(320, 240)になるように結果を描画します。ball自体は決して変更しません。

自分で試してみよう

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Spinning Spikes")
clock = pygame.time.Clock()

ball = pygame.image.load("assets/images/spike_ball.png").convert_alpha()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.fill((20, 22, 40))
    screen.blit(ball, ball.get_rect(center=(320, 240)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

スプライトと画像のすべてのレッスン

自分で練習してみよう: Pygameプレイグラウンド