Python新春烟花

fireworks

系列文章

写在前面

Python实现炫酷新春烟花动画的完整代码。

技术需求

  1. Pygame库

    • Pygame是一个专门用于游戏开发的Python库,提供了图形绘制、事件处理、音频播放等功能。在此代码中,Pygame用于创建窗口、处理用户事件、绘制图形(如粒子、烟花和文字)等。
  2. 粒子系统

    • 粒子系统是一种模拟物理现象的技术,通常用于创建爆炸、烟雾、火焰等效果。在这段代码中,粒子系统用于模拟烟花的爆炸效果。每个粒子有位置、速度、生命周期等属性,并受重力影响,模拟烟花爆炸后的飞散效果。
  3. 物理模拟

    • 代码中的粒子受重力影响,这一效果通过在update()方法中调整vy(垂直速度)来模拟。粒子逐渐加速向下运动,模仿现实中烟花爆炸后物体的运动轨迹。
  4. 随机数生成

    • 随机数生成用于控制烟花的颜色、发射角度、速度和生命周期等。在每次生成新的烟花时,程序会随机选择颜色、粒子数量、粒子角度等,使得每次烟花效果都是独一无二的。
  5. 图形绘制

    • 使用pygame.draw.circle()函数绘制粒子和文字,展示烟花的动态效果和“Happy New Year!”的祝福。pygame.font.SysFont()则用于加载系统字体并绘制文本。
  6. 事件处理

    • 通过pygame.event.get()捕获并处理用户事件,如关闭窗口等,使得程序能够响应用户操作,保证应用的交互性。
  7. 动画控制

    • 使用帧率控制(通过clock.tick(FPS))来保证动画流畅,并通过time.sleep(0.05)稍微减慢每帧的更新,使得烟花效果能够更清晰地展示。
  8. 面向对象编程(OOP)

    • 通过定义ParticleFirework类,程序采用了面向对象编程的思想,将粒子和烟花的行为封装在不同的类中,使得代码更加结构化、易于维护和扩展。

完整代码

import pygame
import random
import math
import time

# Initialize Pygame
pygame.init()

# Constants
SCREEN_WIDTH = 1200
SCREEN_HEIGHT = 700
BACKGROUND_COLOR = (0, 0, 0)  # Black
FPS = 60

# Screen setup
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption('新春烟花')

# Font setup using system default font
font = pygame.font.SysFont("Comic Sans MS", 100)  # You can replace "Arial" with any system font
text_color = (255, 255, 255)  # White color for the text

# Particle class
class Particle:
    def __init__(self, x, y, color, angle, speed, life):
        self.x = x
        self.y = y
        self.color = color
        self.angle = angle
        self.speed = speed
        self.life = life
        self.radius = 2
        self.vx = math.cos(angle) * speed
        self.vy = math.sin(angle) * speed

    def update(self):
        self.x += self.vx
        self.y += self.vy
        self.life -= 1
        self.vy += 0.05  # Gravity effect

    def draw(self):
        pygame.draw.circle(screen, self.color, (int(self.x), int(self.y)), self.radius)


# Firework class
class Firework:
    def __init__(self, x, y, color, num_particles=100, spread=2 * math.pi):
        self.x = x
        self.y = y
        self.color = color
        self.num_particles = num_particles
        self.spread = spread
        self.particles = []
        self.exploded = False

    def explode(self):
        if not self.exploded:
            for _ in range(self.num_particles):
                angle = random.uniform(0, self.spread)
                speed = random.uniform(1, 3)
                life = random.randint(30, 50)
                particle = Particle(self.x, self.y, self.color, angle, speed, life)
                self.particles.append(particle)
            self.exploded = True
……

代码分析

这段代码使用了Python的Pygame库来创建一个动态的新春烟花显示效果。该程序模拟了烟花的发射、爆炸以及粒子效果,并在屏幕中央显示了“Happy New Year!”的祝福文字。我们将从程序结构、核心功能、代码实现和细节等方面进行详细分析。

1. 程序结构

程序的主体由几个重要部分组成:

  • Pygame初始化和常量定义: 初始化Pygame库并定义一些常量,如屏幕的宽度和高度、背景颜色、帧率等。
  • Particle类: 负责定义烟花中的粒子及其行为(位置、速度、生命周期等)。
  • Firework类: 负责烟花的爆炸和粒子的生成与更新。
  • 主循环(main函数): 负责处理游戏事件、更新画面、发射烟花和显示文字等。

2. Pygame初始化

pygame.init()

这行代码初始化了Pygame库,允许程序使用Pygame的功能,如绘制图形、播放音效、处理事件等。初始化后,我们可以通过Pygame提供的各种方法来控制窗口、图形和声音等。

3. 常量和屏幕设置

SCREEN_WIDTH = 1200
SCREEN_HEIGHT = 700
BACKGROUND_COLOR = (0, 0, 0)  # Black
FPS = 60

在此处,定义了几个常量来设置窗口的宽度、长度、背景颜色和帧率。屏幕宽度为1200像素,高度为700像素,背景颜色为黑色,帧率为60帧每秒(FPS)。这些常量为程序的整体布局和动画流畅度提供了基础。

接下来,使用以下代码创建一个Pygame窗口,并设置标题:

screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption('新春烟花')

pygame.display.set_mode()方法创建一个宽1200像素,高700像素的屏幕,pygame.display.set_caption()设置窗口标题为“新春烟花”。

4. 字体设置

font = pygame.font.SysFont("Comic Sans MS", 100)
text_color = (255, 255, 255)  # White color for the text

通过pygame.font.SysFont()方法,程序使用了“Comic Sans MS”字体,字号为100,用来绘制屏幕上的文字(“Happy New Year!”)。文字的颜色设置为白色(RGB为255, 255, 255)。

5. Particle类

Particle类用于表示烟花中的每一个粒子。每个粒子有其独特的属性:位置(x, y)、颜色(color)、速度(vx, vy)、角度(angle)、生命周期(life)等。

class Particle:
    def __init__(self, x, y, color, angle, speed, life):
        self.x = x
        self.y = y
        self.color = color
        self.angle = angle
        self.speed = speed
        self.life = life
        self.radius = 2
        self.vx = math.cos(angle) * speed
        self.vy = math.sin(angle) * speed
  • x, y:粒子初始的坐标。
  • color:粒子的颜色。
  • angle:粒子的发射角度,单位为弧度。
  • speed:粒子的初始速度。
  • life:粒子的生存周期。
  • vx, vy:粒子的水平和垂直速度,由角度和速度计算得出。

update()方法负责更新粒子的位置,并考虑了重力效应:

def update(self):
    self.x += self.vx
    self.y += self.vy
    self.life -= 1
    self.vy += 0.05  # Gravity effect

每帧,粒子的xy坐标根据其速度vxvy进行更新,life减1表示粒子逐渐消失,同时垂直速度(vy)增加模拟重力的作用。

draw()方法通过pygame.draw.circle()绘制粒子:

def draw(self):
    pygame.draw.circle(screen, self.color, (int(self.x), int(self.y)), self.radius)

6. Firework类

Firework类用于模拟烟花的爆炸过程和管理其中的粒子。

class Firework:
    def __init__(self, x, y, color, num_particles=100, spread=2 * math.pi):
        self.x = x
        self.y = y
        self.color = color
        self.num_particles = num_particles
        self.spread = spread
        self.particles = []
        self.exploded = False
  • x, y:烟花的发射位置。
  • color:烟花的颜色。
  • num_particles:每次爆炸时生成的粒子数,默认值为100。
  • spread:粒子爆炸的角度范围,默认值为2 * math.pi,表示360度范围内。

explode()方法负责生成烟花爆炸时的粒子:

def explode(self):
    if not self.exploded:
        for _ in range(self.num_particles):
            angle = random.uniform(0, self.spread)
            speed = random.uniform(1, 3)
            life = random.randint(30, 50)
            particle = Particle(self.x, self.y, self.color, angle, speed, life)
            self.particles.append(particle)
        self.exploded = True

每次烟花爆炸时,会随机生成若干粒子(角度、速度和生命周期是随机的),并将其加入particles列表。

update()方法负责更新粒子状态并检查是否爆炸:

def update(self):
    if not self.exploded:
        self.explode()
    for particle in self.particles:
        particle.update()

draw()方法负责绘制所有粒子:

def draw(self):
    for particle in self.particles:
        if particle.life > 0:
            particle.draw()

7. 主循环

主循环是程序的核心部分,负责处理事件、更新画面和控制烟花的生成与显示。

  • 事件处理: 通过pygame.event.get()获取事件并检查是否退出程序。
  • 烟花发射: 以30%的概率随机发射新烟花。
  • 更新与绘制烟花: 每帧更新所有烟花的状态并绘制它们。
  • 文字显示: 在屏幕中央绘制“Happy New Year!”的祝福文字。

8. 总结

这段代码通过Pygame实现了一个简单但美丽的烟花效果。它利用了粒子系统来模拟烟花爆炸后的粒子运动,并通过随机化粒子速度、角度和生命周期,确保每次爆炸都有独特的效果。此外,代码也通过主循环实时更新烟花的状态并在屏幕上显示祝福文字,为新春节日增添了节日氛围。

写在后面

我是一只有趣的兔子,感谢你的喜欢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Want595

感谢小伙伴的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值