用python一起来看流星雨
源代码如下(遇上篇烟花代码几乎一样,参数值稍微不一样):
# -*- coding: utf-8 -*-
# Nola import tkinter as tk
from PIL import Image, ImageTk
from time import time, sleep
from random import choice, uniform,randint
from math import sin, cos, radians # # 初始化tkinter 创建根部件 必须在创建其他部件之前创建 且只有一个
# root = tk.Tk()
# # Label部件
# w = tk.Label(root, text="Hello Tkinter!")
# # pack告诉tkinter调整窗口大小适应所用的小部件
# w.pack()
# root.mainloop()
# 模拟重力
GRAVITY = 0.05
colors = ['red', 'blue', 'pink', 'white', 'green', 'orange', 'purple', 'seagreen', 'indigo', 'cornflowerblue'] class Part(object):
"""
particles 类
粒子在空中随机生成,变成一个圈,下坠,消失
"""
def __init__(self, cv, idx, total, explosion_speed, x=0., y=0., vx=0., vy=0., size=2., color='red', lifespan=2, **kwargs):
"""
:param cv: 画布
:param idx: 粒子的id
:param total: 总数
:param explosion_speed: 粒子初始速度
:param x: 粒子的横坐标
:param y: 粒子的纵坐标
:param vx: 粒子在x轴上的变化速度
:param vy: 粒子在y轴上的变化速度
:param size: 大小
:param color: 颜色
:param lifespan: 最高存在时长
:param kwargs:
"""
self.id = idx
self.x = x
self.y = y
self.initial_speed = explosion_speed
self.vx = vx
self.vy = vy
self.total = total
self.age = 0
self.color = color
self.cv = cv
self.cid = self.cv.create_oval(
x - size, y - size, x + size,
y + size, fill=self.color
)
self.lifespan = lifespan def update(self, dt):
"""
粒子运动函数,膨胀
:param dt:
:return:
"""
self.age += dt
if self.alive() and self.expand():
move_x = cos(radians(self.id*360 / self.total)) * self.initial_speed
move_y = sin(radians(self.id*360 / self.total)) * self.initial_speed
# self.vy = move_y / (float(dt)*1000)
self.cv.move(self.cid, move_x, move_y)
self.vx = move_x / (float(dt) * 1000) # 以自由落体坠落
elif self.alive():
move_x = cos(radians(self.id*360 / self.total))
self.cv.move(self.cid, self.vx + move_x, self.vy + GRAVITY*dt)
self.vy += GRAVITY * dt # 移除超过最高时长的粒子
elif self.cid is not None:
self.cv.delete(self.cid)
self.cid = None def alive(self):
"""
检查粒子是否在最高存在时长内
:return: bool
"""
return self.age <= 1.2 def expand(self):
"""
定义膨胀效果时间帧
:return: bool
"""
return self.age <= self.lifespan def simulate(cv):
"""
循环调用保持不停
:param cv: 画布
:return:
"""
numb_explode = randint(6, 10)
wait_time = randint(10, 100)
explode_points = []
t = time()
# 为所有模拟烟花绽放的全部粒子创建一个列表
for point in range(numb_explode):
objects = []
x_cordi = randint(50, 550)
y_cordi = randint(50, 150)
speed = uniform(0.5, 1.5)
size = uniform(1, 3) # 随机生成一个0.5-3之间的实数
color = choice(colors)
explosion_speed = uniform(0.2, 1)
total_particals = randint(5, 50)
for i in range(1, total_particals):
r = Part(cv, idx=1, total=total_particals, explosion_speed=explosion_speed, x=x_cordi, y=y_cordi,
vx=speed, vy=speed ,color=color, size=size, lifespan=uniform(0.6,1.75))
objects.append(r)
explode_points.append(objects) # 设置每个粒子没0.01秒更新状态 生命周期1.8秒 1.6秒存活(1.2秒绽放,0.4秒坠落,0.2秒移除)
total_time = .0
# 在1.8秒时间帧内保持更新
while total_time < 1.8:
sleep(0.01)
tnew = time()
t, dt = tnew, tnew - t
for point in explode_points:
for item in point:
item.update(dt)
cv.update()
total_time += dt
# 循环调用
root.after(wait_time, simulate, cv) def close(*ignore):
"""
退出程序,关闭窗口
:param ignore:
:return:
"""
global root
root.quit() if __name__ == '__main__':
# 初始化tkinter 创建根部件
root = tk.Tk() cv = tk.Canvas(root, height=400, width=600)
# 绘制一个黑色背景
cv.create_rectangle(0, 0, 600, 600, fill='black')
# 使用背景图片
# image = Image.open('./image.png')
# photo = ImageTk.PhotoImage(image)
# cv.create_image(0, 0, image=photo, anchor='nw')
cv.pack() root.protocol('WM_DELETE_WINDOW', close)
# 1秒后开始条约simulate()
root.after(100, simulate, cv)
root.mainloop()
用python一起来看流星雨的更多相关文章
- 基于python2+selenium3+pytest4的UI自动化框架
环境:Python2.7.10, selenium3.141.0, pytest4.6.6, pytest-html1.22.0, Windows-7-6.1.7601-SP1 特点:- 二次封装了s ...
- 夺命雷公狗---DEDECMS----16dedecms取出首页今日更新
我们这次就要来取出我们的电影和电视剧以及综艺节目: 我们首先在我们受页面的模版文件中获取电影和电视剧的标签: 我们发现这里有一大堆,我只留一个即可: 然后我们到后台更新下首页的模版,看下是否只有一个模 ...
- 夺命雷公狗---DEDECMS----13dedecms首页的完成
我们的dedecms搭建起来后直接复制templets的目录复制一份,如下所示: 然后进入templets目录里面,然后再将default里面的东西都给干掉,然后将我们预先准备好的首页放进来,代码如下 ...
- VBA 开发学习--基础语法
MsgBox "开始学习VBA" '提示框 Dim str As String '声明str变量是string类型 Let str = "一起来看流星雨" '给 ...
- 洛谷 P2895 [USACO08FEB]流星雨Meteor Shower 解题报告
一起来看流星雨吧(话说我还没看到过流星雨呢) 题目 Problem 小A则听说另一个骇人听闻的消息: 一场流星雨即将袭击整个霸中,由于流星体积过大,它们无法在撞击到地面前燃烧殆尽,届时将会对它撞到的一 ...
- canvas绘制流星雨特效
源码: <!DOCTYPE html><html> <head> <meta charset="utf-8"> <meta n ...
- 福州11911.562(薇)xiaojie:福州哪里有xiaomei
福州哪里有小姐服务大保健[微信:11911.562倩儿小妹[福州叫小姐服务√o服务微信:11911.562倩儿小妹[福州叫小姐服务][十微信:11911.562倩儿小妹][福州叫小姐包夜服务][十微信 ...
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
随机推荐
- tomcat安装与项目部署
1.tomcat依赖:jdk jre,环境变量配置 java_home jre_home 2.tomcat安装: 下载:http://tomcat.apache.org/ download ...
- 记oracle使用expdp将数据导出到asm报错
报错信息如下: ORA-39002: invalid operationORA-39070: Unable to open the log file.ORA-29283: invalid file o ...
- [iOS] 测试设备解决自签名证书问题
不多说,解决过程都是泪. 用了最简单粗暴的方式. 1. 将你的自签名证书,放到测试设备可以访问的站点上 2. 用safari访问上面的地址,直接将证书安装到本设备上 搞掂! Have fun with ...
- 游戏服务器之Java热更新
对于运行良好的游戏来说,停服一分就会损失很多收益.因为有些小bug就停服就划不来了.在使用Java开游戏服务器时,JVM给我们提供了一些接口,可以简单做一些热更新.修复一些小Bug而不用重启服务. J ...
- Nginx 多域名配置
nginx绑定多个域名可又把多个域名规则写一个配置文件里,也可又分别建立多个域名配置文件,我一般为了管理方便,每个域名建一个文件,有些同类域名也可又写在一个总的配置文件里.一.每个域名一个文件的写法 ...
- ajax return 的问题
平时都是在AJAX里执行逻辑,实然想到能不能return返回数据呢? ajax 是异步请求,return拿值得时候 ajax并没有取到值,所以是undefind. 需要把ajax的请求方式改为同步 v ...
- ansible常用命令大全
ansible 默认提供了很多模块来供我们使用.在 Linux 中,我们可以通过 ansible-doc -l 命令查看到当前 ansible 都支持哪些模块,通过 ansible-doc -s ...
- jquery easyui datagrid 将值作为img显示图片时报404 undefined
原因:datagrid 在请求到数据先进行头部数据和样式的渲染,之后数据 obj = {} value = undefined index = 0 进行一次渲染, 在没有formater情况将数据 ...
- linux 指令 备份
lsb_release -a LSB是Linux Standard Base的缩写,lsb_release命令用来显示LSB和特定版本的相关信息.如果使用该命令时不带参数,则默认加上-v参数. -v, ...
- Microsoft Visual Studio已停止工作
问题:今天在安装Visual Studio时,提示“Visual Studio installer 已停止工作” 解决办法:卸载原有的 .net framework,在微软官网下载 .net fra ...