Python使用pygame设计一幅冷冷的雪落动图

news2024/12/23 12:14:18

文章目录

    • 基础代码实现雪花飘落
    • 动图更换雪景背景
    • 转换GIF动图
    • 完整实现代码
    • 推荐阅读

看到很多小伙伴使用python实现了很多动态的效果,非常漂亮。
闲来无事,也参考做法,自己做了一幅雪落动图。过程中,遇到了一些问题,花了点时间搞定。

基础代码实现雪花飘落

基础代码问了chatGPT,但是初始实现效果,不是很理想。

import pygame
import random
# 初始化Pygame
pygame.init()

# 设置窗口尺寸和标题
window_width = 800
window_height = 600
window = pygame.display.set_mode((window_width, window_height))
pygame.display.set_caption("雪花飘落")

# 定义雪花颜色为白色
WHITE = (255, 255, 255)

# 创建雪花列表
snowflakes = []

# 创建雪花对象
class Snowflake:
    def __init__(self, x, y, size):
        self.x = x
        self.y = y
        self.size = size
        self.speed = random.randint(1, 8)

    def fall(self):
        self.y += self.speed
        if self.y > window_height:
            self.y = random.randint(-50, -10)
            self.x = random.randint(0, window_width)

    def draw(self):
        pygame.draw.circle(window, WHITE, (self.x, self.y), self.size)
# 创建GIF帧的列表

# 主循环
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 清空窗口
    window.fill((0, 0, 0))

    # 生成雪花
    # 控制生成雪花的数量,数量可以更改
    if len(snowflakes) < 100:
        x = random.randint(0, window_width)
        y = random.randint(0, window_height)
        # 定义雪花的大小,1-5之间随机,可以根据自己需求更改
        size = random.randint(1, 5)
        snowflake = Snowflake(x, y, size)
        snowflakes.append(snowflake)

    # 更新和绘制雪花
    for snowflake in snowflakes:
        snowflake.fall()
        snowflake.draw()

    # 刷新窗口
    pygame.display.flip()

    # 控制帧率
    pygame.time.delay(10)

# 退出时关闭Pygame
pygame.quit()

呈现效果如下:
在这里插入图片描述

动图更换雪景背景

原始代码是黑色背景,肯定不是我们期望的样子,我们预期增加一张美丽的背景图片来润色。

更换雪景背景,首先要导入一个模块

from PIL import Image

根据背景图片修改窗口的大小。

window_width = 1280
window_height = 800

加载背景图片,图片把他放到了与代码文件相同的路径下。

# 加载背景图片
background_image= pygame.image.load("snow.jpg")

在窗口绘制背景图片,取代这一行代码:window.fill((0, 0, 0))

# 绘制背景图片
window.blit(background_image,(0,0))

更换背景后,效果呈现:
在这里插入图片描述

转换GIF动图

因为产生的动图,还没有定义格式,我们转变为GIF的动图。
先创建一个帧列表

# 创建GIF帧的列表
frames = []

获取当前帧的截图,并添加到列表

# 获取当前帧的截图并添加到帧列表
pygame_image = pygame.surfarray.array3d(pygame.display.get_surface())
pil_image = Image.fromarray(pygame_image)
pil_image = pil_image.rotate(-90,expand=True)
frames.append(pil_image.copy())

这里需要注意pil_image = pil_image.rotate(-90,expand=True)的应用,默认压缩后的GIF动图可以因为某些原因自动旋转90度。我们通过pil_image.rotate设定产生的动图旋转方向和角度来纠正。

最后是将帧列表保存为GIF格式的文件

# 保存帧列表为GIF文件

frames[0].save("snowfall.gif", save_all=True, append_images=frames[1:], duration=100, loop=0)

我们详细解释一下这段代码:

frames[0].save(“snowfall.gif”, save_all=True, append_images=frames[1:], duration=100, loop=0):这一行代码的目的是保存动画。具体说明如下:

  • “snowfall.gif”:这是要保存的GIF文件的文件名。
  • save_all=True:这告诉Pillow保存所有帧。
  • append_images=frames[1:]:这是要附加到GIF中的帧的列表。frames[1:]表示从第二帧到最后一帧的所有帧将被附加到GIF中。
  • duration=100:这是每帧的显示时间(以毫秒为单位)。在这里,每帧将显示100毫秒,也就是每秒10帧。
  • loop=0:这是GIF的循环次数。0表示无限循环。

完整实现代码

import pygame
import random
from PIL import Image
# 初始化Pygame
pygame.init()

# 设置窗口尺寸和标题
window_width = 1280
window_height = 800
window = pygame.display.set_mode((window_width, window_height))
pygame.display.set_caption("雪花飘落")

# 定义雪花颜色为白色
WHITE = (255, 255, 255)

# 加载背景图片
background_image= pygame.image.load("snow.jpg")
# 创建雪花列表
snowflakes = []

# 创建雪花对象
class Snowflake:
    def __init__(self, x, y, size):
        self.x = x
        self.y = y
        self.size = size
        self.speed = random.randint(1, 8)

    def fall(self):
        self.y += self.speed
        if self.y > window_height:
            self.y = random.randint(-50, -10)
            self.x = random.randint(0, window_width)

    def draw(self):
        pygame.draw.circle(window, WHITE, (self.x, self.y), self.size)
# 创建GIF帧的列表
frames = []

# 主循环
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 清空窗口
    # window.fill((0, 0, 0))
    # 绘制背景图片
    window.blit(background_image,(0,0))

    # 生成雪花
    # 控制生成雪花的数量
    if len(snowflakes) < 100:
        x = random.randint(0, window_width)
        y = random.randint(0, window_height)
        # 定义雪花的大小,1-5之间随机
        size = random.randint(1, 5)
        snowflake = Snowflake(x, y, size)
        snowflakes.append(snowflake)

    # 更新和绘制雪花
    for snowflake in snowflakes:
        snowflake.fall()
        snowflake.draw()

    # 刷新窗口
    pygame.display.flip()

    # 获取当前帧的截图并添加到帧列表
    pygame_image = pygame.surfarray.array3d(pygame.display.get_surface())
    pil_image = Image.fromarray(pygame_image)
    pil_image = pil_image.rotate(-90,expand=True)
    frames.append(pil_image.copy())

    # 控制帧率
    pygame.time.delay(10)

# 退出时关闭Pygame
pygame.quit()

# 保存帧列表为GIF文件

frames[0].save("snowfall.gif", save_all=True, append_images=frames[1:], duration=100, loop=0)

推荐阅读

  • Python实时采集Windows CPU\MEMORY\HDD使用率
  • Python 连接 SQL 数据库 -pyodbc
  • 微软宣布在 Excel 中使用 Python:结合了 Python 的强大功能和 Excel 的灵活性。
  • 送给小朋友的python代码游戏,猜字谜
  • GIF动图过大?Python轻轻松松压缩GIF图大小

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Docker 容器化的艺术:深入理解容器技术》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

Mysql免安装版的root密码是多少

免安装版的Mysql在初始化后root是没有密码的 1、下载免安装版Mysql 下载链接&#xff1a;MySQL :: Download MySQL Community Server 下载后解压 里面的目录是这样的 2、添加配置文件和系统环境 在系统变量中添加Mysql的bin的path路径 在Mysql的目录下添加my.ini配置文件 [my…

苏宁suningAPI接入说明获得suning商品详情

API地址:https://o0b.cn/anzexi 参数说明 通用参数说明 version:API版本key:调用key,测试key:test_api_keyapi_name:API类型[item_search,seller_info]cache:[yes,no]默认yes&#xff0c;将调用缓存的数据&#xff0c;速度比较快result_type:[json,xml,serialize,var_export]…

新零售商城模式与传统电商和零售的痛点的对比

新零售是一种以消费者体验为中心的数据驱动的泛零售形态&#xff0c;它通过运用大数据、人工智能等先进技术手段&#xff0c;对商品的生产、流通与销售过程进行升级改造&#xff0c;进而重塑业态结构与生态圈&#xff0c;并对线上服务、线下体验以及现代物流进行深度融合的零售…

【Linux】Linux常用命令60条(含完整命令语句)

Linux是一个强大的操作系统&#xff0c;它提供了许多常用的命令行工具&#xff0c;可以帮助我们用于管理文件、目录、进程、网络和系统配置等。以下是一些常用的Linux命令&#xff1a; 1. ls&#xff1a;列出当前目录中的文件和子目录 ls2. pwd&#xff1a;显示当前工作目录的…

什么是 BSD 协议?

BSD开源协议是一个给于使用者很大自由的协议。可以自由的使用&#xff0c;修改源代码&#xff0c;也可以将修改后的代码作为开源或者专有软件再发布。当你发布使用了BSD协议的代码&#xff0c;或者以BSD协议代码为基础做二次开发自己的产品时&#xff0c;需要满足三个条件&…

解决 SLF4J: Class path contains multiple SLF4J bindings.

1. 异常现象 启动springboot项目&#xff0c;抛出警告信息&#xff1a; SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/Users/quanll5/Documents/java_repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.j…

国内最佳的Respond替代品——SaleSmartly(ss客服)

如果响应工具最近让您失望&#xff0c;那么可能是时候开始检查一些响应替代方案以保持您的客服系统策略正常运行了&#xff01;选择正确的工具对于执行高性能的营销策略至关重要&#xff0c;该策略将为您提供最佳的投资回报率 &#xff08;ROI&#xff09;。 Respond也是一个得…

C++算法进阶系列之倍增算法解决求幂运算

1. 引言 学习倍增算法&#xff0c;先了解什么是倍增以及倍增算法的优势。如果面前有一堆石子&#xff0c;要求计算出石子的总数量。 这是一个简单的数数问题&#xff0c;可以&#xff1a; 一颗石子一颗石子的数。两颗石子两颗石子的数。三颗石子三颗石子的数。或者更多颗石子…

一志愿复录比接近1:1,计算机专业招生名额近百人,杭州师范大学考情分析

杭州师范大学 考研难度&#xff08;☆☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23初试科目、23复试详情、各专业考情分析、各科目考情分析。 正文893字预计阅读&#xff1a;3分钟 2023考情概况 杭州师范大学计算机相…

TRICONEX 4351B数字量输入模块

TRICONEX 4351B是一种数字量输入模块&#xff0c;通常用于工业控制和安全系统中。这个模块的主要功能和特点可能包括以下方面&#xff1a; 数字量输入&#xff1a;4351B模块允许连接多个数字量输入信号。这些输入通常用于监测开关状态、传感器信号或其他数字逻辑信号。 高密度…

FPGA-结合协议时序实现UART收发器(一):UART协议、架构规划、框图

FPGA-结合协议时序实现UART收发器&#xff08;一&#xff09;&#xff1a;UART协议、架构规划、框图 记录FPGA的UART学习笔记&#xff0c;以及一些细节处理&#xff0c;主要参考奇哥fpga学习资料。 本次UART主要采用计数器方法实现&#xff0c;实现uart的稳定性发送和接收功能…

利用微信二维码来实现中秋节快乐

环境准备&#xff1a; 1、python环境&#xff1b; 2、微信公众号申请&#xff1b; 实现思路是&#xff0c;将微信公众号的中秋节快乐的页面链接&#xff0c;隐藏到二维码里面&#xff0c;如果你发送的对方扫描了这个二维码&#xff0c;就会弹出对应的中秋节祝福页面。(*^▽^*…

【送书活动】畅销书《Kali Linux高级渗透测试》更新版速速查收~

文章目录 每日一句正能量前言本书概况读者对象赠书活动目录 每日一句正能量 其实&#xff0c;人生很多东西无所谓最好的&#xff0c;只要你认为值得就是最好。 前言 对于企业网络安全建设工作的质量保障&#xff0c;业界普遍遵循PDCA&#xff08;计划&#xff08;Plan&#xf…

【广州华锐互动】煤矿提升机作业VR互动实训平台

在煤矿行业中&#xff0c;安全性是无可忽视的首要任务。传统的煤矿工人培训方法&#xff0c;如理论课堂讲解、实地操作演示&#xff0c;尽管具有一定的效果&#xff0c;但往往无法真实地模拟出煤矿的复杂环境&#xff0c;工作人员在没有真正接触煤矿的情况下&#xff0c;很难理…

【web开发】7、Django(2)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、部门列表二、部门管理&#xff08;增删改&#xff09;三、用户管理过渡到modelform组件四、modelform实例&#xff1a;靓号操作五、自定义分页组件六、自定义有…

OpenCV(四十):图像分割—漫水填充

1.漫水填充原理 图像分割中的漫水填充&#xff08;Flood Fill&#xff09;算法是一种基于区域增长的像素分类方法。其原理是在图像中从种子点开始&#xff0c;逐渐向周围扩展&#xff0c;并根据一定的条件决定是否将相邻的像素归属于同一区域。 漫水填充的基本原理如下&#x…

香港银行开户内地见证流程

香港公司内地见证开户流程&#xff1a; 资料准备——银行进行资料预审——预审通过&#xff0c;预约面谈&#xff08;确定面谈时间以及在内地指定城市的分行进行面谈&#xff09;——携带齐全资料至内地指定城市分行&#xff0c;在当地银行职员的见证下签署资料——面谈通过&a…

python-爬虫-三字代码网站爬取

三字代码 http://www.6qt.net/ 爬取城市、三字代码、所属国家、国家代码、四字代码、机场名称、英文名称、查询次数 import requestsurl http://www.6qt.net/ r requests.get(url) r.encodinggb2312 print(r.text)使用xpath解析&#xff0c;得到城市名 html.fromstring(html…

管理固定资产怎么界定优化

固定资产的管理和利用是至关重要的一环。然而&#xff0c;如何准确地界定和管理这些资产&#xff0c;以实现最大的效益&#xff0c;却是一个需要深思熟虑的问题。本文旨在探讨行政管理中固定资产的界定方法以及如何进行优化管理。  我们需要明确固定资产的概念。固定资产是指…