烟花绽放是一个经典的视觉效果,通过 Python 和 Matplotlib,我们可以轻松实现动态的烟花动画效果。本篇文章将教你如何实现多个不同速度、位置的烟花动画,让它们在屏幕上绚丽绽放,占满整个画布。
多个烟花随机从屏幕不同位置升空。
烟花绽放时,粒子以随机颜色和方向扩散。
不同烟花有快有慢,呈现出真实的烟花表演效果。
代码实现
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import matplotlib
matplotlib.use('TkAgg') # 确保兼容后端
我们使用 numpy 来处理随机数和数组操作,matplotlib 来绘制动画。
fig, ax = plt.subplots()
ax.set_xlim(-2, 2) # 横向范围
ax.set_ylim(0, 3) # 纵向范围
ax.set_aspect('equal')
ax.axis('off')
num_fireworks = 5 # 烟花数量
num_particles = 300 # 每个烟花的粒子数量
lifetime = 150 # 每个烟花的总生命周期
firework_intervals = np.random.randint(30, 60, num_fireworks) # 烟花触发间隔
firework_positions = np.random.uniform(-1.5, 1.5, (num_fireworks, 2)) # 烟花初始位置 (x, y)
firework_lifetimes = np.random.randint(100, 200, num_fireworks) # 每个烟花的寿命
firework_rising_speeds = np.random.uniform(0.02, 0.1, num_fireworks) # 烟花上升速度
particles_x = np.zeros((num_fireworks, num_particles)) # 粒子x坐标
particles_y = np.zeros((num_fireworks, num_particles)) # 粒子y坐标
particles_dx = np.zeros((num_fireworks, num_particles)) # 粒子x速度
particles_dy = np.zeros((num_fireworks, num_particles)) # 粒子y速度
particles_colors = np.random.rand(num_fireworks, num_particles, 3) # 每个粒子随机颜色
scatters = [ax.scatter(particles_x[i], particles_y[i], s=10, c=particles_colors[i], alpha=1) for i in range(num_fireworks)]
我们为每个烟花定义了粒子的初始坐标、速度以及随机颜色。
def update(frame):
for i in range(num_fireworks):
firework_lifetime = firework_lifetimes[i]
cycle_frame = frame % firework_lifetime # 当前烟花的相对帧数
x, y = firework_positions[i] # 烟花的初始位置
if cycle_frame < firework_intervals[i]:
# 烟花上升阶段
particles_x[i][:] = x # 固定横向位置
particles_y[i][:] = y + cycle_frame * firework_rising_speeds[i] # 垂直方向上升
scatters[i].set_sizes(np.full(num_particles, 10)) # 固定粒子尺寸
scatters[i].set_alpha(1.0) # 完全不透明
else:
# 绽放阶段
explosion_frame = cycle_frame - firework_intervals[i] # 绽放阶段的帧数
explosion_duration = firework_lifetime - firework_intervals[i]
if explosion_frame == 0:
# 初始化粒子速度和角度
angles = np.random.uniform(0, 2 * np.pi, num_particles)
speeds = np.random.uniform(0.3, 1.5, num_particles)
particles_dx[i][:] = speeds * np.cos(angles)
particles_dy[i][:] = speeds * np.sin(angles)
# 更新粒子位置
particles_x[i] += particles_dx[i] * 0.1
particles_y[i] += particles_dy[i] * 0.1
# 计算衰减
decay = explosion_frame / explosion_duration
scatters[i].set_sizes(50 * (1 - decay) * np.ones(num_particles)) # 粒子尺寸逐渐减小
scatters[i].set_alpha(1 - decay) # 透明度逐渐衰减
# 更新粒子位置
scatters[i].set_offsets(np.c_[particles_x[i], particles_y[i]])
return scatters
如果你喜欢这篇文章,可以点个 赞 或 收藏,后续我会持续分享更多有趣的Python小项目,包括动态图形、小游戏开发和数据可视化,欢迎关注!
《Python无限弹窗小程序:给你一个流氓表白小妙招!》
《教你用Python写出浪漫的表白代码》
《Python浪漫的烟花表白特效》
《Python制作动态爱心粒子特效》
《如何用Python实现丝滑粒子爱心特效,惊艳朋友圈!》