拾ったときにポップする
CoddyのPygameジャーニー「サウンドとゲームの手応え」セクションの一部。レッスン 18/23。
ジェムを集めるとスコアは1増えますが、目は隅ではなくジェムに向いています。短いポップでカウンターに目を引きつけます。アイコンが大きく跳ね上がり、その後元のサイズに縮みます。
通常サイズを1.0とするスケールを保持します。アイテムを取得したら1.6に設定し、毎フレーム、前と同じ式で1に向かって徐々に戻します。
pop = 1.6 # 宝石を取得したとき
pop += (1 - pop) * 0.2 # 毎フレーム描画時には、スケールでサイズを決めます。そのサイズでRectを作り、次に中心を配置します。こうすると、アイコンは隅からではなく中央を中心に大きくなります。
size = int(20 * pop)
icon = pygame.Rect(0, 0, size, size)
icon.center = (30, 30)大きくなるのは瞬時で、戻る動きは徐々に変化します。これがポップらしい動きです。0.2の割合で戻すと、約4分の1秒で元に戻ります。
画像の場合は、pygame.transform.scale_by(image, pop)で拡大縮小し、同じ方法でRectの中心を配置します。
チャレンジ
簡単紫色の宝石をクリックして集めましょう。金色のアイコンを弾むように表示します。
- ループの前に
pop = 1.0を設定します。 - 宝石を集めたときに
pop = 1.6を設定します。 - 各フレームで、徐々に元に戻します:
pop += (1 - pop) * 0.2。 - アイコンを幅と高さが
int(20 * pop)ピクセルになるように描画し、中心は引き続き(30, 30)にします。
自分で試してみよう
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Gem Picker")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)
coin_sound = pygame.mixer.Sound("assets/sounds/coin.ogg")
gem = pygame.Rect(300, 200, 24, 24)
score = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN and gem.collidepoint(event.pos):
score += 1
coin_sound.play()
gem.topleft = (random.randint(80, 420), random.randint(90, 300))
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (170, 90, 230), gem)
icon = pygame.Rect(0, 0, 20, 20)
icon.center = (30, 30)
pygame.draw.rect(screen, (255, 200, 60), icon)
label = font.render(f"x {score}", True, (240, 240, 240))
screen.blit(label, (52, 20))
pygame.display.flip()
clock.tick(60)
pygame.quit()
サウンドとゲームの手応えのすべてのレッスン
自分で練習してみよう: Pygameプレイグラウンド