Menu
CoddyTech

パーティクルとは

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

火花、ほこり、煙、紙吹雪はパーティクルでできています。パーティクルは飛び散り、短い間存在して消えていく小さなものです。1つのパーティクルに必要なのは、位置、フレームごとの移動距離、残りの寿命を示す数値だけです。辞書にこれらを格納します。

{"x": 240, "y": 180, "vx": 2, "vy": -3, "life": 30}

vx と vy は速度です。フレームごとに右へ2ピクセル、上へ3ピクセル移動します。すべてのパーティクルを1つのリストに格納し、各フレームですべてを移動させ、寿命を1フレーム分減らします。

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

寿命が0より大きい間、各パーティクルを小さな円として描画します。

for p in particles:
    if p["life"] > 0:
        pygame.draw.circle(screen, (255, 160, 60), (p["x"], p["y"]), 3)

パーティクルには画像もクラスもありません。処理コストが低いため、ゲーム内に一度に何百個も登場させることができます。

challenge icon

チャレンジ

簡単

中央にある灰色の発射器から火花を飛ばしましょう。

  1. Spaceキーが押されたら、{"x": 240, "y": 180, "vx": 2, "vy": -3, "life": 30}をparticlesに追加します。
  2. 各フレームで、各粒子をvxとvyの値だけ移動させ、lifeを1減らします。
  3. lifeが0より大きい各粒子を、半径3のオレンジ色の(255, 160, 60)の円として描画します。

自分で試してみよう

import pygame

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

particles = []

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

    screen.fill((30, 30, 46))
    pygame.draw.circle(screen, (120, 120, 140), (240, 180), 8)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

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

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