Python实现新年烟花秀的代码怎么写
发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,今天就跟大家聊聊有关Python实现新年烟花秀的代码怎么写,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。先介绍下 Pygame 绘制烟花的基本
千家信息网最后更新 2024年11月20日Python实现新年烟花秀的代码怎么写
今天就跟大家聊聊有关Python实现新年烟花秀的代码怎么写,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
先介绍下 Pygame 绘制烟花的基本原理,烟花从发射到绽放一共分为三个阶段:
1,发射阶段:在这一阶段烟花的形状是线性向上,通过设定一组大小不同、颜色不同的点来模拟"向上发射" 的运动运动,运动过程中 5个点被赋予不同大小的加速度,随着时间推移,后面的点会赶上前面的点,最终所有点会汇聚在一起,处于 绽放准备阶段;
2,烟花绽放:烟花绽放这个阶段,是由一个点分散多个点向不同方向发散,并且每个点的移动轨迹可需要被记录,目的是为了追踪整个绽放轨迹。
3,烟花凋零,此阶段负责描绘绽放后烟花的效果,绽放后的烟花,而在每一时刻点的下降速度和亮度(代码中也叫透明度)是不一样的,因此在代码里,将烟花绽放后将每个点赋予两个属性:分别为重力向量和生命周期,来模拟烟花在不同时期时不同的展现效果。
程序运行截图:
完整程序代码:
import pygamefrom random import randint, uniform, choiceimport math vector = pygame.math.Vector2gravity = vector(0, 0.3)DISPLAY_WIDTH = DISPLAY_HEIGHT = 800 trail_colours = [(45, 45, 45), (60, 60, 60), (75, 75, 75), (125, 125, 125), (150, 150, 150)]dynamic_offset = 1static_offset = 3 class Firework: def __init__(self): # 随机颜色 self.colour = (randint(0, 255), randint(0, 255), randint(0, 255)) self.colours = ( (randint(0, 255), randint(0, 255), randint(0, 255)), (randint(0, 255), randint(0, 255), randint(0, 255)), (randint(0, 255), randint(0, 255), randint(0, 255))) self.firework = Particle(randint(0, DISPLAY_WIDTH), DISPLAY_HEIGHT, True, self.colour) # Creates the firework particle self.exploded = False self.particles = [] self.min_max_particles = vector(100, 225) def update(self, win): # called every frame if not self.exploded: self.firework.apply_force(gravity) self.firework.move() for tf in self.firework.trails: tf.show(win) self.show(win) if self.firework.vel.y >= 0: self.exploded = True self.explode() else: for particle in self.particles: particle.apply_force(vector(gravity.x + uniform(-1, 1) / 20, gravity.y / 2 + (randint(1, 8) / 100))) particle.move() for t in particle.trails: t.show(win) particle.show(win) def explode(self): # amount 数量 amount = randint(self.min_max_particles.x, self.min_max_particles.y) for i in range(amount): self.particles.append(Particle(self.firework.pos.x, self.firework.pos.y, False, self.colours)) def show(self, win): pygame.draw.circle(win, self.colour, (int(self.firework.pos.x), int(self.firework.pos.y)), self.firework.size) def remove(self): if self.exploded: for p in self.particles: if p.remove is True: self.particles.remove(p) if len(self.particles) == 0: return True else: return False class Particle: def __init__(self, x, y, firework, colour): self.firework = firework self.pos = vector(x, y) self.origin = vector(x, y) self.radius = 20 self.remove = False self.explosion_radius = randint(5, 18) self.life = 0 self.acc = vector(0, 0) # trail variables self.trails = [] # stores the particles trail objects self.prev_posx = [-10] * 10 # stores the 10 last positions self.prev_posy = [-10] * 10 # stores the 10 last positions if self.firework: self.vel = vector(0, -randint(17, 20)) self.size = 5 self.colour = colour for i in range(5): self.trails.append(Trail(i, self.size, True)) else: self.vel = vector(uniform(-1, 1), uniform(-1, 1)) self.vel.x *= randint(7, self.explosion_radius + 2) self.vel.y *= randint(7, self.explosion_radius + 2) # 向量 self.size = randint(2, 4) self.colour = choice(colour) # 5 个 tails总计 for i in range(5): self.trails.append(Trail(i, self.size, False)) def apply_force(self, force): self.acc += force def move(self): if not self.firework: self.vel.x *= 0.8 self.vel.y *= 0.8 self.vel += self.acc self.pos += self.vel self.acc *= 0 if self.life == 0 and not self.firework: # check if particle is outside explosion radius distance = math.sqrt((self.pos.x - self.origin.x) ** 2 + (self.pos.y - self.origin.y) ** 2) if distance > self.explosion_radius: self.remove = True self.decay() self.trail_update() self.life += 1 def show(self, win): pygame.draw.circle(win, (self.colour[0], self.colour[1], self.colour[2], 0), (int(self.pos.x), int(self.pos.y)), self.size) def decay(self): # random decay of the particles if 50 > self.life > 10: # early stage their is a small chance of decay ran = randint(0, 30) if ran == 0: self.remove = True elif self.life > 50: ran = randint(0, 5) if ran == 0: self.remove = True def trail_update(self): self.prev_posx.pop() self.prev_posx.insert(0, int(self.pos.x)) self.prev_posy.pop() self.prev_posy.insert(0, int(self.pos.y)) for n, t in enumerate(self.trails): if t.dynamic: t.get_pos(self.prev_posx[n + dynamic_offset], self.prev_posy[n + dynamic_offset]) else: t.get_pos(self.prev_posx[n + static_offset], self.prev_posy[n + static_offset]) class Trail: def __init__(self, n, size, dynamic): self.pos_in_line = n self.pos = vector(-10, -10) self.dynamic = dynamic if self.dynamic: self.colour = trail_colours[n] self.size = int(size - n / 2) else: self.colour = (255, 255, 200) self.size = size - 2 if self.size < 0: self.size = 0 def get_pos(self, x, y): self.pos = vector(x, y) def show(self, win): pygame.draw.circle(win, self.colour, (int(self.pos.x), int(self.pos.y)), self.size) def update(win, fireworks): for fw in fireworks: fw.update(win) if fw.remove(): fireworks.remove(fw) pygame.display.update() def main(): pygame.init() pygame.font.init() pygame.display.set_caption("Fireworks in Pygame") # 标题 background = pygame.image.load("img/1.png") # 背景 myfont = pygame.font.Font("img/simkai.ttf",80) myfont1 = pygame.font.Font("img/simkai.ttf", 30) testsurface = myfont.render("新年快乐",False,(251, 59, 85)) testsurface1 = myfont1.render("By:Python代码大全", False, (251, 59, 85)) # pygame.image.load("") win = pygame.display.set_mode((DISPLAY_WIDTH, DISPLAY_HEIGHT)) # win.blit(background) clock = pygame.time.Clock() fireworks = [Firework() for i in range(2)] # create the first fireworks running = True while running: clock.tick(60) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False if event.type == pygame.KEYDOWN: # Change game speed with number keys if event.key == pygame.K_1: # 按下 1 fireworks.append(Firework()) if event.key == pygame.K_2: # 按下 2 加入10个烟花 for i in range(10): fireworks.append(Firework()) win.fill((20, 20, 30)) # draw background win.blit(background,(0,0)) win.blit(testsurface,(200,30)) win.blit(testsurface1, (520,80)) if randint(0, 20) == 1: # create new firework fireworks.append(Firework()) update(win, fireworks) # stats for fun # total_particles = 0 # for f in fireworks: # total_particles += len(f.particles) # print(f"Fireworks: {len(fireworks)}\nParticles: {total_particles}\n\n") pygame.quit() quit() main()
看完上述内容,你们对Python实现新年烟花秀的代码怎么写有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
烟花
代码
不同
阶段
内容
发射
运动
向量
大小
效果
程序
轨迹
颜色
三个
两个
亮度
加速度
原理
周期
多个
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
生产软件开发叫什么组名字
惠普服务器管理模块
高级数据库技术试题及答案
网络安全引起政治事件
四川专业软件开发报价
审计网络安全宣传
网络安全是指通过采取
服务器与网站安全管理系统
取得三级数据库证书的要求
酒泉展厅多媒体软件开发
网络安全概念车 功能
authing是网络安全行业吗
服务器安全软件接口拦截
高中网络技术应用所需软件
组成服务器远程服务器错误501
杭州赋能猫网络技术
软件开发过程中典型活动
服务器管理员删库跑路
服务器管理平台工具
银行科技岗跳槽互联网
陈子豪mc服务器
年度网络安全日主题
网络安全防范意识心得体会
天津erp平台网络技术
中国的网络安全还比较薄弱
地形地貌数据库
广州产品追溯软件开发
平均成绩 数据库
网络安全与维护专业累不累
vue读取数据库对象的数据