Menu
CoddyTech

粒子爆发

本课属于 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 是被点击的位置。

challenge icon

挑战

中等

把单个粒子变成一团爆发的粒子。

  1. 点击时,在点击的位置添加 20 个粒子。
  2. 给每个粒子设置 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 在线编辑器