粒子爆发
本课属于 Coddy Pygame 学习旅程的“音效与游戏体验”单元。第 9 课,共 23 课。
一个粒子就是一个点。粒子爆发是在同一帧、同一个位置生成的许多粒子,每个粒子都朝自己的方向飞去。用 for 循环创建它们,并为每个粒子设置随机速度:
for i in range(20):
particles.append({
"x": x,
"y": y,
"vx": random.uniform(-3, 3),
"vy": random.uniform(-3, 3),
"life": random.randint(20, 40),
})random.uniform(-3, 3) 会生成 -3 到 3 之间的随机小数,因此粒子可以朝任意方向移动,速度可快可慢。randint 只会生成整数,粒子爆发就会沿着几条直线飞出去。
随机函数调用必须放在循环内。如果在循环开始前只选择一次 vx,全部 20 个粒子就会获得相同的速度:它们会一起飞,像一个点一样。
随机的生命时长会让粒子爆发以不均匀的方式逐渐消失,看起来更自然:靠近中间的慢速粒子和边缘的快速粒子会在不同时间消失。
鼠标点击是一个 pygame.MOUSEBUTTONDOWN 事件,而 event.pos 是被点击的位置。
挑战
中等把单个粒子变成一团爆发的粒子。
- 点击时,在点击的位置添加 20 个粒子。
- 给每个粒子设置
vx和vy,值来自random.uniform(-3, 3),并设置一个来自random.randint(20, 40)的life值。
按“开始”并点击:火花会向四面八方飞散。然后点击“检查”。
亲手试试
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Fireworks")
clock = pygame.time.Clock()
particles = []
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
x, y = event.pos
particles.append({"x": x, "y": y, "vx": 0, "vy": -2, "life": 30})
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, 160, 60), (p["x"], p["y"]), 3)
pygame.display.flip()
clock.tick(60)
pygame.quit()
音效与游戏体验中的所有课
自己练习: Pygame 在线编辑器