python语言:烟花效果实现
生活随笔
收集整理的这篇文章主要介绍了
python语言:烟花效果实现
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
一、用tkinter实现一个实现烟花的程序
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 colors = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 'seagreen', 'indigo', 'cornflowerblue'] class fireworks:def __init__(self, cv, idx, total, explosion_speed, x=0., y=0., vx=0., vy=0., size=2., color='red', lifespan=2, **kwargs):self.id = idx# 烟花绽放 x 轴self.x = x# 烟花绽放 x 轴self.y = yself.initial_speed = explosion_speed# 外放 x 轴速度self.vx = vx# 外放 y 轴速度self.vy = vy# 绽放的粒子数self.total = total# 已停留时间self.age = 0# 颜色self.color = color# 画布self.cv = cvself.cid = self.cv.create_oval(x - size, y - size, x + size, y + size,fill=self.color)self.lifespan = lifespan# 更新数据def update(self, dt):self.age += dt# 粒子膨胀if self.alive() and self.expand():move_x = cos(radians(self.id * 360 / self.total)) * self.initial_speedmove_y = sin(radians(self.id * 360 / self.total)) * self.initial_speedself.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 + 0.5 * dt)self.vy += 0.5 * dt# 过期移除elif self.cid is not None:cv.delete(self.cid)self.cid = None# 定义膨胀效果的时间帧def expand(self):return self.age <= 1.5# 检查粒子是否仍在生命周期内def alive(self):return self.age <= self.lifespandef ignite(cv):t = time()# 烟花列表explode_points = []wait_time = randint(10, 100)# 爆炸的个数numb_explode = randint(6, 10)for point in range(numb_explode):# 爆炸粒子列表objects = []# 爆炸 x 轴x_cordi = randint(50, 550)# 爆炸 y 轴y_cordi = randint(50, 150)speed = uniform(0.5, 1.5)size = uniform(0.5, 3)color = choice(colors)# 爆炸的绽放速度explosion_speed = uniform(0.2, 1)# 爆炸的粒子数半径total_particles = randint(10, 50)for i in range(1, total_particles):r = fireworks(cv, idx=i, total=total_particles, 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)total_time = .0# 在 1.8 秒时间帧内保持更新while total_time < 1.8:# 让画面暂停 0.01ssleep(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 += dtroot.after(wait_time, ignite, cv)if __name__ == "__main__":root = tk.Tk()# 绘制一个画布cv = tk.Canvas(root, height=400, width=600)# 背景图image = Image.open("D001.jpg")photo = ImageTk.PhotoImage(image)# 在画板上绘制一张图片cv.create_image(0, 0, image=photo, anchor='nw')cv.pack()root.protocol(colors)root.after(100, ignite, cv)# 生成窗口root.mainloop()二、实现效果
总结
以上是生活随笔为你收集整理的python语言:烟花效果实现的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: python图像编程:实现弹球游戏
- 下一篇: python语言:装饰器原理