python和pygame实现烟花特效
新年来临之际,来一个欢庆新年烟花祝贺,需要安装使用第三方库pygame,关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520
效果图及源码
先看效果图:
源码如下:
import pygame
import random
import math
# 初始化pygame
pygame.init()
# 设置窗口大小
width, height = 800, 600
screen = pygame.display.set_mode((width, height))
# 定义颜色
black = (0, 0, 0)
red = (255, 0, 0)
# 定义烟花粒子
class Particle:
def __init__(self, x, y, color):
self.x = x
self.y = y
self.color = color
self.radius = random.randint(2, 4)
self.angle = random.uniform(0, 2 * math.pi)
self.speed = random.uniform(1, 3)
self.gravity = 0.1
def move(self):
self.x += math.cos(self.angle) * self.speed
self.y += math.sin(self.angle) * self.speed + self.gravity
self.radius -= 0.1 # 粒子逐渐变小
def draw(self):
pygame.draw.circle(screen, self.color, (int(self.x), int(self.y)), int(self.radius))
# 定义烟花
class Firework:
def __init__(self, x, y):
self.x = x
self.y = y
self.color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
self.particles = []
self.exploded = False
self.explode_height = random.randint(100, 400) # 设置爆炸高度
self.speed = random.randint(5, 10) # 设置上升速度
self.angle = math.pi / 2 # 设置上升角度为垂直向上
def launch(self):
if not self.exploded:
self.y -= self.speed * math.sin(self.angle)
if self.y <= self.explode_height: # 到达设定高度后爆炸
self.explode()
self.exploded = True
def explode(self):
for _ in range(100): # 爆炸产生的粒子数量
self.particles.append(Particle(self.x, self.y, self.color))
def draw(self):
if not self.exploded:
pygame.draw.circle(screen, self.color, (int(self.x), int(self.y)), 5)
else:
for particle in self.particles:
particle.move()
particle.draw()
#显示文字
#font = pygame.font.Font(None, 36) # 设置字体和大小
font = pygame.font.Font("C:\\Windows\\Fonts\\simsun.ttc", 36)
text = font.render("龙年快乐", True, red) # 渲染文本
text_rect = text.get_rect(center=(width // 2, height // 2)) # 获取文本的矩形区域
# 主循环
fireworks = []
clock = pygame.time.Clock()
running = True
while running:
clock.tick(30) # 控制帧率
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill(black)
# 绘制文本
screen.blit(text, text_rect)
# 发射烟花
if random.randint(1, 20) == 1: # 控制烟花发射频率
fireworks.append(Firework(random.randint(0, width), height))
# 更新烟花并绘制
for firework in fireworks[:]:
firework.launch()
firework.draw()
if firework.exploded and all(p.radius <= 0 for p in firework.particles):
fireworks.remove(firework)
pygame.display.flip()
pygame.quit()
pygame在屏幕上显示字体的方法说明
使用pygame.font.Font
函数来设置字体和大小,然后使用font.render
函数将文本渲染为图像。最后,使用screen.blit
函数将渲染好的文本图像绘制到屏幕上。
pygame.font.Font(None, 字体大小)使用系统默认字体,可能不支持汉字。None代表系统默认字体,如pygame.font.Font(None, 36),可能不支持汉字。怎么办?使用pygame.font. Font(“含路径的字体名”,字体大小),指定支持汉字的字体,如:pygame.font.Font("C:\\Windows\\Fonts\\simsun.ttc", 36),simsun.ttc是宋体,字体的路径和名称。在windows中如何确定字体的路径和名称呢?参见下图
改进:添加背景音乐,增添欢乐的气氛
在“# 主循环”部分前,添加如下代码
# 载入背景音乐
pygame.mixer.music.load("踩着开心的节奏 - 橙光音乐.mp3")
pygame.mixer.music.set_volume(0.5) # 设置音量
pygame.mixer.music.play(-1) # 播放背景音乐,-1表示循环播放
其中,pygame.mixer.music.load函数加载背景音乐文件(例如名为"踩着开心的节奏 - 橙光音乐.mp3"文件,并将其放在与代码文件相同的目录下),然后使用pygame.mixer.music.set_volume函数设置音量大小(范围为0.0-1.0)。最后,使用pygame.mixer.music.play函数播放背景音乐,参数-1表示循环播放。
请你使用自己背景音乐文件替换"踩着开心的节奏 - 橙光音乐.mp3",只要保证正确命名文件名和路径即可。