Python烟花代码(需安装Pygame模块)
以下是对这段代码的分析(混元AI生成)
这段代码是一个使用 Python 的 Pygame 库实现的烟花效果程序,并且将文本以烟花的形式呈现。以下是对代码的详细分析:
1. 导入模块
收起
python
import pygame
import random
import math
导入了 Pygame 库用于创建游戏和图形界面,random
库用于生成随机数,math
库用于数学运算。
2. 初始化 Pygame
收起
python
pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("CSDN征稿项目")
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
初始化 Pygame,设置窗口的宽度和高度为 800×600 像素,设置窗口标题为 “CSDN 征稿项目”,定义白色和黑色的 RGB 值。
3. Firework
类
收起
python
class Firework:
def __init__(self, x, y, char=None):
self.x = x
self.y = y
self.char = char
self.speed = random.randint(10, 20)
self.colour = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
self.exploded = False
self.particles = []
Firework
类表示烟花,初始化时设置烟花的位置(x, y)
,可能携带的字符char
,上升速度speed
,颜色colour
,爆炸状态exploded
和粒子列表particles
。
收起
python
def update(self):
if not self.exploded:
self.y -= self.speed
if self.y < HEIGHT // 2:
self.explode()
else:
remove_particles = []
for particle in self.particles:
particle.update()
if particle.is_dead():
remove_particles.append(particle)
for particle in remove_particles:
self.particles.remove(particle)
if len(self.particles) == 0:
return True
return False
update
方法用于更新烟花的状态。如果烟花尚未爆炸,它会向上移动,当到达窗口上半部分时触发爆炸。爆炸后,更新每个粒子的状态,并移除死亡的粒子。当所有粒子都死亡时,返回True
。
收起
python
def explode(self):
self.exploded = True
num_particles = random.randint(120, 180)
t = 0
for _ in range(num_particles):
t += 2 * math.pi / num_particles
r = 16 * (1 + math.sin(t) ** 3)
x_offset = r * math.cos(t)
y_offset = r * math.sin(t)
particle = Particle(self.x + x_offset, self.y + y_offset, self.colour)
self.particles.append(particle)
explode
方法用于触发烟花的爆炸。生成一定数量的粒子(120 到 180 个),根据数学公式计算每个粒子的初始位置,并将其添加到粒子列表中。
收起
python
def draw(self, screen):
if not self.exploded:
pygame.draw.circle(screen, self.colour, (self.x, self.y), 5)
else:
for particle in self.particles:
particle.draw(screen)
draw
方法用于在屏幕上绘制烟花。如果烟花尚未爆炸,绘制一个圆形表示烟花;如果已爆炸,绘制每个粒子。
4. Particle
类
收起
python
class Particle:
def __init__(self, x, y, colour):
self.x = x
self.y = y
self.colour = colour
self.speed_x = random.uniform(-2, 2)
self.speed_y = random.uniform(1, 3)
self.life = 255
Particle
类表示烟花爆炸后的粒子,初始化时设置粒子的位置(x, y)
,颜色colour
,水平和垂直速度speed_x
和speed_y
,以及生命周期life
。
收起
python
def update(self):
self.x += self.speed_x
self.y += self.speed_y
self.life -= 2
update
方法用于更新粒子的位置和生命周期。粒子会根据速度移动,并且生命周期会减少。
收起
python
def is_dead(self):
return self.life <= 0
is_dead
方法用于判断粒子是否死亡,即生命周期是否小于等于 0。
收起
python
def draw(self, screen):
alpha = self.life if self.life > 0 else 0
colour_with_alpha = self.colour + (alpha,)
pygame.draw.circle(screen, colour_with_alpha, (int(self.x), int(self.y)), 2)
draw
方法用于在屏幕上绘制粒子,根据粒子的生命周期设置透明度,并绘制一个圆形。
5. text_to_fireworks
函数
收起
python
def text_to_fireworks(text, start_x, start_y, spacing):
fireworks = []
for i, char in enumerate(text):
x = start_x + i * spacing
y = start_y
fireworks.append(Firework(x, y, char))
return fireworks
该函数将文本转换为烟花列表。根据文本中的每个字符,在指定的起始位置和间距处创建一个Firework
对象。
6. main
函数
收起
python
def main():
text = "I Love You!"
start_x = WIDTH // 2 - len(text) * 30 // 2
start_y = 50
spacing = 60
fireworks_text = text_to_fireworks(text, start_x, start_y, spacing)
fireworks = fireworks_text + [Firework(random.randint(0, WIDTH), HEIGHT) for _ in range(10)]
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill(BLACK)
remove_fireworks = []
for firework in fireworks:
if firework.update():
remove_fireworks.append(firework)
firework.draw(screen)
for firework in remove_fireworks:
fireworks.remove(firework)
if random.random() < 0.05:
fireworks.append(Firework(random.randint(0, WIDTH), HEIGHT))
pygame.display.flip()
clock.tick(60)
pygame.quit()
main
函数是程序的主入口。设置要显示的文本,计算文本烟花的起始位置和间距,创建文本烟花和一些随机位置的烟花。在主循环中,处理事件,填充屏幕背景,更新和绘制烟花,移除已死亡的烟花,随机添加新的烟花,最后更新屏幕显示并控制帧率。
7. 程序入口
收起
python
if __name__ == "__main__":
main()
确保只有在直接运行脚本时才会执行main
函数。
总结
这段代码通过 Pygame 库实现了一个动态的烟花效果,并且将文本以烟花的形式呈现。它展示了如何使用面向对象编程和 Pygame 的基本功能来创建有趣的图形应用程序。
项目已开源到Github
项目地址:View 1 · Python yanhuadaima
作者:Conaden战无不胜