首页 前端知识 Python跨年烟花

Python跨年烟花

2025-03-08 14:03:57 前端知识 前端哥 178 34 我要收藏

目录

系列文章

写在前面

技术需求

完整代码

下载代码

代码分析

1. 程序初始化与显示设置

2. 烟花类 (Firework)

3. 粒子类 (Particle)

4. 痕迹类 (Trail)

5. 烟花更新与显示

6. 主函数 (fire)

7. 游戏循环

8. 总结

注意事项

写在后面


系列文章

序号直达链接
爱心系列
1Python制作一个无法拒绝的表白界面
2Python满屏飘字表白代码
3Python无限弹窗满屏表白代码
4Python李峋同款可写字版跳动的爱心
5Python流星雨代码
6Python漂浮爱心代码
7Python爱心光波代码
8Python普通的玫瑰花代码
9Python炫酷的玫瑰花代码
10Python多彩的玫瑰花代码
节日系列
1Python动漫风烟花秀代码
2Python新年烟花秀代码
3Python圣诞礼物代码
4Python画圣诞树代码
5Python可爱版圣诞树丨绿色
6Python可爱版圣诞树丨粉色
7Python大雪纷飞代码
8Python生日蛋糕代码
9Python五彩气球代码
10Python国庆祝福代码
11Python万圣礼物代码
12Python愚人节礼物代码
13Python浪漫星空代码
14Python樱花树代码
动漫系列
1Python名侦探柯南
2Python喜羊羊
3Python懒羊羊
4Python沸羊羊
5Python小灰灰
6Python小香香
7Python灰太狼
8Python海绵宝宝
9Python哆啦A梦
10Python凯蒂猫
11Python猫和老鼠
12Python草莓熊
13Python迷你皮卡丘
14Python高级皮卡丘
15Python豪华皮卡丘
16Python史迪仔
17Python小熊猫
18Python蜘蛛侠
19Python可爱版蜡笔小新
20Python萌萌的蜡笔小新
21Python罗小黑
22Python猪猪侠
炫酷系列
1  Python张万森下雪了
2Python一闪一闪亮晶晶
3Python黑客帝国代码雨
4Python七彩花朵
5Python模拟3D星空
6Python金榜题名
7Python满天星

写在前面

Python语言实现新年烟花秀的完整代码。

技术需求

  1. Pygame 库Pygame 是 Python 的一个游戏开发库,用于制作视频游戏和图形应用程序。在此代码中,Pygame 被用来创建图形界面、绘制图形、处理用户输入和管理时间(帧率)。通过 pg.init() 初始化 Pygame,pg.display.set_mode() 创建屏幕,pg.draw.circle() 绘制圆形等操作。

  2. 随机数生成:代码广泛使用了 Python 的 random 库来生成随机数,这些随机数控制了烟花和粒子的颜色、速度、方向、爆炸大小等。ra.randint()ra.uniform() 用于生成随机的整数和浮动数值,模拟烟花的自然和不确定性。

  3. 物理模拟:在代码中,物理效果主要体现在重力和粒子的运动上。使用 Pygame 提供的 Vector2 类来表示粒子的二维坐标和速度,模拟烟花粒子的运动和加速度。通过 apply_force()move() 方法,粒子会受重力等外力影响,产生自然的运动轨迹。

  4. 粒子系统:烟花爆炸产生的效果是通过粒子系统实现的。每个烟花爆炸时会生成多个粒子对象,每个粒子都有自己的颜色、大小、速度和生命周期。粒子不断地移动并逐渐衰退,最终消失。粒子系统模拟了真实世界中烟花散开后的效果。

  5. 路径追踪(Trail):每个粒子都有一个尾迹(Trail),在移动过程中,粒子在自己的路径上留下痕迹,这种效果通过记录粒子之前的多个位置来实现。Trail 类用于生成和显示粒子的路径。尾迹颜色和大小逐渐变化,模拟烟花轨迹逐渐消失的效果。

  6. 图形渲染:通过 Pygame 提供的 pg.draw.circle()screen.blit() 方法,代码绘制了粒子、烟花和文本。screen.fill() 用于填充背景色,确保每一帧都能清除掉前一帧的内容。每个粒子和烟花的显示由 show() 方法控制,确保它们在屏幕上正确呈现。

  7. 动态文本渲染:使用 pg.font.SysFont()font.render() 渲染文本。代码将 "Happy New Year!" 文本以特定字体和颜色显示在屏幕中央,模拟节日庆祝的氛围。

  8. 事件处理和程序控制:代码通过 pg.event.get() 获取并处理 Pygame 中的事件。pg.QUIT 事件用于监听关闭窗口的操作。游戏的主循环中使用了 running 标志来控制程序是否继续运行。通过 clock.tick(99) 控制帧率,确保每秒运行 99 帧。

  9. 对象导向编程:代码采用了面向对象的编程方式,定义了多个类(如 FireworkParticleTrail)来封装烟花、粒子和痕迹的行为和属性。这种方式有助于代码的结构化和模块化,便于扩展和维护。

完整代码

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() 获取当前屏幕的分辨率, screenWidthscreenHeight 分别存储屏幕的宽度和高度,用于后续创建窗口时设置显示区域大小。

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)
转载请注明出处或者链接地址:https://www.qianduange.cn//article/22938.html
标签
pygame
评论
发布的文章

Lua与Unity交互

2025-03-08 14:03:36

Pygame介绍与游戏开发

2025-03-08 14:03:36

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!