pygame 烟花效果

news2024/10/1 5:34:40

# 初始化

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 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)  # 控制帧率

优化代码

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

       {    '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, 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)  # 粒子的生命周期
    def update(self):
        self.x += self.vx
        self.y += self.vy
        self.life -= 5

# 焰火粒子列表
particles = []

# 更新屏幕
def update_screen():
    global particles
    screen.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.coloradmin.cn/o/1614046.html

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

相关文章

Springboot+Vue项目-基于Java+MySQL的影城管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

【Python-面向对象】

Python-面向对象 ■ 事物和类■ 成员方法定义和使用■ self■ 构造方法__init__&#xff08;&#xff09;■ 魔术方法■ __str__字符串方法■ __lt__小于、大于符号比较■ __le__小于等于、大于等于符号比较■ __eq__符号比较■ 综合演示 ■ 封装■ 私有成员和方法 ■ 继承■ 单…

STM32之HAL开发——ILI9341液晶控制器

ILI9341液晶控制器简介 本液晶屏内部包含有一个液晶控制芯片ILI9341&#xff0c;它的内部结构非常复杂&#xff0c;如下图。该芯片最主核心部分是位于中间的GRAM(Graphics RAM)&#xff0c;它就是显存。GRAM中每个存储单元都对应着液晶面板的一个像素点。它 右侧的各种模块共同…

Ubuntu20.04 ISAAC SIM仿真下载使用流程

机器&#xff1a;华硕天选X2024 显卡&#xff1a;4060Ti ubuntu20.04 安装显卡驱动版本&#xff1a;525.85.05 参考&#xff1a; What Is Isaac Sim? — Omniverse IsaacSim latest documentationIsaac sim Cache 2023.2.3 did not work_isaac cache stopped-CSDN博客 Is…

聚观早报 | TCL召开电视新品发布会;OceanBase 4.3发布

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 4月22日消息 TCL召开电视新品发布会 OceanBase 4.3发布 科大讯飞推出耳背式助听器 F1联想中国大奖赛开赛 蔚来展…

力扣——并查集算法系列

【LeetCode 684. 冗余连接】 思路&#xff1a; 首先因为这是一个无向图&#xff0c;所以不需要考虑谁是树根。 那么我们一条条边加入到图里去&#xff0c;直到出现了环为止&#xff0c;那么这条边就是冲突的边&#xff0c;需要删除掉。 那么怎么判断是否出现了环呢&#xff…

36. 【Android教程】侧滑菜单:DrawerLayout

侧滑菜单是用来在页面上增加一个抽屉式菜单栏的控件&#xff0c;它一般位于左侧&#xff0c;用户可以通过侧滑拉出或者关闭。通常你可以放置一些菜单项或者上下文相关的设置在里面&#xff0c;帮助你节省屏幕空间同时可以很方便的随时打开。侧滑菜单其实就是下面这货&#xff1…

python 对图片进行操作

Pillow是一个强大的图像处理库&#xff0c;它提供了许多用于打开、操作和保存图像的功能。 Image模块&#xff1a; Image模块提供了用于打开、创建、编辑和保存图像的基本功能。可以使用Image.open()函数来打开图像文件&#xff0c;或者使用Image.new()函数来创建新的图像,还可…

【Java框架】Spring框架(六)——Spring中的Bean的作用域

目录 Bean的作用域1.singleton(默认)代码示例 2.prototype代码示例 3.request代码示例 4.session代码示例 5.application代码示例 websocket Bean的作用域 Spring支持6个作用域&#xff1a;singleton、prototype、request、session、application、websocket 1.singleton(默认…

山与路远程控制 一个基于electron和golang实现的远控软件

山与路远程控制 &#x1f3a5;项目演示地址 还在制作… ♻️项目基本介绍 山与路远程控制是基于electron(vue3)和golang实现的远程控制软件(项目界面主要模仿向日葵远程软件,如有侵权请告知),代码可能有点臃肿毕竟只花了一周左右写的无聊项目,如果对其感兴趣的大佬可以fork自…

【信号处理】心电信号传统R波检测定位典型方法实现(matlab)

关于 心电信号中QRS波检测是一个非常重要的步骤&#xff0c;可以用于实现重要波群的基本定位&#xff0c;在定位基础上&#xff0c;可以进一步分析心电信号的特征变化&#xff0c;从而为医疗诊断提供必要的参考。 工具 MATLAB ECG心电信号 方法实现 ECG心电信号加载 ecg …

Java中的数组(上)

1.怎样定义Java中的数组 package day40; ​ public class day25 {public static void main(String[] args) {int[] array1{1,2,3,4,5};int[] array2new int[10];for (int i 0; i < array1.length; i) {System.out.print(array1[i]" ");}System.out.println();fo…

学习笔记:Vue2中级篇

Vue2 学习笔记&#xff1a;Vue2基础篇_ljtxy.love的博客-CSDN博客学习笔记&#xff1a;Vue2中级篇_ljtxy.love的博客-CSDN博客学习笔记&#xff1a;Vue2高级篇_ljtxy.love的博客-CSDN博客 Vue3 学习笔记&#xff1a;Vue3_ljtxy.love的博客&#xff09;-CSDN博客 文章目录 5.…

HTTP 方法和使用场景大全

本文转自 公众号 ByteByteGo&#xff0c;如有侵权&#xff0c;请联系&#xff0c;立即删除 HTTP 方法和使用场景大全 HTTP&#xff08;超文本传输协议&#xff09;方法&#xff0c;也称为 HTTP 动词&#xff0c;定义了可以对资源执行的操作。理解这些方法的使用对于 Web 开发至…

【分治】Leetcode 排序数组

题目讲解 912. 排序数组 算法讲解 我们这里使用三指针&#xff0c;将数组分成三块&#xff1a;<key 和 key 和 >key,如果当前指针指向的数字<key&#xff0c;我们就swap(nums[left]), nums[i] 。如果当前的数字key &#xff0c;就让i。如果当前的数字>key&…

MySQL基础篇总结

参考&#xff1a;黑马程序员MySQL基础视频链接 数据库基本操作 启动与停止 1.第一种方式&#xff1a; 1>以管理员身份运行cmd 2>在命令行窗口中输入: 启动:net start mysql80停止:net stop mysql80 2.第二种方式: 1>WinR快捷方式打开如下&#xff1a; 输入&#…

【探索Linux】P.32(自定义协议)

阅读导航 引言一、自定义协议概念二、自定义协议需要注意的事项三、自定义协议示例(跨网络计算器协议)✅协议代码&#xff08;Protocol.hpp&#xff09;1. 计算器协议简单介绍2. 序列化部分3. 反序列化部分4. 请求和响应数据结构5. 使用自定义协议 四、总结温馨提示 引言 在上…

第三届 SWCTF-Web 部分 WP

写在前面 题目主要涉及的是前端 php 内容知识&#xff0c;仅以本篇博客记录自己 Web 出题的奇思妙想。 Copyright © [2024] [Myon⁶]. All rights reserved. 目录 1、HTTP 2、再见了晚星 3、myon123_easy_php 4、baby_P0P 5、LOGIN!!! 1、HTTP 首页文件默认就是 ind…

BTP连接cloud connector中配置的SAP

登录地址 登录之后可以看到我们已经配置成功的后端系统SAP。 从cloud connector中获取location ID ,然后在BTP中配置Destination 选择目标标签页&#xff0c;点击‘新建目标’&#xff0c;如下图&#xff1a; 新建连接 暂时不知道错误原因 创建目标-HTTP  新建目标&…

Leetcode 第 394 场周赛

Leetcode 第 394 场周赛 1. [统计特殊字母的数量 I](https://leetcode.cn/problems/count-the-number-of-special-characters-i/)2. [统计特殊字母的数量 II](https://leetcode.cn/problems/count-the-number-of-special-characters-ii/)3. [使矩阵满足条件的最少操作次数](htt…