文章目录
- 写在前面
- 系列文章
- 项目架构
- 技术需求
- 主要代码
- 创作流程
- 写在后面
写在前面
用Python点燃一场永不落幕的新春烟花秀
系列文章
| 序号 | 文章目录 | 直达链接 | |
| 炫酷系列 | |||
| 1 | 无法拒绝的表白界面 | https://want595.blog.csdn.net/article/details/134744894 | |
| 2 | 满屏飘字表白代码 | https://want595.blog.csdn.net/article/details/135037388 | |
| 3 | 无限弹窗表白代码 | https://want595.blog.csdn.net/article/details/134744711 | |
| 4 | 李峋同款可写字版跳动的爱心 | https://want595.blog.csdn.net/article/details/134744191 | |
| 5 | 流星雨 | https://want595.blog.csdn.net/article/details/134747408 | |
| 6 | 漂浮爱心 | https://want595.blog.csdn.net/article/details/134744929 | |
| 7 | 爱心光波 | https://want595.blog.csdn.net/article/details/134747365 | |
| 8 | 玫瑰花 | https://want595.blog.csdn.net/article/details/134747447 | |
| 节日系列 | |||
| 1 | 新春/跨年 | 烟花秀① | https://want595.blog.csdn.net/article/details/128727394 |
| 烟花秀② | https://want595.blog.csdn.net/article/details/135042880 | ||
| 粒子烟花 | https://want595.blog.csdn.net/article/details/136029420 | ||
| 2 | 圣诞节 | 圣诞礼物 | https://want595.blog.csdn.net/article/details/135336583 |
| 圣诞树① | https://want595.blog.csdn.net/article/details/128428985 | ||
| 圣诞树② | https://want595.blog.csdn.net/article/details/135048607 | ||
| 圣诞树③ | https://want595.blog.csdn.net/article/details/135043042 | ||
| 3 | 冬至 | 大雪纷飞 | https://want595.blog.csdn.net/article/details/128806017 |
| 4 | 生日 | 生日蛋糕 | https://want595.blog.csdn.net/article/details/128739755 |
| 5 | 儿童节 | 五彩气球 | https://want595.blog.csdn.net/article/details/128741043 |
| 6 | 国庆节 | 国庆祝福 | https://want595.blog.csdn.net/article/details/128740923 |
| 7 | 万圣节 | 万圣礼物 | https://want595.blog.csdn.net/article/details/128734395 |
| 8 | 愚人节 | 愚人代码 | https://want595.blog.csdn.net/article/details/128696990 |
| 9 | 中秋节 | 浪漫星空 | https://want595.blog.csdn.net/article/details/128737284 |
| 10 | 植树节 | 樱花树 | https://want595.blog.csdn.net/article/details/128700178 |
| 动漫系列 | |||
| 1 | 名侦探柯南系列 | 柯南 | https://want595.blog.csdn.net/article/details/134777613 |
| 2 | 喜羊羊与灰太狼系列 | 喜羊羊 | https://want595.blog.csdn.net/article/details/134778583 |
| 懒羊羊 | https://want595.blog.csdn.net/article/details/134847642 | ||
| 灰太狼 | https://want595.blog.csdn.net/article/details/135335303 | ||
| 小灰灰 | https://want595.blog.csdn.net/article/details/135335445 | ||
| 小香香 | https://want595.blog.csdn.net/article/details/135056783 | ||
| 3 | 海绵宝宝系列 | 海绵宝宝 | https://want595.blog.csdn.net/article/details/134847364 |
| 4 | 哆啦A梦系列 | 哆啦A梦 | https://want595.blog.csdn.net/article/details/135037884 |
| 5 | HelloKitty系列 | hellokitty | https://want595.blog.csdn.net/article/details/135337732 |
| 6 | Tom&Jerry系列 | Tom&Jerry | https://want595.blog.csdn.net/article/details/135337775 |
| 7 | 草莓熊系列 | 草莓熊 | https://want595.blog.csdn.net/article/details/135337832 |
| 8 | 皮卡丘系列 | 皮卡丘① | https://want595.blog.csdn.net/article/details/135337911 |
| 皮卡丘② | https://want595.blog.csdn.net/article/details/135337937 | ||
| 皮卡丘③ | https://want595.blog.csdn.net/article/details/135337947 | ||
| 其它 | |||
| 1 | 一闪一闪亮星星系列 | 张万森下雪了 | https://want595.blog.csdn.net/article/details/135336915 |
| 一闪一闪亮星星 | https://want595.blog.csdn.net/article/details/135337049 | ||
| 2 | 代码雨 | https://want595.blog.csdn.net/article/details/135054341 | |
| 3 | 七彩花朵 | https://want595.blog.csdn.net/article/details/135056670 | |
| 4 | 3D星空 | https://want595.blog.csdn.net/article/details/135056516 | |
| 5 | 金榜题名 | https://want595.blog.csdn.net/article/details/135056150 | |
| 6 | 满天星 | https://want595.blog.csdn.net/article/details/135056305 | |
| …… | |||
项目架构
技术需求
- Pygame引擎基础架构
- 环境初始化:通过
pygame.init()启动整个游戏引擎,确保图形、声音等模块正常运行,为视觉效果打下基础。 - 窗口配置:使用
set_mode创建固定尺寸画布(1200×700),并通过set_caption命名窗口标题,增强用户体验感。 - 帧率控制:引入
Clock对象控制每秒刷新次数(60FPS),保证动画流畅且不占用过多系统资源。
- 色彩与视觉表现设计
- 背景设定:将画布背景设为纯黑色(0,0,0),模拟深邃夜空,突出烟花的明亮与绚丽。
- 随机配色机制:利用
random.randint生成RGB三通道颜色值,使每一朵烟花都拥有独一无二的视觉风格,增强节日氛围的多样性。 - 文字渲染:采用系统字体
Comic Sans MS显示“Happy New Year!”祝福语,白色字体居中呈现,传递温暖喜庆的情感。
- 粒子系统建模
- 粒子类封装:每个烟花粒子包含位置、速度、颜色、生命周期和重力加速度等属性,模拟真实物理运动轨迹。
- 运动动力学:通过三角函数计算初速度的水平与垂直分量,并在更新过程中持续增加竖直方向速度(模拟重力下坠),实现自然的抛物线运动。
- 生命周期管理:每帧递减粒子生命值,当生命耗尽后停止绘制,形成短暂而璀璨的视觉效果。
- 面向对象的烟花结构
- 烟花类设计:
Firework类负责管理一组粒子,在特定坐标爆炸并释放预设数量的粒子,形成放射状绽放效果。 - 爆炸逻辑:仅在首次触发时生成粒子群,避免重复创建,提升性能效率。
- 扩散角度控制:支持自定义扩散范围(默认360度全向),可扩展为扇形或定向喷射效果。
- 动态动画与交互机制
- 主循环驱动:通过
while running持续刷新画面,实现实时动态渲染。 - 随机触发机制:利用
random.random() < 0.3概率控制新烟花生成频率,模拟现实中不定时燃放的真实感。 - 逐帧更新与绘制:对所有现存烟花及其粒子进行逐帧更新和绘制,保持画面连贯性。
- 性能优化与体验调整
- 延迟控制:加入
time.sleep(0.05)轻微延时,减缓程序运行节奏,便于观察烟花细节,提升观赏性。 - 内存管理:虽未显式清理已消失的烟花,但通过生命周期控制有效减少无效绘制,维持运行稳定性。
主要代码
importpygameimportrandomimportmathimporttime# 初始化Pygamepygame.init()# 常量SCREEN_WIDTH=1200SCREEN_HEIGHT=700BACKGROUND_COLOR=(0,0,0)# 黑色FPS=60# 设置屏幕screen=pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))pygame.display.set_caption('新春烟花')# 使用系统默认字体设置字体font=pygame.font.SysFont("Comic Sans MS",100)text_color=(255,255,255)# 白色# 粒子类classParticle:def__init__(self,x,y,color,angle,speed,life):self.x=x self.y=y self.color=color self.angle=angle self.speed=speed self.life=life self.radius=2self.vx=math.cos(angle)*speed self.vy=math.sin(angle)*speed self.gravity=0.1defupdate(self):self.x+=self.vx self.y+=self.vy self.vy+=self.gravity self.life-=1defdraw(self,surface):ifself.life>0:pygame.draw.circle(surface,self.color,(int(self.x),int(self.y)),self.radius)# 烟花类classFirework:def__init__(self,x,y):self.x=x self.y=y self.particles=[]self.exploded=Falsedefexplode(self):ifnotself.exploded:num_particles=random.randint(80,120)for_inrange(num_particles):angle=random.uniform(0,math.pi*2)speed=random.uniform(2,6)life=random.randint(30,60)r=random.randint(50,255)g=random.randint(50,255)b=random.randint(50,255)color=(r,g,b)self.particles.append(Particle(self.x,self.y,color,angle,speed,life))self.exploded=Truedefupdate(self):ifnotself.exploded:self.y-=8# 上升阶段ifself.y<=random.randint(200,500):# 随机高度爆炸self.explode()else:forparticleinself.particles[:]:particle.update()ifparticle.life<=0:self.particles.remove(particle)defdraw(self,surface):ifnotself.exploded:pygame.draw.circle(surface,(255,255,255),(int(self.x),int(self.y)),3)else:forparticleinself.particles:particle.draw(surface)……创作流程
我设计这段代码时,心中装着的是除夕夜那片被烟花点亮的天空。我想用代码还原那种瞬间爆发的美——那一声巨响后,光点冲上云霄,然后轰然绽放,洒下漫天星雨。那种美是短暂的,却深深烙印在记忆里。于是,我决定用程序来复刻这份感动,不只是画几朵花,而是让整个屏幕都成为节日的舞台。
一开始,我选择了Pygame这个工具,因为它既能处理图形渲染,又能精确控制每一帧的动画节奏,非常适合做这种动态视觉效果。我把画布设为宽屏比例,黑色背景如同静谧的夜空,等待第一束光芒划破寂静。我知道,真正的主角是烟花,但我也想让人感受到“节日”的气息,所以我在画面中央加上了“Happy New Year!”的文字,用圆润活泼的字体,像是孩子们写下的新年愿望,温暖又真挚。
接下来,我开始思考如何让烟花“活”起来。如果只是静态图片,那就失去了灵魂。我决定从最基础的粒子系统入手——每一颗烟花,其实都是由无数微小的光点组成。于是我创建了一个粒子类,它不只是一个圆点,而是有位置、有速度、有方向、有生命的存在。它会飞,会减速,会因为重力慢慢下坠,最后悄然熄灭。这个过程虽然只有几十帧,但我希望它像真实世界一样,有始有终。
然后是烟花本身的结构。我把它设计成一个“容器”,在合适的时机“爆炸”,释放出上百个粒子。这些粒子朝四面八方飞散,角度随机,速度不一,有的快有的慢,有的高有的低,这样才不会显得机械。我加入了颜色随机性,让每一次绽放都像是一次全新的惊喜——有时是热烈的红,有时是梦幻的紫,有时是耀眼的金,仿佛整个夜空都在庆祝。
为了让整个场景更自然,我没有让烟花整齐划一地出现,而是设置了随机触发机制。它们会在你不经意间突然升起,然后在高空炸开,像是远方某户人家正在欢庆。这种不可预测性,反而让画面更有生命力。我还特意加了一点延时,让眼睛能跟上每一场绽放的节奏,不错过任何一瞬的辉煌。
在整个创作过程中,我不断调试重力的大小、粒子的数量、生命的长短,甚至字体的位置和大小,只为找到那个最舒服的平衡点——既不过于密集让人眼花缭乱,也不至于稀疏到冷清。我希望每一个看到这个程序的人,哪怕只是短短几秒,也能感受到一丝新年的喜悦,仿佛耳边响起了鞭炮声,空气中弥漫着团圆的味道。
这不仅仅是一段代码,它是我对节日的记忆,是对光与希望的致敬。当屏幕上一朵朵烟花接连升起,我知道,我点燃的不只是像素,还有心里那份久违的童真。
写在后面
Vibe Coding · 用代码营造氛围,让技术拥有情绪。