目录
系列文章
写在前面
技术需求
完整代码
下载代码
代码分析
1. 程序初始化与显示设置
2. 烟花类 (Firework)
3. 粒子类 (Particle)
4. 痕迹类 (Trail)
5. 烟花更新与显示
6. 主函数 (fire)
7. 游戏循环
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
)来封装烟花、粒子和痕迹的行为和属性。这种方式有助于代码的结构化和模块化,便于扩展和维护。
完整代码
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)
复制