Python生日祝福烟花

1. 实现效果

在这里插入图片描述

2. 素材加载

2个图片和3个音频
shoot(已去底).jpg

flower.jpg

shoot_image = pygame.image.load('shoot(已去底).jpg') # 加载拼接的发射图像
flower_image = pygame.image.load('flower.jpg')      # 加载拼接的烟花图 烟花不好去底
# 调整图像的像素为原图的1/2 因为图像相对于界面来说有些大
shoot_image = pygame.transform.scale(shoot_image, (shoot_image.get_size()[0]/2 ,shoot_image.get_size()[1]/2))
flower_image = pygame.transform.scale(flower_image, (flower_image.get_size()[0]/2 ,flower_image.get_size()[1]/2))
# 音频、音效
shoot_sound = pygame.mixer.Sound('shoot.mp3')
bomb_sound = pygame.mixer.Sound('bomb1.mp3')
bg_music = pygame.mixer.Sound('bg.mp3')

图像分块显示

# 每个部分的宽度
num_parts = 10  # 有10个shoot图
num_parts1 = 13 # 13个烟花
shoot_part_width = shoot_width // num_parts
flower_part_width = flower_width // num_parts1

在这里插入图片描述

3. 烟花发射

发射shoot图从底部往上,快到顶部变烟花flower,然后下落一段距离,最后消失。

在这里插入图片描述

4. 画面定格

处理鼠标点击事件以暂停和恢复动画
在这里插入图片描述

5. 完整代码

# 2024-12-01 Python简单的生日祝福烟花
import pygame # pip install pygame
import random
pygame.init()               # 初始化 pygame
WIDTH, HEIGHT = 750, 500    # 设置窗口尺寸
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("生日烟花祝福") # 窗口标题
#bg_image = pygame.image.load('bg.jpg')
shoot_image = pygame.image.load('shoot(已去底).jpg') # 加载拼接的发射图像
flower_image = pygame.image.load('flower.jpg')      # 加载拼接的烟花图 烟花不好去底
# 调整图像的像素为原图的1/2 因为图像相对于界面来说有些大
shoot_image = pygame.transform.scale(shoot_image, (shoot_image.get_size()[0]/2 ,shoot_image.get_size()[1]/2))
flower_image = pygame.transform.scale(flower_image, (flower_image.get_size()[0]/2 ,flower_image.get_size()[1]/2))
# 音频、音效
shoot_sound = pygame.mixer.Sound('shoot.mp3')
bomb_sound = pygame.mixer.Sound('bomb1.mp3')
bg_music = pygame.mixer.Sound('bg.mp3')
bg_music.play(-1) # 播放背景音乐
# 获取图像的宽度和高度
shoot_width, shoot_height = shoot_image.get_size()
flower_width, flower_height = flower_image.get_size()
# 每个部分的宽度
num_parts = 10  # 有10个shoot图
num_parts1 = 13 # 13个烟花
shoot_part_width = shoot_width // num_parts
flower_part_width = flower_width // num_parts1
class Firework: # 定义烟花类
    def __init__(self, x):
        self.x = x              # 使用提供的x坐标
        self.shoot_y = HEIGHT   # shoot初始y坐标在底部
        self.flower_y = 0       # flower初始位置上方
        self.shoot_active = True
        self.flower_active = False
        self.shoot_part_index = random.randint(0, num_parts - 1)    # 随机选择shoot的部分索引
        self.flower_part_index = random.randint(0, num_parts - 1)   # 随机选择flower的部分索引
        self.drop_height = 10                                       # 下落的高度(在达到顶部后下落一点)
        self.is_dropping = False                                    # 是否开始下落
        self.alpha = 255                                            # 透明度控制
    def shoot(self):
        if self.shoot_active:
            # 绘制随机选择的 shoot 图像部分
            screen.blit(shoot_image, (self.x, self.shoot_y),(self.shoot_part_index * shoot_part_width, 0, shoot_part_width, shoot_height))
            self.shoot_y -= 5  # 更新 shoot 的位置 向上移动
            if self.shoot_y >= shoot_height:
                shoot_sound.play() # 播放发射音效
            if self.shoot_y <= 20:  # 当 shoot 达到接近窗口顶部时,触发下落
                self.shoot_active = False
                self.flower_active = True
                self.flower_y = self.shoot_y + self.drop_height  # flower 下落一点
                self.is_dropping = True  # 标记为开始下落
        if self.flower_active:   # 绘制随机选择的 flower 图像部分
            bomb_sound.play()
            flower_surface = pygame.Surface((flower_part_width, flower_height), pygame.SRCALPHA)  # 创建带透明度的 surface
            flower_surface.blit(flower_image, (0, 0),(self.flower_part_index * flower_part_width, 0, flower_part_width, flower_height))
            flower_surface.set_alpha(self.alpha) # 设置透明度
            screen.blit(flower_surface, (self.x, self.flower_y))
            if self.is_dropping:
                self.flower_y += 1  # flower 向下移动
            if self.alpha > 0:
                self.alpha -= 5  # 逐步降低透明度
            else:
                self.flower_active = False  # 透明度为0时消失
clock = pygame.time.Clock()
fireworks = []
running = True
paused = False  # 初始化暂停状态为 False
font = pygame.font.Font(None, 74)   # 设置字体, 使用默认字体, 大小为74
text_color = (255, 192, 203)        # 文字颜色粉红色
birthday_text = font.render("Happy Birthday", True, text_color)        # 文本"生日快乐"
text_rect = birthday_text.get_rect(center=(WIDTH // 2, HEIGHT - 150))  # 文本位置
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        # 处理鼠标点击事件以暂停和恢复动画
        if event.type == pygame.MOUSEBUTTONDOWN:
            paused = not paused  # 切换暂停状态
    if not paused:
        # 每隔一段时间生成新烟花
        if random.random() < 0.01:  # 随机生成烟花 and len(fireworks) < 10
            # 随机选择 X 坐标,避免与已有烟花重叠
            new_firework_x = random.randint(0, WIDTH - shoot_part_width)
            overlap = any(abs(new_firework_x - firework.x) < shoot_part_width for firework in fireworks)
            if not overlap:     # 如果没有重叠,添加新烟花
                fireworks.append(Firework(new_firework_x))
        screen.fill((0, 0, 0))  # 填充黑色背景 #screen.blit(bg_image, (0, 0))
        for firework in fireworks:
            firework.shoot()
        screen.blit(birthday_text, text_rect) # 绘制生日文本
        pygame.display.flip()
        clock.tick(60) # 控制更新画面的速度
pygame.quit()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/952575.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

primitive 编写着色器材质

import { nextTick, onMounted, ref } from vue import * as Cesium from cesium import gsap from gsaponMounted(() > { ... })// 1、创建矩形几何体&#xff0c;Cesium.RectangleGeometry&#xff1a;几何体&#xff0c;Rectangle&#xff1a;矩形 let rectGeometry new…

【Linux-多线程】-线程安全单例模式+可重入vs线程安全+死锁等

一、线程安全的单例模式 什么是单例模式 单例模式是一种“经典的&#xff0c;常用的&#xff0c;常考的”设计模式 什么是设计模式 IT行业这么火&#xff0c;涌入的人很多.俗话说林子大了啥鸟都有。大佬和菜鸡们两极分化的越来越严重&#xff0c;为了让菜鸡们不太拖大佬的后…

C语言程序环境和预处理详解

本章重点&#xff1a; 程序的翻译环境 程序的执行环境 详解&#xff1a;C语言程序的编译链接 预定义符号介绍 预处理指令 #define 宏和函数的对比 预处理操作符#和##的介绍 命令定义 预处理指令 #include 预处理指令 #undef 条件编译 程序的翻译环境和执行环…

pytorch torch.isclose函数介绍

torch.isclose 是 PyTorch 中用于比较两个张量是否“近似相等”的函数。它主要用于判断两个张量的对应元素在数值上是否接近&#xff08;考虑了浮点数精度的可能误差&#xff09;。 函数定义 torch.isclose(input, other, rtol1e-05, atol1e-08, equal_nanFalse)参数说明 inpu…

springboot整合h2

在 Spring Boot 中整合 H2 数据库非常简单。H2 是一个轻量级的嵌入式数据库&#xff0c;非常适合开发和测试环境。以下是整合 H2 数据库的步骤&#xff1a; 1. 添加依赖 首先&#xff0c;在你的 pom.xml 文件中添加 H2 数据库的依赖&#xff1a; <dependency><grou…

RabbitMQ 可观测性最佳实践

RabbitMQ 简介 RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写&#xff0c;支持多种客户端。它通过使用交换机&#xff08;Exchanges&#xff09;、队列&#xff08;Queues&#xff09;和绑定&#xff08;Bindings&#xff09;来路由消息&#xff…

初识 Git——《Pro Git》

Why Git&#xff1f; 1. 本地版本控制系统 Why&#xff1a; 许多人习惯用复制整个项目目录的方式来保存不同的版本&#xff0c;或许还会改名加上备份时间以示区别。 这么做唯一的好处就是简单&#xff0c;但是特别容易犯错。 有时候会混淆所在的工作目录&#xff0c;一不小心…

C语言gdb调试

目录 1.gdb介绍 2.设置断点 2.1.测试代码 2.2.设置函数断点 2.3.设置文件行号断点 2.4.设置条件断点 2.5.多线程调试 3.删除断点 3.1.删除指定断点 3.2.删除全部断点 4.查看变量信息 4.1.p命令 4.2.display命令 4.3.watch命令 5.coredump日志 6.总结 1.gdb介绍…

UML系列之Rational Rose笔记三:活动图(泳道图)

一、新建活动图&#xff08;泳道图&#xff09; 依旧在用例视图里面&#xff0c;新建一个activity diagram&#xff1b;新建好之后&#xff0c;就可以绘制活动图了&#xff1a; 正常每个活动需要一个开始&#xff0c;点击黑点&#xff0c;然后在图中某个位置安放&#xff0c;接…

【CSS】HTML页面定位CSS - position 属性 relative 、absolute、fixed 、sticky

目录 relative 相对定位 absolute 绝对定位 fixed 固定定位 sticky 粘性定位 position&#xff1a;relative 、absolute、fixed 、sticky &#xff08;四选一&#xff09; top&#xff1a;距离上面的像素 bottom&#xff1a;距离底部的像素 left&#xff1a;距离左边的像素…

HTML前端从零开始

第一天 HTML部分 什么是HTML HTML&#xff08;Hypertext Markup Language&#xff09;超文本标记语言。HTML是万维网的基石。 超&#xff1a; 超字第一层意义是指最重要的标签&#xff0c;超链接标签 超越文本的意思 HTML的发展历程 HTML1990年出现&#xff0c;web之父…

Vue2+OpenLayers调用WMTS服务初始化天地图示例(提供Gitee源码)

目录 一、案例截图 二、安装OpenLayers库 三、WMTS服务详解 四、完整代码 五、Gitee源码 一、案例截图 二、安装OpenLayers库 npm install ol 三、WMTS服务详解 WMTS&#xff08;Web Map Tile Service&#xff09;是一种标准的网络地图服务协议&#xff0c;用于提供基于…

Linux syslog 运行机制

Busybox的syslogd认识与使用 syslogd 的基本工作原理&#xff1a; syslogd 是一个系统日志守护进程&#xff0c;它接收来自各种进程和系统服务的日志消息&#xff0c;并根据配置将这些消息存储到不同的日志文件中。 syslogd日志记录器由两个守护进程&#xff08;klogd&#x…

离线录制激光雷达数据进行建图

目前有一个2D激光雷达&#xff0c;自己控制小车运行一段时间&#xff0c;离线获取到激光雷达数据后运行如下代码进行离线建图。 roslaunch cartographer_ros demo_revo_lds.launch bag_filename:/home/firefly/AutoCar/data/rplidar_s2/2025-01-08-02-08-33.bag实际效果如下 d…

SDK调用文心一言如何接入,文心一言API接入教程

一、前期准备 注册百度智能云账号&#xff1a; 前往百度智能云官网注册一个账号。这是接入文心一言API的基础。 了解API接口&#xff1a; 在百度智能云开放平台中&#xff0c;找到文心一言API的详情页&#xff0c;了解提供的API接口类型&#xff08;如云端API、移动端API、离线…

CNN张量输入形状和特征图

CNN张量输入形状和特征图 这个是比较容易理解的张量的解释&#xff0c;比较直观 卷积神经网络 在这个神经网络编程系列中&#xff0c;我们正在逐步构建一个卷积神经网络&#xff08;CNN&#xff09;&#xff0c;所以让我们看看CNN的张量输入。 ​ ​ 在最后两篇文章中&…

【Linux】4.Linux常见指令以及权限理解(2)

文章目录 3. Linux指令3.1 ls指令和rm指令补充3.2 man指令&#xff08;重要&#xff09;3.3cp指令&#xff08;重要&#xff09;输出重定向3.3.1ubuntu20.04如何安装tree 3.4 mv指令&#xff08;重要&#xff09;mv指令更改文件名mv指令更改目录名 如何看待指令指令的重命名3.5…

硬件设计-齐纳管

目录 摘要 详情 齐纳管的工作电流、 摘要 齐纳管&#xff08;Zener Diode&#xff09;是一种特殊的二极管&#xff0c;它能够在特定的反向电压下保持电流稳定。正常情况下&#xff0c;二极管只允许正向电流通过&#xff0c;而阻止反向电流流过。而齐纳管在一定的反向电压下可…

C语言进阶——1数据的存储

目录 1. 数据类型介绍1.1 类型的基本归类&#xff1a;1.1.1 整形家族1.1.2 浮点型家族1.1.3 构造类型&#xff1a;1.1.4.指针类型1.1.5 void 表示空类型&#xff08;无类型&#xff09; 2. 整形在内存中的存储2.1 原码、反码、补码2.1.1 示例 20在计算机中的存储 2.2 大小端2.2…

【论文阅读】MAMBA系列学习

Mamba code&#xff1a;state-spaces/mamba: Mamba SSM architecture paper&#xff1a;https://arxiv.org/abs/2312.00752 背景 研究问题&#xff1a;如何在保持线性时间复杂度的同时&#xff0c;提升序列建模的性能&#xff0c;特别是在处理长序列和密集数据&#xff08;如…