Menu
CoddyTech

拾ったときにポップする

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の中心を配置します。

challenge icon

チャレンジ

簡単

紫色の宝石をクリックして集めましょう。金色のアイコンを弾むように表示します。

  1. ループの前に pop = 1.0 を設定します。
  2. 宝石を集めたときに pop = 1.6 を設定します。
  3. 各フレームで、徐々に元に戻します: pop += (1 - pop) * 0.2。
  4. アイコンを幅と高さが 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プレイグラウンド