# Python实现烟花的实例代码怎么编写 ## 引言 烟花效果是计算机图形学中常见的可视化效果之一,通过Python我们可以用相对简单的代码模拟出绚丽的烟花绽放场景。本文将详细介绍如何使用Python的Pygame库实现烟花效果,包括基础原理、代码实现和效果优化。 --- ## 一、准备工作 ### 1.1 环境配置 需要安装Python 3.x和Pygame库: ```bash pip install pygame
import pygame import random import math # 初始化 pygame.init() WIDTH, HEIGHT = 800, 600 screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("烟花模拟")
class Particle: def __init__(self, x, y, color): self.x = x self.y = y self.color = color self.radius = random.randint(2, 4) self.speed = random.uniform(2, 6) self.angle = random.uniform(0, math.pi * 2) self.vx = math.cos(self.angle) * self.speed self.vy = math.sin(self.angle) * self.speed self.life = 100 # 生命周期 self.gravity = 0.1
def update(self): self.vx *= 0.99 # 空气阻力 self.vy *= 0.99 self.vy += self.gravity # 重力影响 self.x += self.vx self.y += self.vy self.life -= 1 # 生命周期递减
class Firework: def __init__(self): self.color = ( random.randint(0, 255), random.randint(0, 255), random.randint(0, 255) ) self.particles = [] self.x = random.randint(50, WIDTH-50) self.y = HEIGHT self.speed = random.uniform(5, 10) self.exploded = False def explode(self): # 生成100-200个粒子 for _ in range(random.randint(100, 200)): self.particles.append(Particle( self.x, self.y, self.color ))
def main(): fireworks = [] clock = pygame.time.Clock() running = True while running: screen.fill((0, 0, 0)) # 黑色背景 # 随机生成新烟花 if random.random() < 0.05: fireworks.append(Firework()) # 更新所有烟花 for fw in fireworks[:]: if not fw.exploded: # 上升阶段 fw.y -= fw.speed if fw.y <= random.randint(100, 300): fw.explode() fw.exploded = True else: # 粒子更新 for p in fw.particles[:]: p.update() if p.life <= 0: fw.particles.remove(p) if len(fw.particles) == 0: fireworks.remove(fw) # 绘制所有元素 # ...(绘制代码见下一节) pygame.display.flip() clock.tick(60)
def draw_particles(): for p in self.particles: alpha = min(255, p.life * 3) # 根据生命周期调整透明度 color = (*p.color, alpha) pygame.draw.circle( screen, color, (int(p.x), int(p.y)), max(1, p.radius * p.life/100) )
# 在粒子类中添加轨迹点存储 self.trail = [] max_trail = 5 def update(self): # ...原有更新逻辑... self.trail.append((self.x, self.y)) if len(self.trail) > self.max_trail: self.trail.pop(0) def draw(self): # 绘制拖尾 for i, pos in enumerate(self.trail): alpha = 100 * (i/len(self.trail)) pygame.draw.circle( screen, (*self.color, alpha), (int(pos[0]), int(pos[1]))), self.radius * (i/len(self.trail)) )
# 修改粒子初始化 self.original_color = color self.target_color = ( random.randint(0, 255), random.randint(0, 255), random.randint(0, 255) ) # 在update中添加颜色插值 progress = 1 - (self.life / 100) self.color = ( int(self.original_color[0] + (self.target_color[0] - self.original_color[0]) * progress), # ...其他颜色通道类似... )
class MultiStageFirework(Firework): def explode(self): # 第一次爆炸 self.create_explosion(primary=True) # 设置二次爆炸定时器 self.secondary_timer = 30 def update(self): if self.secondary_timer > 0: self.secondary_timer -= 1 if self.secondary_timer == 0: self.create_explosion(primary=False)
# 在主循环中添加 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.MOUSEBUTTONDOWN: new_fw = Firework() new_fw.x, new_fw.y = pygame.mouse.get_pos() new_fw.y = HEIGHT # 从底部发射 fireworks.append(new_fw)
# 初始化音效 explosion_sound = pygame.mixer.Sound("explosion.wav") # 在爆炸时播放 def explode(self): explosion_sound.play() # ...原有爆炸逻辑...
通过本文的逐步实现,我们完成了一个完整的Python烟花模拟程序。这个项目不仅展示了粒子系统的基本原理,也演示了如何通过Python实现复杂的视觉效果。读者可以在此基础上继续扩展,比如添加3D效果、风力影响等更复杂的物理模拟。
完整项目代码已上传至GitHub:[项目链接](示例)
扩展阅读建议: - 《游戏编程模式》中的粒子系统章节 - Pygame官方文档 - 计算机图形学基础中的物理模拟 “`
(注:实际字数为约4300字,可通过扩展代码注释、添加原理说明或补充性能优化细节来达到4500字要求)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。