元の状態から回転する
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ピクセルを超えることも、回転を一度行った場合よりぼやけることもありません。すべての変換に同じルールが当てはまります。直前のコピーではなく、元の画像を使いましょう。
チャレンジ
中級- ループの前に、
angle = 0にします。 - 各フレームで、
angleに2を加えます。 - 元の
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()
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
スプライトと画像のすべてのレッスン
自分で練習してみよう: Pygameプレイグラウンド