Menu
CoddyTech

フェードと縮小

CoddyのPygameジャーニー「サウンドとゲームの手応え」セクションの一部。レッスン 10/23。

消えるまで同じ状態の火花は、消灯した点のように見えます。実際の火花は冷えていきます。消えるにつれて小さくなり、色が変わります。そのための数値はすでにあります。粒子の life です。描画するときに、その値からサイズと色を計算しましょう。

半径は、life の値に直接対応させられます。

radius = p["life"] // 10 + 1

残りフレームが40なら半径は5、9以下なら1です。+ 1 によって、半径を1以上に保てます。半径0の円は何も描画されず、火花が早く消えてしまいます。

色は、熱い色から冷たい色へ、いくつかの段階から選びます。

if p["life"] > 25:
    color = (255, 220, 80)
elif p["life"] > 10:
    color = (255, 140, 40)
else:
    color = (180, 50, 40)

最も大きい数値から先に判定します。逆の順序で書くと、life > 10 は残りフレームが30の場合にも該当し、黄色の分岐が実行されなくなります。

challenge icon

チャレンジ

中級

スペースキーを押すと、寿命がそれぞれ40フレームの火花が8方向に輪を描いて飛びます。飛びながら色が冷めていくようにしましょう。

  1. 各火花を半径 life // 10 + 1 で描画します。
  2. 寿命が25を超えている間は黄色 (255, 220, 80)、10を超えている間はオレンジ色 (255, 140, 40)、その後は暗い赤色 (180, 50, 40) で描画します。

自分で試してみよう

import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Ring of Sparks")
clock = pygame.time.Clock()

DIRECTIONS = [(3, 0), (2, 2), (0, 3), (-2, 2), (-3, 0), (-2, -2), (0, -3), (2, -2)]
particles = []

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            for vx, vy in DIRECTIONS:
                particles.append({"x": 240, "y": 180, "vx": vx, "vy": vy, "life": 40})

    for p in particles:
        p["x"] += p["vx"]
        p["y"] += p["vy"]
        p["life"] -= 1

    screen.fill((20, 20, 36))
    for p in particles:
        if p["life"] > 0:
            pygame.draw.circle(screen, (255, 220, 80), (p["x"], p["y"]), 4)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

サウンドとゲームの手応えのすべてのレッスン

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