パーティクルとは
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)パーティクルには画像もクラスもありません。処理コストが低いため、ゲーム内に一度に何百個も登場させることができます。
チャレンジ
簡単中央にある灰色の発射器から火花を飛ばしましょう。
- Spaceキーが押されたら、
{"x": 240, "y": 180, "vx": 2, "vy": -3, "life": 30}をparticlesに追加します。 - 各フレームで、各粒子を
vxとvyの値だけ移動させ、lifeを1減らします。 - 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プレイグラウンド