pygame 烟花效果

简介: 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 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()

目录
相关文章
|
7月前
|
Python
pygame之五子棋的实现
pygame之五子棋的实现
|
2月前
threeJs用精灵模型Sprite实现下雨效果
这篇文章介绍了使用Three.js中的Sprite(精灵)模型来实现下雨特效的方法和技术细节。
78 2
threeJs用精灵模型Sprite实现下雨效果
|
6月前
|
Python
Pygame基础9-射击
Pygame基础9-射击
Pygame基础9-射击
|
6月前
|
Python
Pygame-贪吃蛇
Pygame-贪吃蛇
30 2
|
6月前
|
Python
Pygame基础3-动画
Pygame基础3-动画
|
6月前
|
Python
Pygame基础6-旋转
Pygame基础6-旋转
画烟花
进行相关代码编写,完成画烟花这个项目。
297 2
|
Python
Pygame第1-2课:使用精灵
Pygame第1-2课:使用精灵
106 0
|
Python Windows
Pygame第1-3课:图片精灵
Pygame第1-3课:图片精灵
137 0
90.pygame游戏-玩个球(play the ball)最终版
90.pygame游戏-玩个球(play the ball)最终版
147 0
90.pygame游戏-玩个球(play the ball)最终版