# 使用Python和Pygame创建惊艳的烟花表演
你有没有想过在不离开桌子的情况下就能看到一场烟花表演?Python的Pygame库使得创建有趣的视觉效果变得出乎意料的简单,包括色彩斑斓的烟花。在这篇博客中,我将向你展示如何构建一个生动的烟花表演,你可以直接在电脑上运行。
### 场景设置
为了创建我们的烟花表演,我们将使用Pygame——一个流行的Python库,用于制作2D游戏。首先,我们将设置显示窗口,初始化颜色,并准备主要组件。以下是基本设置:
```python
import pygame
import random
import math
import time
# 初始化pygame
pygame.init()
# 设置显示窗口
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("烟花表演")
# 颜色
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
PINK = (255, 105, 180)
YELLOW = (255, 255, 0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
PURPLE = (128, 0, 128)
ORANGE = (255, 165, 0)
```
这里,我们设置了一个800x600像素的窗口,烟花的魔法将在这里发生。我们还定义了将在整个表演中使用的几种颜色。
### 定义烟花类
烟花表演的核心是`Firework`类,它处理每个烟花的移动、爆炸和粒子效果。每个烟花从屏幕底部开始,向上移动,最终爆炸成多个彩色粒子。
让我们一步一步拆解`Firework`类:
```python
class Firework:
def __init__(self):
self.x = random.randint(100, WIDTH - 100)
self.y = HEIGHT
self.target_y = random.randint(100, 300)
self.color = random.choice([RED, BLUE, GREEN, PURPLE, ORANGE, YELLOW])
self.radius = 5
self.exploded = False
self.particles = []
```
在构造函数中,烟花在屏幕底部的随机位置初始化,并目标到达一定的高度。我们还为每个烟花随机选择一个颜色,使表演更加多样化。
### 创建爆炸效果
烟花上升到目标高度后爆炸,爆炸会产生多个粒子向四周移动,模拟真实的烟花效果。
```python
def explode(self):
self.exploded = True
num_particles = 50
for _ in range(num_particles):
angle = random.uniform(0, 2 * math.pi)
speed = random.uniform(2, 5)
px = self.x
py = self.y
p_radius = random.uniform(3, 5)
p_color = random.choice([RED, BLUE, GREEN, PURPLE, ORANGE, YELLOW])
vx = math.cos(angle) * speed
vy = math.sin(angle) * speed
self.particles.append((px, py, vx, vy, p_radius, p_color))
```
每个烟花会爆炸成50个粒子。每个粒子被赋予一个随机方向和速度,创造出一种混乱的爆炸效果。粒子随着下降逐渐消失,就像真实的烟花表演一样。
### 更新和绘制烟花
`update()`和`draw()`方法控制烟花的移动和如何在屏幕上显示:
- **`update()`**: 这个方法控制烟花的移动并更新爆炸后每个粒子的状态。
- **`draw()`**: 这个方法在屏幕上绘制烟花和它们的粒子。
以下是我们如何管理烟花和粒子的移动:
```python
def update(self):
if not self.exploded:
self.y -= 5
if self.y <= self.target_y:
self.explode()
else:
new_particles = []
for px, py, vx, vy, p_radius, p_color in self.particles:
px += vx
py += vy
vy += 0.1 # 重力效果
p_radius -= 0.05
if p_radius > 0:
new_particles.append((px, py, vx, vy, p_radius, p_color))
self.particles = new_particles
```
粒子受到重力影响(`vy += 0.1`),因此在爆炸后会逐渐下落。每个粒子也会逐渐缩小(`p_radius -= 0.05`),直到它消失。
### 整合所有部分:主循环
最后,我们有一个主循环,将所有部分结合在一起:
```python
def main():
clock = pygame.time.Clock()
running = True
fireworks = [Firework() for _ in range(3)]
fade_alpha = 5 # 用于淡出效果
overlay = pygame.Surface((WIDTH, HEIGHT))
overlay.fill(BLACK)
while running:
screen.fill(BLACK)
for firework in fireworks:
firework.update()
firework.draw(screen)
# 添加淡出效果
overlay.set_alpha(fade_alpha)
screen.blit(overlay, (0, 0))
pygame.display.flip()
clock.tick(30)
# 检查所有烟花是否都已爆炸且粒子消失,然后重置
if all(firework.exploded and not firework.particles for firework in fireworks):
time.sleep(2)
fireworks = [Firework() for _ in range(3)]
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
```
在这个循环中,我们创建了一个烟花数组,并在每一帧中更新它们。如果所有烟花都完成爆炸,我们就创建新的烟花。循环一直运行,直到用户关闭窗口。
结论
通过几行Python代码,我们创建了一个色彩斑斓、动态有趣的烟花表演!这个例子展示了如何使用Pygame创建有趣且视觉吸引力强的效果,使其成为游戏开发和创意项目的绝佳工具。
你可以自由修改这个代码,添加更多效果或不同类型的烟花。你可以添加不同的形状、新的颜色,甚至将烟花与音乐同步,以创造更身临其境的体验。可能性是无穷的!
如果你喜欢这个教程,一定要尝试自己制作烟花表演。祝你编码愉快,享受属于你个人的烟花秀!
import pygame
import random
import math
import time
# Initialize pygame
pygame.init()
# Set up display
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Fireworks Show")
# Colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
PINK = (255, 105, 180)
YELLOW = (255, 255, 0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
PURPLE = (128, 0, 128)
ORANGE = (255, 165, 0)
# Firework class
class Firework:
def __init__(self):
self.x = random.randint(100, WIDTH - 100)
self.y = HEIGHT
self.target_y = random.randint(100, 300)
self.color = random.choice([RED, BLUE, GREEN, PURPLE, ORANGE, YELLOW])
self.radius = 5
self.exploded = False
self.particles = []
def update(self):
if not self.exploded:
self.y -= 5
if self.y <= self.target_y:
self.explode()
else:
new_particles = []
for px, py, vx, vy, p_radius, p_color in self.particles:
px += vx
py += vy
vy += 0.1 # Gravity effect
p_radius -= 0.05
if p_radius > 0:
new_particles.append((px, py, vx, vy, p_radius, p_color))
self.particles = new_particles
def draw(self, surface):
if not self.exploded:
pygame.draw.circle(surface, self.color, (self.x, self.y), self.radius)
else:
for px, py, _, _, p_radius, p_color in self.particles:
pygame.draw.circle(surface, p_color, (int(px), int(py)), int(p_radius))
def explode(self):
self.exploded = True
num_particles = 50
for _ in range(num_particles):
angle = random.uniform(0, 2 * math.pi)
speed = random.uniform(2, 5)
px = self.x
py = self.y
p_radius = random.uniform(3, 5)
p_color = random.choice([RED, BLUE, GREEN, PURPLE, ORANGE, YELLOW])
vx = math.cos(angle) * speed
vy = math.sin(angle) * speed
self.particles.append((px, py, vx, vy, p_radius, p_color))
# Main loop
def main():
clock = pygame.time.Clock()
running = True
fireworks = [Firework() for _ in range(3)]
fade_alpha = 5 # For fading effect
overlay = pygame.Surface((WIDTH, HEIGHT))
overlay.fill(BLACK)
while running:
screen.fill(BLACK)
for firework in fireworks:
firework.update()
firework.draw(screen)
# Add fading effect
overlay.set_alpha(fade_alpha)
screen.blit(overlay, (0, 0))
pygame.display.flip()
clock.tick(30)
# Check if all fireworks have exploded and particles have disappeared, then reset
if all(firework.exploded and not firework.particles for firework in fireworks):
time.sleep(2)
fireworks = [Firework() for _ in range(3)]
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
if __name__ == "__main__":
main()