目录
[1. 程序初始化与显示设置](#1. 程序初始化与显示设置)
[2. 烟花类 (Firework)](#2. 烟花类 (Firework))
[3. 粒子类 (Particle)](#3. 粒子类 (Particle))
[4. 痕迹类 (Trail)](#4. 痕迹类 (Trail))
[5. 烟花更新与显示](#5. 烟花更新与显示)
[6. 主函数 (fire)](#6. 主函数 (fire))
[7. 游戏循环](#7. 游戏循环)
[8. 总结](#8. 总结)
系列文章
|--------|------------------------------------------------------------------------------------------------------|
| 序号 | 直达链接 |
| 爱心系列 ||
| 1 | Python制作一个无法拒绝的表白界面 |
| 2 | Python满屏飘字表白代码 |
| 3 | Python无限弹窗满屏表白代码 |
| 4 | Python李峋同款可写字版跳动的爱心 |
| 5 | Python流星雨代码 |
| 6 | Python漂浮爱心代码 |
| 7 | Python爱心光波代码 |
| 8 | Python普通的玫瑰花代码 |
| 9 | Python炫酷的玫瑰花代码 |
| 10 | Python多彩的玫瑰花代码 |
| 节日系列 ||
| 1 | Python动漫风烟花秀代码 |
| 2 | Python新年烟花秀代码 |
| 3 | Python圣诞礼物代码 |
| 4 | Python画圣诞树代码 |
| 5 | Python可爱版圣诞树丨绿色 |
| 6 | Python可爱版圣诞树丨粉色 |
| 7 | Python大雪纷飞代码 |
| 8 | Python生日蛋糕代码 |
| 9 | Python五彩气球代码 |
| 10 | Python国庆祝福代码 |
| 11 | Python万圣礼物代码 |
| 12 | Python愚人节礼物代码 |
| 13 | Python浪漫星空代码 |
| 14 | Python樱花树代码 |
| 动漫系列 ||
| 1 | Python名侦探柯南 |
| 2 | Python喜羊羊 |
| 3 | Python懒羊羊 |
| 4 | Python沸羊羊 |
| 5 | Python小灰灰 |
| 6 | Python小香香 |
| 7 | Python灰太狼 |
| 8 | Python海绵宝宝 |
| 9 | Python哆啦A梦 |
| 10 | Python凯蒂猫 |
| 11 | Python猫和老鼠 |
| 12 | Python草莓熊 |
| 13 | Python迷你皮卡丘 |
| 14 | Python高级皮卡丘 |
| 15 | Python豪华皮卡丘 |
| 16 | Python史迪仔 |
| 17 | Python小熊猫 |
| 18 | Python蜘蛛侠 |
| 19 | Python可爱版蜡笔小新 |
| 20 | Python萌萌的蜡笔小新 |
| 21 | Python罗小黑 |
| 22 | Python猪猪侠 |
| 炫酷系列 ||
| 1 | Python张万森下雪了 |
| 2 | Python一闪一闪亮晶晶 |
| 3 | Python黑客帝国代码雨 |
| 4 | Python七彩花朵 |
| 5 | Python模拟3D星空 |
| 6 | Python金榜题名 |
| 7 | Python满天星 |
写在前面
Python语言实现新年烟花秀的完整代码。
技术需求
-
Pygame 库 :Pygame 是 Python 的一个游戏开发库,用于制作视频游戏和图形应用程序。在此代码中,Pygame 被用来创建图形界面、绘制图形、处理用户输入和管理时间(帧率)。通过
pg.init()
初始化 Pygame,pg.display.set_mode()
创建屏幕,pg.draw.circle()
绘制圆形等操作。 -
随机数生成 :代码广泛使用了 Python 的
random
库来生成随机数,这些随机数控制了烟花和粒子的颜色、速度、方向、爆炸大小等。ra.randint()
和ra.uniform()
用于生成随机的整数和浮动数值,模拟烟花的自然和不确定性。 -
物理模拟 :在代码中,物理效果主要体现在重力和粒子的运动上。使用 Pygame 提供的
Vector2
类来表示粒子的二维坐标和速度,模拟烟花粒子的运动和加速度。通过apply_force()
和move()
方法,粒子会受重力等外力影响,产生自然的运动轨迹。 -
粒子系统:烟花爆炸产生的效果是通过粒子系统实现的。每个烟花爆炸时会生成多个粒子对象,每个粒子都有自己的颜色、大小、速度和生命周期。粒子不断地移动并逐渐衰退,最终消失。粒子系统模拟了真实世界中烟花散开后的效果。
-
路径追踪(Trail) :每个粒子都有一个尾迹(Trail),在移动过程中,粒子在自己的路径上留下痕迹,这种效果通过记录粒子之前的多个位置来实现。
Trail
类用于生成和显示粒子的路径。尾迹颜色和大小逐渐变化,模拟烟花轨迹逐渐消失的效果。 -
图形渲染 :通过 Pygame 提供的
pg.draw.circle()
和screen.blit()
方法,代码绘制了粒子、烟花和文本。screen.fill()
用于填充背景色,确保每一帧都能清除掉前一帧的内容。每个粒子和烟花的显示由show()
方法控制,确保它们在屏幕上正确呈现。 -
动态文本渲染 :使用
pg.font.SysFont()
和font.render()
渲染文本。代码将 "Happy New Year!" 文本以特定字体和颜色显示在屏幕中央,模拟节日庆祝的氛围。 -
事件处理和程序控制 :代码通过
pg.event.get()
获取并处理 Pygame 中的事件。pg.QUIT
事件用于监听关闭窗口的操作。游戏的主循环中使用了running
标志来控制程序是否继续运行。通过clock.tick(99)
控制帧率,确保每秒运行 99 帧。 -
对象导向编程 :代码采用了面向对象的编程方式,定义了多个类(如
Firework
、Particle
和Trail
)来封装烟花、粒子和痕迹的行为和属性。这种方式有助于代码的结构化和模块化,便于扩展和维护。
完整代码
python
import pygame as pg
import random as ra
import math
pg.init()
pg.display.set_caption("🎇")
winScreen = pg.display.Info()
screenWidth = winScreen.current_w
screenHeight = winScreen.current_h
vector = pg.math.Vector2
trail_colors = [(45, 45, 45), (60, 60, 60), (75, 75, 75), (125, 125, 125), (150, 150, 150)]
# 烟花类
class Firework:
def __init__(self):
# 随机生成颜色
self.colour = (ra.randint(0, 255), ra.randint(0, 255), ra.randint(0, 255))
# 随机生成三种颜色
self.colours = (
(ra.randint(0, 255), ra.randint(0, 255), ra.randint(0, 255)),
(ra.randint(0, 255), ra.randint(0, 255), ra.randint(0, 255)),
(ra.randint(0, 255), ra.randint(0, 255), ra.randint(0, 255))
)
# 生成一个表示发射出的火花的粒子对象
self.firework = Particle(ra.randint(0,screenWidth), screenHeight, True, self.colour)
# 初始化爆炸状态为 False
self.exploded = False
self.particles = []
# 爆炸产生的粒子数量范围
self.min_max_particles = vector(666, 999)
def update(self, win):
g = vector(0, ra.uniform(0.15, 0.4))
if not self.exploded:
# 给发射出的火花施加重力
self.firework.apply_force(g)
self.firework.move()
for tf in self.firework.trails:
tf.show(win)
self.show(win)
if self.firework.vel.y >= 0:
self.exploded = True
self.explode()
else:
for particle in self.particles:
# 给爆炸产生的粒子施加随机力
particle.apply_force(vector(g.x + ra.uniform(-1, 1) / 20, g.y / 2 + (ra.randint(1, 8) / 100)))
particle.move()
for t in particle.trails:
t.show(win)
particle.show(win)
def explode(self):
amount = ra.randint(int(self.min_max_particles.x), int(self.min_max_particles.y))
for i in range(amount):
# 在爆炸位置生成粒子对象并添加到粒子列表中
self.particles.append(Particle(self.firework.pos.x, self.firework.pos.y, False, self.colours))
def show(self, win):
# 绘制发射出的火花
pg.draw.circle(win, self.colour, (int(self.firework.pos.x), int(self.firework.pos.y)), self.firework.size)
def remove(self):
if self.exploded:
for p in self.particles:
if p.remove is True:
self.particles.remove(p)
if len(self.particles) == 0:
return True
else:
return False
......
下载代码
下载链接:https://pan.quark.cn/s/b5eb09ad9065
代码分析
这段代码是使用 Python 和 Pygame 库实现的一个烟花动画程序。其主要功能是模拟烟花在屏幕上绽放的效果,结合了粒子系统和动态效果,通过类和方法进行模块化设计,具有较强的可扩展性。以下是对这段代码的详细分析,分为几个部分:程序初始化、类设计、粒子和火花效果的实现、显示与更新的过程以及主函数的运行机制。
1. 程序初始化与显示设置
程序开始时调用 pg.init()
来初始化 Pygame 库,这个调用非常关键,它会为所有 Pygame 模块做好初始化工作。接着,使用 pg.display.set_caption("🎇")
设置窗口标题为烟花的表情符号(🎇)。然后,通过 pg.display.Info()
获取当前屏幕的分辨率, screenWidth
和 screenHeight
分别存储屏幕的宽度和高度,用于后续创建窗口时设置显示区域大小。
vector = pg.math.Vector2
用于简化代码中二维向量的运算。pg.math.Vector2
提供了对二维向量的支持,可以很方便地进行加法、减法、乘法等操作。
2. 烟花类 (Firework
)
class Firework:
def __init__(self):
self.colour = (ra.randint(0, 255), ra.randint(0, 255), ra.randint(0, 255))
self.colours = (
(ra.randint(0, 255), ra.randint(0, 255), ra.randint(0, 255)),
(ra.randint(0, 255), ra.randint(0, 255), ra.randint(0, 255)),
(ra.randint(0, 255), ra.randint(0, 255), ra.randint(0, 255))
)
self.firework = Particle(ra.randint(0,screenWidth), screenHeight, True, self.colour)
self.exploded = False
self.particles = []
self.min_max_particles = vector(666, 999)
Firework
类是整个烟花效果的核心。该类模拟了烟花从发射到爆炸的全过程。在构造函数中,首先随机生成烟花的颜色 self.colour
,并且生成三种不同的颜色 self.colours
,这些颜色将在爆炸后用于粒子的显示。
self.firework = Particle(ra.randint(0,screenWidth), screenHeight, True, self.colour)
创建了一个粒子对象,模拟烟花发射时的火花。self.exploded
用于标记烟花是否已经爆炸,self.particles
存储爆炸后的所有粒子。self.min_max_particles
表示爆炸后产生粒子的数量范围。
3. 粒子类 (Particle
)
class Particle:
def __init__(self, x, y, firework, colour):
self.firework = firework
self.pos = vector(x, y)
self.origin = vector(x, y)
self.radius = 25
self.remove = False
self.explosion_radius = ra.randint(15, 25)
self.life = 0
self.acc = vector(0, 0)
self.trails = []
self.prev_posx = [-10] * 10
self.prev_posy = [-10] * 10
if self.firework:
self.vel = vector(0, -ra.randint(17, 20))
self.size = 5
self.colour = colour
for i in range(5):
self.trails.append(Trail(i, self.size, True))
else:
self.vel = vector(ra.uniform(-1, 1), ra.uniform(-1, 1))
self.vel.x *= ra.randint(7, self.explosion_radius + 2)
self.vel.y *= ra.randint(7, self.explosion_radius + 2)
self.size = ra.randint(2, 4)
self.colour = ra.choice(colour)
for i in range(5):
self.trails.append(Trail(i, self.size, False))
Particle
类代表了烟花中的单个粒子。它包含了烟花发射和爆炸过程中粒子的所有物理属性和视觉效果。
self.pos
是粒子的位置,self.origin
是初始位置。self.vel
和self.acc
分别表示粒子的速度和加速度,使用pg.math.Vector2
进行向量运算。self.trails
存储粒子的痕迹(烟花尾迹),它是一个列表,包含多个Trail
对象。self.life
控制粒子的生命周期,self.remove
标记粒子是否应该被移除。
在构造函数中,依据粒子是烟花发射出来的火花还是爆炸后的粒子,设置了不同的初速度、大小、颜色等属性。火花的速度较大,并且其尾迹动态显示;爆炸后的粒子速度较小,颜色随机。
4. 痕迹类 (Trail
)
Trail
类表示粒子尾迹的效果。在构造函数中,self.dynamic
用于区分动态尾迹和静态尾迹。动态尾迹的颜色和大小会随着时间变化,静态尾迹则显示为固定的颜色和较小的尺寸。
5. 烟花更新与显示
update
函数用于更新所有烟花的状态。它遍历每个烟花对象,调用其 update
方法来处理烟花的动画效果。如果某个烟花的所有粒子已经移除,则从 fireworks
列表中删除该烟花。
6. 主函数 (fire
)
fire
函数是程序的主入口,负责创建窗口、初始化时钟、设置烟花效果和显示文本。
首先,使用 pg.display.set_mode
创建窗口,并根据屏幕大小动态设置窗口的尺寸。接着,创建一个时钟对象 clock
,用于控制游戏的帧率。fireworks
列表初始化了两个烟花对象。文本部分使用 pg.font.SysFont
加载系统字体,生成一个显示"Happy New Year!"的文本,并计算文本在屏幕上的位置。
7. 游戏循环
while running:
clock.tick(99)
for event in pg.event.get():
if event.type == pg.QUIT:
running = False
screen.fill((20, 20, 30))
screen.blit(rendered_text, (text_x, text_y))
if ra.randint(0, 10) == 1:
fireworks.append(Firework())
update(screen, fireworks)
游戏进入主循环,每一帧更新烟花的状态并显示在屏幕上。通过 clock.tick(99)
控制帧率为 99 帧每秒。每次循环中,如果有退出事件,则终止程序。窗口背景色填充为深色 (20, 20, 30)
,然后绘制上一步计算出的文本。
在每一帧中,可能会随机生成新的烟花对象(通过 ra.randint(0, 10) == 1
来决定),然后更新所有烟花的显示效果。
8. 总结
这段代码通过精心设计的 Firework
、Particle
和 Trail
类,以及通过粒子系统模拟了烟花从发射到爆炸的过程。每个粒子都有自己的物理行为,如速度、加速度和尾迹效果,且随着时间的推移,粒子的生命周期逐渐结束,最终消失。这段代码不仅展示了烟花的动画效果,还包含了多种粒子动态效果,如随机颜色、速度、尾迹
注意事项
如遇到问题"no module named pygame ",请在终端输入"pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pygame",等待pygame库安装完成后再运行程序
写在后面
我是一只有趣的兔子,感谢你的喜欢!