当前位置: 首页 > article >正文

[python] 过年燃放烟花

目录

新年祝福语

一、作品展示 

二、作品所用资源 

三、代码与资源说明 

四、代码库

五、完整代码 

六、总结 


新年祝福语

岁月总是悄然流转,让人感叹时间的飞逝,转眼间又快到了中国传统的新年(龙年)。

回首过去,我们经历了许多挑战,也收获了成长。展望未来,我们充满期待。

在这特别的时刻,我想对所有粉丝送上真挚祝福。愿新年带给你们无尽的快乐与幸福,健康与平安。

感谢你们的支持,新的一年我将继续努力创造更多精彩。

祝大家新年快乐!


一、作品展示 

以下是我用 [python] 制作的一个新年小作品,希望大家喜欢(龙年背景图是免费下载的)!

二、作品所用资源 

由于 pygame 本身不支持中文显示,所以需要自行下载中文字体,而其自带的数字字体不好看,所以也一并下载了(代码中的字体与背景图大家自行更换)

1. 小清新中文字体

2. 立体数字字体

3. 免费的背景图

三、代码与资源说明 

百度云盘完整资源下载:新年快乐

这里展示代码与资源存放位置,是为了方便大家看代码时容易理解其中的内容。 

 

四、代码库

本文主要用到了以下四个库。如果大家还没安装,可以 win + r 输入 cmd 安装。

pip install pygame
pip install random
pip install math
pip install os

五、完整代码 

以下是完整的代码。其中,爆竹音效我没有添加,但有预留实现接口,大家如果感兴趣可以网上找相应的音频文件,并且将已注释的接口打开来播放即可。

import pygame
import random
import math
import os

# 初始化pygame
pygame.init()

# 设置窗口大小和标题
screen_width, screen_height = 800, 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Fireworks")

# 加载动态背景图
bg_images = []
for i in range(1, 3):  # 替换为你的动态背景图文件名的范围
    image_path = f"D:\\share\\python\\HappNewYear\\pic\\dragon_animation_{i}.png"  # 替换为你的动态背景图路径
    image = pygame.image.load(image_path).convert()
    bg_images.append(image)

# 加载爆炸音效
# explosion_sound = pygame.mixer.Sound('explosion.wav')

# 定义烟花线条类
class FireworkParticle(pygame.sprite.Sprite):
    def __init__(self, x, y, color):
        super().__init__()
        self.color = color
        self.length = random.randint(5, 15)  # 线条长度
        self.angle = random.uniform(0, 2 * math.pi)
        self.speed = random.uniform(1, 5)
        self.dx = self.speed * math.cos(self.angle)
        self.dy = self.speed * math.sin(self.angle)
        self.gravity = 0.1
        self.x = x
        self.y = y

    def update(self):
        self.x += self.dx
        self.y += self.dy
        self.dy += self.gravity

    def draw(self, screen):
        end_x = self.x + self.length * math.cos(self.angle)
        end_y = self.y + self.length * math.sin(self.angle)
        pygame.draw.line(screen, self.color, (self.x, self.y), (end_x, end_y), 2)  # 绘制线条

# 颜色列表
colors = [(253, 215, 88), (254, 254, 252), (255, 255, 217), (252, 253, 249), (248, 247, 106), (255, 255, 162)]

# 字体显示
font_path = os.path.join(os.path.dirname(__file__), 'font_ttf\\xiaoqingxin.ttf')
zn_font = pygame.font.Font(font_path, 100)
def font_show(font, string, color):
    text = font.render(string, True, color)
    text_rect = text.get_rect(center=(screen_width // 2, screen_height // 2))
    screen.blit(text, text_rect)

# 烟花爆炸函数
def explode(x, y, timeout):
    # explosion_sound.play()  # 播放爆炸音效

    particles = pygame.sprite.Group()
    for _ in range(1000): #燃放的烟火密度,值越大越好看
        color = random.choice(colors)
        particle = FireworkParticle(x, y, color)  # 烟花燃放位置
        particles.add(particle)

    # 爆炸动画循环
    current_bg_image = 0  # 当前显示的背景图索引
    last_explode_time = pygame.time.get_ticks()
    while True:
        current_time = pygame.time.get_ticks()
        if current_time - last_explode_time >= timeout:
            break  # 退出循环

        particles.update()

        # 切换背景图
        if current_time % 50 == 0:  # 每50毫秒切换一次背景图
            current_bg_image = (current_bg_image + 1) % len(bg_images)
        screen.blit(bg_images[current_bg_image], (0, 0)) # 绘制背景图

        font_show(zn_font, "龙年行大运", (255, 0, 0))
        for particle in particles:
            particle.draw(screen)  # 绘制烟花粒子

        pygame.display.flip()  # 更新屏幕显示
        pygame.time.Clock().tick(60)  # 控制帧率

    # explosion_sound.stop()  # 停止音效

# 显示新年倒数
def countdown():
    screen.fill((255, 0, 0))  # 清空屏幕
    font_show(zn_font, "跨年倒数", (255, 215, 0))
    pygame.display.flip()  # 更新屏幕显示
    pygame.time.delay(1000)  # 延迟1秒

    # font = pygame.font.Font(None, 100)
    font_path = os.path.join(os.path.dirname(__file__), 'font_ttf\\Antology.ttf')
    font = pygame.font.Font(font_path, 100)
    countdown_time = 3  # 倒数时间
    last_countdown_time = pygame.time.get_ticks()
    while countdown_time > 0:
        current_time = pygame.time.get_ticks()
        if current_time - last_countdown_time >= 1000:
            last_countdown_time = current_time
            countdown_time -= 1

        screen.fill((255, 0, 0))  # 清空屏幕
        font_show(font, str(countdown_time), (255, 215, 0))
        pygame.display.flip()  # 更新屏幕显示
        pygame.time.Clock().tick(60)  # 控制帧率

    screen.fill((255, 0, 0))  # 清空屏幕
    font_show(zn_font, "积步千里祝大家", (255, 215, 0))
    pygame.display.flip()  # 更新屏幕显示
    pygame.time.delay(1000)  # 延迟1秒

    screen.fill((255, 0, 0))  # 清空屏幕
    font_show(zn_font, "新年快乐", (255, 215, 0))
    pygame.display.flip()  # 更新屏幕显示
    pygame.time.delay(1000)  # 延迟1秒

# 主程序循环
running = True
auto_explode_interval = 2000  # 自动循环燃放的时间间隔(毫秒)
last_explode_time = pygame.time.get_ticks()

countdown()  # 显示新年倒数

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    current_time = pygame.time.get_ticks()
    if current_time - last_explode_time >= auto_explode_interval:
        last_explode_time = current_time
        x_offset = screen_width // 2 - 240
        y_offset = screen_height
        for i in range(4):
            x_offset += (i * 80)
            y_offset = screen_height // (2 + i)
            explode(x_offset, y_offset, 2000)

    pygame.display.flip()  # 更新屏幕显示
    pygame.time.Clock().tick(60)  # 控制帧率

# 退出pygame
pygame.quit()

六、总结 

至此,本文内容已全部讲解完毕。祝愿大家在新的一年里龙腾虎跃,龙行天下,龙凤呈祥! 


http://www.kler.cn/a/228453.html

相关文章:

  • Asp.Net Core 8.0 使用 Serilog 按日志级别写入日志文件的两种方式
  • sql实战解析-sum()over(partition by xx order by xx)
  • 【JVM-9】Java性能调优利器:jmap工具使用指南与应用案例
  • 数据结构之堆排序
  • 【Node.js]
  • EXCEL的一些用法记录
  • Redis渗透SSRF的利用
  • 使用sql创建数据库以及常用的sql简介
  • Maven提示Failure to find com.oracle:ojdbc14:jar:10.2.0.4.0
  • VScode+PlatformIO 物联网Iot开发平台环境搭建
  • 靶机实战bwapp亲测xxe漏洞攻击及自动化XXE注射工具分析利用
  • 网易和腾讯面试题精选---缓存面试问题和答案
  • MTK8365安卓核心板_联发科MT8365(Genio 350)核心板规格参数
  • XML:可扩展标记语言
  • jQuery---获取元素的个数
  • 跟着cherno手搓游戏引擎【21】shaderLibrary(shader管理类)
  • Python信息安全库之fsociety使用详解
  • LabVIEW与EtherCAT实现风洞安全联锁及状态监测
  • HTML+CSS:导航栏组件
  • 深入理解Istio服务网格(一)数据平面Envoy
  • IDEA新建文件夹后右击不能创建class类排错方法
  • 操作系统-进程互斥的软件实现方法(单标志法 双标志先检查法 双标志后检查法 Peterson算法)
  • Linux校准时间 Centos
  • UE4 C++ UGameInstance实例化
  • vue项目中的 .env.development 文件怎么编写
  • GPT-4是什么?如何使用GPT-4?