Python烟花秀
前言
Python跨年烟花表演,具体源码见:Python跨年烟花代码-Python文档类资源-CSDN下载
烟花的粒子类
class particle: #烟花的粒子类
def __init__(self,canvas,num,sums,x,y,x_speed,y_speed,explosion_speed,color,size,max_life):
self.canvas=canvas #画布
self.num=num #粒子的序号
self.sums=sums #粒子的个数
self.x=x #粒子的横向坐标
self.y=y #粒子的纵向坐标
self.x_speed=x_speed #粒子在横向的移动速度
self.y_speed=y_speed #粒子在纵向的移动速度
self.initial_speed=explosion_speed #粒子的初始速度
self.color=color #粒子的颜色
self.life=0 #粒子当前存活的时间
self.max_life=max_life #粒子最大的存活时间
self.oval=self.canvas.create_oval(x-size,y-size,x+size,y+size,fill=self.color) #粒子的范围(烟花的大小)
def expand(self): #判断粒子是否还在爆炸
if self.life<=1.5: #粒子是否到达最大爆炸时间
return 1
else:
return 0
def alive(self): #判断粒子是否存活
if self.life<=self.max_life: #粒子是否到达最大存活时间
return 1
else:
return 0
def new(self,dt): #更新当前烟花的粒子位置
self.life=self.life+dt #更新当前存活时间
if self.alive() and self.expand(): #如果当前存活时间在爆炸时间内
move_x=m.cos(m.radians(self.num*360/self.sums))*self.initial_speed #则执行爆炸,更新横向坐标
move_y=m.sin(m.radians(self.num*360/self.sums))*self.initial_speed #更新纵向坐标
self.canvas.move(self.oval,move_x,move_y) #在画布上更新烟花
self.x_speed=move_x/(float(dt)*1000) #烟花绽放的速度
elif self.alive(): #如果爆炸结束了,但粒子还存在,则开始坠落
move_x=m.cos(m.radians(self.num*360/self.sums)) #更新横向坐标
self.canvas.move(self.oval,self.x_speed+move_x,self.y_speed+0.05*dt) #在画布上更新烟花
self.y_speed=self.y_speed+0.5*dt #烟花坠落的速度
elif self.oval is not None: #如果在坠落的时间外了,就将烟花从画布上擦除
canvas.delete(self.oval)
self.oval=None
烟花秀的实现
def fireworks(canvas):#烟花函数(循环更新当前界面)
times=ti.time() #获取当前时间戳
explode_points=[] #烟花列表
wait_time=r.randint(1,10) #等待时间
num_explode=r.randint(20,30) #烟花的个数
for point in range(num_explode): #依次更新各个烟花
firework=[] #当前烟花的粒子列表
x=r.randint(50,550) #当前烟花的粒子在横向的活动范围
y=r.randint(50,150) #当前烟花的粒子在纵向的活动范围
speed=r.uniform(0.5,2) #粒子的绽放速度
size=r.uniform(0.5,1.5) #粒子的大小
color=r.choice(colors) #粒子的颜色
explosion_speed=r.uniform(0.2,5) #粒子爆炸的速度
sum_particles=r.randint(30,50) #粒子的总数
max_life=r.uniform(0.6,1.75) #粒子的最大存活时间
for i in range(1,sum_particles): #当前烟花的每个粒子的参数
fire=particle(canvas,num=i,sums=sum_particles,explosion_speed=explosion_speed,x=x,y=y,x_speed=speed,y_speed=speed,color=color,size=size,max_life=max_life)
firework.append(fire) #将当前粒子加入到当前的烟花粒子列表中
explode_points.append(firework) #将当前烟花加入到烟花列表中
expand_time=0 #初始爆炸的时间
while expand_time<2: #如果爆炸的时间小于2
ti.sleep(0.001) #爆炸帧
newtime=ti.time() #获取爆炸一次的时间戳
times,dt=newtime,newtime-times #更新当前的时间戳
for point in explode_points: #更新所有的粒子位置
for item in point:
item.new(dt)
canvas.update() #更新当前画布
expand_time=expand_time+dt #更新当前的爆炸时间
global root #root界面是全局变量
root.after(wait_time,fireworks,canvas)
相关文章
- [Python]架设python虚拟环境以及部署PythonWeb服务
- Python学习--23 内建模块及第三方库
- 第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求
- Python函数参数默认值的陷阱和原理深究(转)
- python卸载或者安装时提示There is a problem with this Windows Installer package.A program required for this install to complete could not be run. Contact your support personnel or package vendor
- python: easyocr的安装和使用(easyocr 1.6.2 / Python 3.7.15 )
- python:pip升级pip本身和setuptools(Python 3.7.15)
- PYTHON多进程编码结束之进程池POOL
- 【Python实战】python中含有中文字符无法运行
- python自定义小工具:密码匿名化、毫秒时间显示、人类易读字节
- 【学习总结】Python-3- 类型判断之 isinstance 和 type 的区别
- Loggers in Python
- Python爬虫开发:requests库的使用--发送带参数post请求
- Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Scale/Scale的Command)
- python --> Python初阶 --> 基础语法 --> 条件和分支
- Python可视化数据分析01、python环境搭建
- Python每日一练——第23天:综合练习
- 【python代码】:能在手机上敲 Python 代码几款App
- 〖Python 数据库开发实战 - Redis篇⑦〗- Redis数据结构 - 哈希类型
- python数据分析小案例:把招聘数据做可视化处理~
- 命令行启动模块的Python代码研究
- C++调用C++项目中的Python脚本中的函数和类。,在,工程,python
- Python编程:查看python环境支持的whl
- Python编程:命令行python和python -m的区别
- Python编程:flask_restful模块提供api接口
- harris 算法python实现
- 多版本Python共存时pip给指定版本的python安装package的方法
- Python小白的数学建模课-B2. 新冠疫情 SI模型
- python二级练习(8)