用 Python 模拟下雨效果

news2025/5/31 17:20:56

用 Python 模拟下雨效果

雨天别有一番浪漫情怀:淅淅沥沥的雨滴、湿润的空气、朦胧的光影……在屏幕上也能感受下雨的美妙。本文将带你用一份简单的 Python 脚本,手把手实现「下雨效果」动画。文章深入浅出,零基础也能快速上手,完整代码仅需一个脚本文件即可运行。
在这里插入图片描述


目录

  1. 前言
  2. 环境准备
  3. 雨滴模拟原理
  4. 实现思路
  5. 完整脚本讲解
  6. 完整脚本代码
  7. 运行效果
  8. 拓展思考
  9. 结语

前言

在图形编程中,常见的视觉特效之一就是雨滴下落动画。无论是游戏背景、界面装饰,还是演示特效,模拟下雨都能增添生动氛围。本示例使用 Python 结合 Pygame 库,在窗口中绘制无数条雨线,并让它们以不同速度、位置、长度滑落,形成自然的雨幕效果。整个过程非常直观,适合刚接触 Python GUI 或图形编程的新手。


环境准备

  • Python 版本:建议 3.6 及以上
  • 依赖库:Pygame

在命令行中执行:

pip install pygame

若出现安装问题,可尝试升级 pip:

pip install --upgrade pip

雨滴模拟原理

要模拟下雨效果,核心思想是:

  1. 雨滴属性

    • 位置 (x, y):雨滴当前坐标。
    • 长度 length:模拟不同距离或速度导致的雨滴长短差异。
    • 速度 speed:决定雨滴下落的快慢,可与 length 相关。
  2. 下落逻辑

    • 每帧 (frame) 更新时,让 y += speed
    • y 超出窗口底部,高度加上 length 后重置到顶部(y = -length),并随机生成新的 xlengthspeed
  3. 绘制方法

    • 在 Pygame 窗口中,用 draw.line() 绘制一条短线来代表雨滴。
    • 背景每帧需重绘为深色,以清除上一帧的残影。

实现思路

  1. 初始化

    • 导入模块、初始化 Pygame,设置窗口宽高与帧率 (FPS)。
  2. 创建雨滴列表

    • 根据需求生成多个 Raindrop 实例,存放于列表中。
  3. 主循环

    • 处理退出事件。
    • 填充背景色。
    • 遍历雨滴列表,更新位置并绘制。
    • 刷新显示并控制帧率。
  4. 优雅退出

    • 当检测到窗口关闭事件,退出循环并调用 pygame.quit()

完整脚本讲解

下面逐段讲解脚本中关键部分。

import pygame, random, sys
  • pygame:图形窗口与绘图操作。
  • random:生成随机位置与属性。
  • sys:退出程序使用。
class Raindrop:
    def __init__(self, screen_width, screen_height):
        self.screen_width  = screen_width
        self.screen_height = screen_height
        self.reset()
  • Raindrop 类用于封装单个雨滴。传入屏幕尺寸以便重置时随机生成坐标。
    def reset(self):
        self.x      = random.randint(0, self.screen_width)
        self.y      = random.randint(-self.screen_height, 0)
        self.length = random.randint(5, 15)
        self.speed  = random.uniform(4, 10) * (self.length / 10)
  • reset() 随机分配 xylengthspeed
  • y[-screen_height, 0] 范围随机初始,保证雨幕一开始就满屏。
  • 速度与长度挂钩,长雨滴下落更快,增强透视感。
    def fall(self):
        self.y += self.speed
        if self.y > self.screen_height:
            self.reset()
  • fall() 更新 y 坐标,若超出底部则重置回顶部。
    def draw(self, surface):
        end_y = self.y + self.length
        pygame.draw.line(surface, (180, 180, 255), (self.x, self.y), (self.x, end_y), 1)
  • 用浅蓝色 (180,180,255) 绘制细线代表雨滴。

接着是主程序部分,负责窗口创建、循环与事件处理。


完整脚本代码

请将以下代码保存为 rain.py,然后在命令行执行 python rain.py 即可查看下雨效果。

import pygame, random, sys

class Raindrop:
    def __init__(self, screen_width, screen_height):
        self.screen_width  = screen_width
        self.screen_height = screen_height
        self.reset()

    def reset(self):
        self.x      = random.randint(0, self.screen_width)
        self.y      = random.randint(-self.screen_height, 0)
        self.length = random.randint(5, 15)
        self.speed  = random.uniform(4, 10) * (self.length / 10)

    def fall(self):
        self.y += self.speed
        if self.y > self.screen_height:
            self.reset()

    def draw(self, surface):
        end_y = self.y + self.length
        pygame.draw.line(surface, (180, 180, 255), (self.x, self.y), (self.x, end_y), 1)

def main():
    pygame.init()
    screen_width, screen_height = 800, 600
    screen = pygame.display.set_mode((screen_width, screen_height))
    pygame.display.set_caption("Python 雨滴模拟")
    clock = pygame.time.Clock()

    # 初始化雨滴
    raindrops = [Raindrop(screen_width, screen_height) for _ in range(300)]

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

        # 填充背景
        screen.fill((10, 10, 30))

        # 更新并绘制每个雨滴
        for drop in raindrops:
            drop.fall()
            drop.draw(screen)

        # 刷新显示
        pygame.display.flip()
        clock.tick(60)

    pygame.quit()
    sys.exit()

if __name__ == "__main__":
    main()

运行效果

运行后,你将看到一个 800×600 的深色窗口,无数细细的浅蓝色雨滴以不同速度从顶部滑落,形成层次分明的雨幕。若想更贴近真实,可以:

  • 调整颜色:将 (180,180,255) 改为其他色值。
  • 改变雨滴数量:修改 raindrops 列表长度(300 可增可减)。
  • 添加风向:在 fall() 中改变 x 坐标,模拟风吹雨打效果。

拓展思考

  1. 视差效果
    将雨滴分为「前景」「中景」「远景」三组,分别使用不同速度、颜色与透明度,营造深度感。
  2. 撞击水面
    当雨滴落到预设的“地面”高度,可在底部绘制一圈淡淡的水花动画。
  3. 粒子系统
    为水花使用粒子系统,让每个水花粒子具有衰减、弹跳特性,更真实。

结语

本文以最简单的 Pygame 用例,向你展示如何在 Python 中模拟下雨特效。核心思路就是不断重置和重绘雨滴坐标,通过随机属性让画面更具丰富性。动手运行一下,相信你会对图形编程更加感兴趣。后续可以在此基础上加入更多效果,打造属于自己的雨天场景。祝学习愉快!

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

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

相关文章

C#对象集合去重的一种方式

前言 现在AI越来越强大了,有很多问题其实不需要在去各个网站上查了,直接问AI就好了,但是呢,AI给的代码可能能用,也可能需要调整,但是自己肯定是要会的,所以还是总结一下吧。 问题 如果有一个…

在ROS2(humble)+Gazebo+rqt下,实时显示仿真无人机的相机图像

文章目录 前言一、版本检查检查ROS2版本 二、步骤1.下载对应版本的PX4(1)检查PX4版本(2)修改文件名(3)下载正确的PX4版本 2.下载对应版本的Gazebo(1)检查Gazebo版本(2)卸载不正确的Gazebo版本(3)下载正确的Gazebo版本 3.安装bridge包4.启动 总结 前言 在ROS2的环境下&#xff…

github双重认证怎么做

引言 好久没登陆github了, 今天登陆github后,提醒进行2FA认证。 查看了github通知,自 2023 年 3 月起,GitHub 要求所有在 GitHub.com 上贡献代码的用户启用一种或多种形式的双重身份验证 (2FA)。 假如你也遇到这个问题&#xf…

数据的类型——认识你的数据

第02篇:数据的类型——认识你的数据 写在前面:嗨,大家好!我是蓝皮怪。在上一篇文章中,我们聊了统计学的基本概念,今天我们来深入了解一个非常重要的话题——数据的类型。你可能会想:"数据就…

第五十二节:增强现实基础-简单 AR 应用实现

引言 增强现实(Augmented Reality, AR)是一种将虚拟信息叠加到真实世界的技术,广泛应用于游戏、教育、工业维护等领域。与传统虚拟现实(VR)不同,AR强调虚实结合,用户无需完全沉浸到虚拟环境中。本文将通过Python和OpenCV库,从零开始实现一个基础的AR应用:在检测到特定…

LLaMaFactory 微调QwenCoder模型

步骤一:准备LLamaFactory环境 首先,让我们尝试使用github的方式克隆仓库: git config --global http.sslVerify false && git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git # 创建新环境,指定 Python 版本(以 3.…

【最新版】Arduino IDE的安装入门Demo

1、背景说明 1、本教程编写日期为2025-5-24 2、Arduino IDE的版本为:Arduino IDE 2.3.6 3、使用的Arduino为Arduino Uno 1、ArduinoIDE的安装 1、下载。网址如下:官网 2、然后一路安装即可。 期间会默认安装相关驱动,默认安装即可。 3、安…

不起火,不爆炸,高速摄像机、数字图像相关DIC技术在动力电池新国标安全性能测试中的应用

2026年7月1日,我国将正式实施GB38031-2025《电动汽车用动力蓄电池安全要求》——这项被称为“史上最严电池安全令”的新国标,首次将“热失控不蔓延、不起火、不爆炸”从企业技术储备上升为强制性要求,标志着电池安全进入“零容忍”时代&#…

thinkadmin中使用layui日期选择器,数据库存储时间戳

form.html <div class="layui-form-item label-required-prev" id="jiezhi_time-div">

WSL中ubuntu通过Windows带代理访问github

WSL中ubuntu通过Windows带代理访问github 前言: WSL是Windows下的ubuntu访问工具&#xff0c;目前无法访问外网&#xff0c;因此需要配置一下。 步骤一 代理中进行如下设置: 步骤二 ubuntu22.04中修改配置 使用如下命令获取IP地址&#xff1a; ip route | grep default | aw…

RISC-V特权模式及切换

1 RISC-V特权模式基本概念 1.1 RISC-V特权模式介绍 RISC-V 指令集架构&#xff08;ISA&#xff09;采用多特权级别设计作为其核心安全机制&#xff0c;通过层次化的权限管理实现系统资源的隔离与保护。该架构明确定义了四个层次化的特权模式&#xff0c;按照权限等级由高至低…

【深度学习】11. Transformer解析: Self-Attention、ELMo、Bert、GPT

Transformer 神经网络 Self-Attention 的提出动机 传统的循环神经网络&#xff08;RNN&#xff09;处理序列信息依赖时间步的先后顺序&#xff0c;无法并行&#xff0c;而且在捕捉长距离依赖关系时存在明显困难。为了解决这些问题&#xff0c;Transformer 引入了 Self-Attent…

4060显卡什么水平 4060显卡参数介绍

NVIDIA的GeForce RTX 40系列显卡基于最新的Ada Lovelace架构&#xff0c;提供了前所未有的图形处理能力和效率。其中&#xff0c;RTX 4060定位中高端市场&#xff0c;针对那些寻求卓越性能同时又注重成本效益的用户群体。那么&#xff0c;4060显卡什么水平呢&#xff1f;本文将…

技术为器,服务为本:AI时代的客服价值重构

在智能化浪潮中&#xff0c;大语言模型的出现为客户服务行业注入了全新动能。然而技术创新的价值不在于技术本身&#xff0c;而在于其赋能服务的深度与广度。AI对于我们来说&#xff0c;如同发动机之于汽车&#xff0c;重要的不是引擎参数&#xff0c;而是整车带给用户的驾驶体…

EasyVoice:开源的文本转语音工具,让文字“开口说话“

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、EasyVoice是什么&#xff1f;1. 核心特性一览2. 技术架构概览 二、安装部署指南…

扫地机产品异物进入吸尘口堵塞异常检测方案

扫地机产品异物进入吸尘口堵塞异常的检测方案 文章目录 扫地机产品异物进入吸尘口堵塞异常的检测方案一.背景二.石头的音频异常检测的方案2.1 音频检测触发点2.1.1时间周期2.1.2根据清洁机器人清扫模式或清扫区域污渍类型,即当清扫模式为深度清洁模式 或清扫区域污渍类型为重度…

C++并集查找

前言 C图论 C算法与数据结构 本博文代码打包下载 基本概念 并查集&#xff08;Union-Find&#xff09;是一种用于处理动态连通性&#xff08;直接或间接相连&#xff09;的数据结构&#xff0c;主要支持两种操作&#xff1a;union 和 find。通过这两个基本操作&#xff0c;可…

git reset --hard HEAD~1与git reset --hard origin/xxx

git reset --hard HEAD~1与git reset --hard origin/xxx git reset --hard origin/xxx有时候会太长&#xff0c;手工输入略微繁琐&#xff0c;可以考虑&#xff1a; git reset --hard HEAD~1 替代。 或者使用这种方式 git reset撤销当前分支所有修改&#xff0c;恢复到最近一…

C++ RB_Tree

一、红黑树是什么&#xff1f;—— 带颜色标记的平衡二叉搜索树 红黑树是一种自平衡二叉搜索树&#xff0c;它在每个节点上增加了一个颜色属性&#xff08;红色或黑色&#xff09;&#xff0c;通过对颜色的约束来确保树的大致平衡。这种平衡策略被称为 "弱平衡"&…

kibana解析Excel文件,生成mapping es导入Excel

一、Excel转为CSV格式 在线免费网站&#xff1a;EXCEL转CSV - 免费在线将EXCEL文件转换成CSV (cdkm.com) 二、登录kibana 点击左边菜单栏找到Machine Learning&#xff0c; 进入后上面菜单选择Data Visualizer&#xff0c;然后上穿转好的csv格式的Excel 点击导入输入建立的m…