重庆网站建设优化,阳江网络公司,公司报备网站,wordpress函数大全Pygame 绘制烟花的基本原理 1#xff0c;发射阶段#xff1a;在这一阶段烟花的形状是线性向上#xff0c;通过设定一组大小不同、颜色不同的点来模拟“向上发射” 的运动运动#xff0c;运动过程中 5个点被赋予不同大小的加速度#xff0c;随着时间推移#xff0c;后面的…Pygame 绘制烟花的基本原理 1发射阶段在这一阶段烟花的形状是线性向上通过设定一组大小不同、颜色不同的点来模拟“向上发射” 的运动运动运动过程中 5个点被赋予不同大小的加速度随着时间推移后面的点会赶上前面的点最终所有点会汇聚在一起处于 绽放准备阶段。
2烟花绽放烟花绽放这个阶段是由一个点分散多个点向不同方向发散并且每个点的移动轨迹可需要被记录目的是为了追踪整个绽放轨迹。
3烟花凋零此阶段负责描绘绽放后烟花的效果绽放后的烟花而在每一时刻点的下降速度和亮度代码中也叫透明度是不一样的因此在代码里将烟花绽放后将每个点赋予两个属性分别为重力向量和生命周期来模拟烟花在不同时期时不同的展现效果。
# Author : 小红牛
# 微信公众号WdPython
import math
from random import randint, uniform, choice
import pygamevector pygame.math.Vector2
gravity vector(0, 0.3)
DISPLAY_WIDTH 1100
DISPLAY_HEIGHT 700trail_colours [(45, 45, 45), (60, 60, 60), (75, 75, 75),(125, 125, 125), (150, 150, 150)]
dynamic_offset 1
static_offset 5class 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 particleself.exploded Falseself.particles []self.min_max_particles vector(100, 225)def update(self, win): # called every frameif 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 Trueself.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 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 Trueelse:return Falseclass Particle:def __init__(self, x, y, firework, colour):self.firework fireworkself.pos vector(x, y)self.origin vector(x, y)self.radius 20self.remove Falseself.explosion_radius randint(5, 18)self.life 0self.acc vector(0, 0)# trail variablesself.trails [] # stores the particles trail objectsself.prev_posx [-10] * 10 # stores the 10 last positionsself.prev_posy [-10] * 10 # stores the 10 last positionsif self.firework:self.vel vector(0, -randint(17, 20))self.size 5self.colour colourfor 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)for i in range(5):self.trails.append(Trail(i, self.size, False))def apply_force(self, force):self.acc forcedef move(self):if not self.firework:self.vel.x * 0.8self.vel.y * 0.8self.vel self.accself.pos self.velself.acc * 0if self.life 0 and not self.firework: # check if particle is outside explosion radiusdistance math.sqrt((self.pos.x - self.origin.x)** 2 (self.pos.y - self.origin.y) ** 2)if distance self.explosion_radius:self.remove Trueself.decay()self.trail_update()self.life 1def 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 particlesif 50 self.life 10: # early stage their is a small chance of decayran randint(0, 30)if ran 0:self.remove Trueelif self.life 50:ran randint(0, 5)if ran 0:self.remove Truedef 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 nself.pos vector(-10, -10)self.dynamic dynamicif self.dynamic:self.colour trail_colours[n]self.size int(size - n / 2)else:self.colour (255, 255, 200)self.size size - 2if self.size 0:self.size 0def 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.display.set_caption(2024新年快乐)win pygame.display.set_mode((DISPLAY_WIDTH, DISPLAY_HEIGHT))myfont pygame.font.Font(C:\Windows\Fonts\simkai.ttf, 80)text myfont.render(2024新年快乐, False, (255, 0, 0))# 将文字绘制到屏幕上win.blit(text, (100, 100))pygame.display.flip()clock pygame.time.Clock()fireworks [Firework() for i in range(3)] # create the first fireworksrunning Truewhile running:clock.tick(60)for event in pygame.event.get():if event.type pygame.QUIT:running Falseif event.type pygame.KEYDOWN:# Change game speed with number keysif event.key pygame.K_1:fireworks.append(Firework())if event.key pygame.K_2:for i in range(10):fireworks.append(Firework())win.fill((20, 20, 30)) # draw backgroundif randint(0, 20) 1: # create new fireworkfireworks.append(Firework())update(win, fireworks)# stats for fun# total_particles 0# for f in fireworks:# total_particles len(f.particles)# print(fFireworks: {len(fireworks)}\nParticles: {total_particles}\n\n)pygame.quit()quit()
main()完毕感谢您的收看
----------★★历史博文集合★★---------- 我的零基础Python教程Python入门篇 进阶篇 视频教程 Py安装py项目 Python模块 Python爬虫 Json Xpath 正则表达式 Selenium Etree CssGui程序开发 Tkinter Pyqt5 列表元组字典数据可视化 matplotlib 词云图 Pyecharts 海龟画图 Pandas Bug处理 电脑小知识office自动化办公 编程工具