pygame 烟花效果

# 初始化

pygame.init()
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption('烟花效果')

# 焰火发射

particles = []  # 焰火粒子
def firework(x, y):
    num_particles = 100  # 每次发射的粒子数量
    for _ in range(num_particles):
        direction = random.uniform(0, 2 * math.pi)  # 随机方向
        speed = random.uniform(2, 6)  # 随机速度
        particles.append({
            'x': x,
            'y': y,
            'vx': math.cos(direction) * speed,
            'vy': math.sin(direction) * speed,
            'color': colorlib.randcolorTuple(),
            'size': random.uniform(1, 4),  # 粒子的初始大小
            'life': random.uniform(100, 200)  # 粒子的生命周期
        })

# 更新屏幕

def update_screen():
    global particles
    screen.fill((0, 0, 0))  # 填充黑色背景
    for particle in particles[:]:
        particle['x'] += particle['vx']
        particle['y'] += particle['vy']
        particle['life'] -= 5
        coordinate = particle['x'], particle['y']
        radius = particle['size'] * particle['life'] / 100.0
        pygame.draw.circle(screen, particle['color'], coordinate, radius)
        if particle['life'] <= 0 or particle['y'] > screen_height:
            particles.remove(particle)

# 主循环

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()

    # 每隔一段时间发射一次烟花
    if random.randint(0, 2)==0:  # 发射随机时间
        firework(random.randint(0, screen_width), random.randint(0, screen_height//3*2))

    update_screen()
    pygame.display.flip()  # 更新整个屏幕
    pygame.time.Clock().tick(60)  # 控制帧率

pygame 烟花效果

完整代码

其中,库colorlib来源于: python 教你如何创建一个自定义库 colorlib.py-CSDN博客

import pygame
import random
import math
import colorlib# 初始化pygame
pygame.init()# 设置屏幕大小
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))# 设置标题
pygame.display.set_caption('烟花效果')# 焰火粒子
particles = []# 焰火发射
def firework(x, y):num_particles = 100  # 每次发射的粒子数量for _ in range(num_particles):direction = random.uniform(0, 2 * math.pi)  # 随机方向speed = random.uniform(2, 6)  # 随机速度particles.append({'x': x,'y': y,'vx': math.cos(direction) * speed,'vy': math.sin(direction) * speed,'color': colorlib.randcolorTuple(),'size': random.uniform(1, 4),  # 粒子的初始大小'life': random.uniform(100, 200)  # 粒子的生命周期})# 更新屏幕
def update_screen():global particlesscreen.fill((0, 0, 0))  # 填充黑色背景for particle in particles[:]:particle['x'] += particle['vx']particle['y'] += particle['vy']particle['life'] -= 5coordinate = particle['x'], particle['y']radius = particle['size'] * particle['life'] / 100.0pygame.draw.circle(screen, particle['color'], coordinate, radius)if particle['life'] <= 0 or particle['y'] > screen_height:particles.remove(particle)# 主循环
while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()# 每隔一段时间发射一次烟花if random.randint(0, 2)==0:  # 发射随机时间firework(random.randint(0, screen_width), random.randint(0, screen_height//3*2))update_screen()pygame.display.flip()  # 更新整个屏幕pygame.time.Clock().tick(60)  # 控制帧率

优化代码

把粒子的字典描述方式改为类:

       {    'x': x,
            'y': y,
            'vx': math.cos(direction) * speed,
            'vy': math.sin(direction) * speed,
            'color': colorlib.randcolorTuple(),
            'size': random.uniform(1, 4),  # 粒子的初始大小
            'life': random.uniform(100, 200)  # 粒子的生命周期
        } 

修改成:

class Firework:
    def __init__(self, x=0, y=0):
        self.x, self.y = self.xy = x, y
        direction = random.uniform(0, 2 * math.pi)  # 随机方向
        speed = random.uniform(2, 6)  # 随机速度
        self.vx = math.cos(direction) * speed
        self.vy = math.sin(direction) * speed
        self.color = tuple(random.randint(30, 255) for _ in range(3))
        self.size = random.uniform(2, 4)  # 粒子的初始大小
        self.life = random.uniform(100, 200)  # 粒子的生命周期

随机颜色也修改一下,最后优化好的完整代码如下:

import pygame, random, math# 初始化pygame
pygame.init()# 设置屏幕大小
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))# 设置标题
pygame.display.set_caption('烟花效果')class Firework:def __init__(self, x=0, y=0):self.x, self.y = self.xy = x, ydirection = random.uniform(0, 2 * math.pi)  # 随机方向speed = random.uniform(2, 6)  # 随机速度self.vx = math.cos(direction) * speedself.vy = math.sin(direction) * speedself.color = tuple(random.randint(30, 255) for _ in range(3))self.size = random.uniform(2, 4)  # 粒子的初始大小self.life = random.uniform(100, 200)  # 粒子的生命周期def update(self):self.x += self.vxself.y += self.vyself.life -= 5# 焰火粒子列表
particles = []# 更新屏幕
def update_screen():global particlesscreen.fill((0, 0, 0))  # 填充黑色背景# 遍历并更新粒子for particle in particles[:]:particle.update()radius = particle.size * particle.life // 100  # 计算半径pygame.draw.circle(screen, particle.color, (particle.x, particle.y), radius)# 如粒子生命周期结束或飞出屏幕,就删除if not (particle.life>0 and 0<particle.x<screen_width and 0<particle.y<screen_height):particles.remove(particle)pygame.display.flip()  # 更新整个屏幕# 主循环
running = True
while running:for event in pygame.event.get():if event.type == pygame.QUIT:running = False# 每隔一段时间发射一次烟花if random.randint(0, 3) == 0:  # 发射随机时间xy = random.randint(0, screen_width), random.randint(0, screen_height*2//3)particles.extend(Firework(*xy) for _ in range(100))update_screen()pygame.display.flip()  # 更新整个屏幕pygame.time.Clock().tick(60)  # 控制帧率pygame.quit()

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

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

相关文章

关于ResNet的假说

ResNet 最核心的思想就是 恒等映射吧 那么现在来提出几个问题&#xff1a; 为什么deeper 以后train L 会增加&#xff1f;恒等映射会解决什么问题&#xff1f;能否解决梯度非常陡峭的问题&#xff1f;你想到了什么模型有类似的问题&#xff0c;如何进行改进的&#xff1f; as…

本地环境通过ssh通道连接服务器数据库,实现本地客户端和代码可以访问数据库

使用方法&#xff1a; ssh -p 搭建隧道的端口 -fNL 本地端口:远程ip:远程端口号 搭建隧道的账号搭建隧道的ip 可以增加参数-v,输出更多的信息 ssh -p 搭建隧道的端口 -fNL 本地端口:远程ip:远程端口号 -v 搭建隧道的账号搭建隧道的ip 有时候&#xff0c;测试环境的数据库不允许…

ClickHouse 数据类型、表引擎与TTL

文章目录 数据类型表引擎1.TinyLog 引擎2.MergeTree 引擎3.ReplacingMergeTree 引擎4.AggregatingMergeTree 引擎5.SummingMergeTree 引擎6.CollapsingMergeTree 引擎7.Distributed 引擎 TTL列级 TTL表级TTL 数据类型 ClickHouse 数据类型Java 数据类型数据范围UInt8Short0 到…

【ETOJ P1023】同鱼系 题解(数学+取余)

题目描述 给定一个大小为 n n n 的数组 a a a 和一个整数 k k k。 你可以执行以下操作任意次&#xff08;0次也行&#xff09;: 选择一个下标 i i i 满足 1 ≤ i ≤ n − k 1 \leq i \leq n-k 1≤i≤n−k&#xff0c;然后交换 a i a_i ai​ 和 a i k a_{ik} aik​。…

获取肖博数学全套视频+讲义

肖博数学是一个专业团队&#xff0c;教学方法非常颠覆&#xff0c;具有很多技巧&特殊的解题方法内容&#xff0c;能使得学生在高考时冲刺高分 hello&#xff0c;今天分享一下高中数学资料&#xff0c;肖博数学&#xff0c; 他们的教学方法与传统的教学方式有所不同&#…

vue实现周日历 日历按周切换 vue日程管理

实现的功能 1、点击今天&#xff1a;回到今日日期并选中今日日期&#xff0c;查当天数据 2、点击左箭头&#xff1a;切换上一周 3、点击右箭头&#xff1a;切换下一周 4、黄圆圈代表有日程提醒&#xff0c;点击选中&#xff0c;下方对应显示当前日程提醒的内容&#xff0c;没有…

Spring Cloud Zuul面试题

Spring Cloud Zuul面试题 1. Zuul概述1.1 什么是Zuul&#xff1f;1.2 Zuul有哪些核心功能&#xff1f;1.3 Zuul 1和Zuul 2有什么区别&#xff1f;1.4 为什么我们需要使用API网关如Zuul&#xff1f; 2. 路由功能2.1 Zuul是如何实现路由的&#xff1f;1. 集成 Zuul2. 配置路由3. …

C++设计模式|创建型 4.建造者模式

1.什么是建造者模式? 建造者模式&#xff08;也被成为生成器模式&#xff09;&#xff0c;是一种创建型设计模式&#xff0c;软件开发过程中有的时候需要创建很复杂的对象&#xff0c;而建造者模式的主要思想是将对象的构建过程分为多个步骤&#xff0c;并为每个步骤定义一个…

nlp 自然语言处理的dataset数据库积累

下面的这个和 entity recognition有关的。 Weights & Biases

mybatis的一二级缓存

MyBatis 给我们提供了一级缓存和二级缓存机制来提高查询效率和减少数据库交互次数&#xff0c;一级缓存主要用于单次数据库会话内的查询优化&#xff0c;而二级缓存则着眼于整个应用层面的数据复用。 一级缓存&#xff08;Local Cache&#xff09; 特点&#xff1a; 一级缓存是…

Java Collections类、Stream流

Collections类 Java中的Collections类是一个功能丰富的工具类&#xff0c;它提供了一系列静态方法来操作和处理集合。以下是一些主要的功能&#xff1a; 创建集合&#xff1a;可以使用Collections类创建空集合、单元素集合以及不可变集合等。这为集合的初始化提供了便利。排序…

3i平台体验性能加持,13600KF+B760M+撼与科技A770 TITAN装机体验

在2022年&#xff0c;intel重启显卡线&#xff0c;带来了多款性价比十分不错的显卡。而近段时间&#xff0c;又有传言说intel第二代产品e即将面世&#xff0c;甚至已经有数款Battlemage GPU曝光&#xff0c;让不少intel忠实粉丝直呼期待&#xff0c;或许在今年年底&#xff0c;…

mysql面试题八(SQL语句)

目录 1.SQL 基本组成部分 常用操作示例 创建表 插入数据 查询数据 更新数据 删除数据 创建索引 授予用户权限 2.常见的聚合查询 1. 计数&#xff08;COUNT&#xff09; 2. 求和&#xff08;SUM&#xff09; 3. 平均值&#xff08;AVG&#xff09; 4. 最大值&…

卸载jenkins和docker

要卸载Docker中部署的Jenkins以及相关的容器和数据卷&#xff0c;您可以按照以下步骤操作&#xff1a; 卸载Jenkins容器及关联数据卷 停止并删除Jenkins容器&#xff1a; 使用Docker命令找到Jenkins容器的ID&#xff08;如果您还不知道&#xff09;&#xff0c;然后停止并删除…

在stm32中,所需的库函数有那些

使用库函数中封装的函数来访问外设可以使得stm32开发更加方便&#xff0c;省去了查寄存器位操作&#xff0c;只用查库函数就可以了 但是使用库函数时要记住真正的其本质是获取寄存器的地址然后设置其中的位 库函数一般添加到自己创建的Lib文件夹中 库函数实际上分成了两块&…

vue e.target.currentSrc 获取图片图片里包含中文名字出现乱码

<div v-html"info.brief" class"content" click"judgeImg($event)"></div> //判断是否为图片并提取当前图片地址judgeImg(e){ let currentSrc decodeURIComponent(e.target.currentSrc) }, 在 Vue 中&#xff0c;当你从 e…

Opencv | 图像卷积与形态学变换操作

这里写目录标题 一. 滤波 / 卷积操作1. 平滑均值滤波/卷积2. 平滑中值滤波/卷积3. 平滑高斯滤波/卷积3.1 关注区域3.2 分解特性 二. 形态学变换1. 常用核2. cv.erode ( ) 腐蚀操作3. cv.dilate ( ) 膨胀操作4. Open 操作5. Close 操作6. Morphological Gradient 形态梯度操作7.…

设计模式之创建型模式---工厂模式

文章目录 工厂模式概述简单工厂简单工厂的代码实现简单工厂的使用简单工厂应用场景 工厂方法工厂方法模式的代码实现工厂方法的使用工厂方法应用场景 抽象工厂抽象工厂模式代码实现抽象工厂的使用方法抽象工厂模式的应用场景 总结 工厂模式概述 工厂模式从名字就能看出&#x…

查看文件的权限和实际类型

该文件确实存在于指定的位置。可以使用 ls 命令来检查文件是否存在&#xff0c;以及确认文件路径是否正确。 ls -l xxx.xx权限问题: 确保你有权限读取该文件。如果该文件位于受限制的目录中&#xff0c;可能需要使用 sudo 或其他管理员权限来运行命令。 文件格式不正确: 如果…

JS走马灯小功能制作

HTML代码&#xff1a; <div id"contain"><div id"content"> 作文&#xff0c;怎样才能写好&#xff1f;作文&#xff0c;好于勤读&#xff0c;作文&#xff0c;优于真情。作文一词&#xff0c;汇于欲要看究竟&#xff0c;处处细留心。作文于此…