新年快乐! python实现绚烂的烟花绽放效果

做了一个Python的小项目。利用了一点python的可视化技巧,做出烟花绽放的效果,文章的灵感来自网络上一位大神。

一.编译环境

Pycharm

二.模块

1.tkinter:这个小项目的主角,是一个python图形模块。且Python3已经自带了该模块,不用另外安装。它有点像java中的swing图形模块(由众多组件集成,组件通过创建实例添加,组件通过坐标定位在窗口上)。

2.PIL:Python Imaging Library,是Python平台的图像处理标准模块。在Python3也是自带的,在这个项目中用于背景图片的导入。

3.time:相信这个模块大家都不会陌生,导入它用来控制烟花的绽放,坠落及消失时间。

4.random:随机数模块,用于生成烟花随机坐标点,随机绽放速度,随机消失时间。

5.math:这个模块大家应该也很熟悉了,导入它的目的是使烟花绽放的粒子以一定角度散开。

三.效果

项目最终实现的效果就跟上面一样了。

四.代码

以下是我学习(copy)了那位大神的代码,再添加了一些浅显的注解。

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
#重力变量
GRAVITY=0.5
#listof colors,can choose randomly or use as queue(FIFO
colors=['red','blue','yellow','white','green','orange','purple','seagreen','indigo','cornflowerblue']
'''
create a class for particles粒子
particles are emitted almost randomly on the sky,
forming around(组成一个圈) of circle(a star)before falling and getting removed from canvas

Attributes(属性):
id:每个特定烟花的标识符
x,y:烟花的绽放坐标
vx,vy:烟花的绽放速度
total:一颗烟花里的星星总数
age:一颗星星会在画布上停留多久
color:自我移植
cv:画布
lifespan:星星在画布上停留的最后时间
'''
class part:#为每一个烟花绽放出来的粒子单独构建一个类的对象
  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#每个烟花的特定标识符
    self.x=x#烟花的绽放x轴
    self.y=y#烟花的绽放x轴
    self.initial_speed=explosion_speed#初速度
    self.vx=vx#外放x轴速度
    self.vy=vy#外放y轴速度
    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)#create_oval()创建一个椭圆,参数为左上x,左上y,右下x,右下y,填满的颜色,该函数返回一个id
    self.lifespan=lifespan#应该停留时间
  def update(self,dt):#更新数据,已停留时间增加
    self.age+=dt
    #粒子膨胀
    if self.alive() and self.expand():#如果停留时间(2s)足够&&膨胀时间(1.2s)足够
      move_x=cos(radians(self.id*360/self.total))*self.initial_speed#粒子的x轴继续膨胀
      move_y=sin(radians(self.id*360/self.total))*self.initial_speed#粒子的y轴继续膨胀
      self.cv.move(self.cid, move_x, move_y)#根据id把画布上的粒子移动x和y个距离
      self.vx=move_x/(float(dt)*1000)
    #以自由落体坠落
    elif self.alive():#如果只是停留时间足够,说明膨胀到最大了,应该准备下坠
      move_x=cos(radians(self.id*360/self.total))#x轴继续膨胀
      self.cv.move(self.cid,self.vx+move_x,self.vy+GRAVITY*dt)#而y轴按照重力因素做落体运动,但实际上这个重力是v而不是a
      self.vy+=GRAVITY*dt#更新一下y轴

    elif self.cid is not None:#如果粒子的生命周期已过,就将其移除
      cv.delete(self.cid)#删除该粒子对象
      self.cid=None
  #定义膨胀效果的时间帧
  def expand(self):
    return self.age<=1.2#膨胀时间小于1.2s
  #检查粒子是否仍在生命周期内
  def alive(self):#已停留时间是不是比应该停留时间短
    return self.age<=self.lifespan
'''
烟花模拟回路:
递归调用来在画布上重复发出新的烟火
通过每个“部件”对象内部的更新协议,每次调用时都要在画布上创建并绘制列表(星列表,每个星列表成员都是粒子列表)来重复地在画布上发出新的焰火
'''
#生成新的一轮爆炸
def simulate(cv):
  t=time()#time()函数返回自1970年后经过的浮点秒数,精确到小数点后6位
  explode_points=[]#爆炸点列表--烟花列表
  wait_time=randint(10,100)#随机生成一个int n,10<=n<=100
  numb_explode=randint(6,10)#爆炸的个数是6~10
  #为所有模拟烟花绽放的全部例子创建一列列表
  for point in range(numb_explode):#遍历爆炸的个数
    objects=[]#这是每个点的爆炸粒子列表
    x_cordi=randint(50,550)#每个点的爆炸x轴
    y_cordi=randint(50,150)#爆炸y轴
    speed=uniform(0.5,1.5)#随机生成一个float speed,0.5<=speed<1.5
    size=uniform(0.5,3)#随机生成一个float size,0.5<=size<3
    color=choice(colors)#choice()是python内置函数,随机返回元组,列表,或字符串的一个成员
    explosion_speed=uniform(0.2,1)#爆炸的绽放速度也要随机出来
    total_particles=randint(10,50)#爆炸出来的粒子数半径也随机
    for i in range(1,total_particles):#同一个烟花爆炸出来的粒子的大小,速度,坐标都是相同的
      r = part(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#先把时间置0
  #在1.8秒时间帧内保持更新
  while total_time<1.8:
    sleep(0.01)#让画面暂停0.01s
    tnew=time()#刷新时间
    t,dt=tnew,tnew-t#时间等于新时间,与上次时间间隔为tnew-t
    for point in explode_points:#遍历烟花列表
      for item in point:#遍历烟花里的粒子列表
        item.update(dt)#更新时间
    cv.update()#刷新页面
    total_time+=dt#为上面的while循环增加时间
  root.after(wait_time,simulate,cv)#将组件置于其他组件之后,就是放在最顶层,覆盖下面的,这里递归第哦啊用了自己,形成新的一轮爆炸
def close(*ignore):
  #打开模拟循环并关闭窗口
  global root
  root.quit()

if __name__=="__main__":
  root=tk.Tk()
  cv=tk.Canvas(root,height=600,width=700)#绘制一个画布
  #绘制一个黑色背景
  #cv.create_rectangle(0,0,600,600,fill="black")
  #use a nice background image
  image=Image.open("L:\PyCharm Community Edition 2018.2.2\Python_program\image.jpg")
  photo=ImageTk.PhotoImage(image)
  cv.create_image(0,0,image=photo,anchor='nw')#在画板上绘制一张图片
  cv.pack()#把cv添加进去
  root.protocol("WM_DELETE_WINDOW",close)
  #在0.1s后才开始调用stimulate()
  root.after(100,simulate,cv)#调用stimulate生成一轮烟花绽放效果
  root.mainloop()#执行root,生成窗口
#让我更加明白了python的一切皆对象

五.结尾

这篇博客暂时就这样,如果有机会会重新做一遍,不过最大的可能就是遥遥无期了。先打算对项目做如下修改:

1.增加鼠标交互功能,用户鼠标点击位置额外生成烟花绽放;

2.增加文字绘制功能,在背景图中隐藏有字样,烟花绽放后落于字样中的粒子不消失,而是定格在窗口中。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • python实现浪漫的烟花秀

    无意中看到一段用Tkinter库写的放烟花的程序,就跟着跑了一遍. 设计理念:通过让画面上一个粒子分裂为X数量的粒子来模拟爆炸效果.粒子会发生"膨胀",意思是它们会以恒速移动且相互之间的角度相等.这样就能让我们以一个向外膨胀的圆圈形式模拟出烟花绽放的画面.经过一定时间后,粒子会进入"自由落体"阶段,也就是由于重力因素它们开始坠落到地面,仿若绽放后熄灭的烟花. 首先我们写一个粒子类,表示烟花事件中的每个粒子,包含大小,颜色,位置,速度等属性以及粒子经历的三个阶段的函数

  • python实现烟花小程序

    本文实例为大家分享了python实现烟花小程序的具体代码,供大家参考,具体内容如下 ''' FIREWORKS SIMULATION WITH TKINTER *self-containing code *to run: simply type python simple.py in your console *compatible with both Python 2 and Python 3 *Dependencies: tkinter, Pillow (only for backgroun

  • 新年快乐! python实现绚烂的烟花绽放效果

    做了一个Python的小项目.利用了一点python的可视化技巧,做出烟花绽放的效果,文章的灵感来自网络上一位大神. 一.编译环境 Pycharm 二.模块 1.tkinter:这个小项目的主角,是一个python图形模块.且Python3已经自带了该模块,不用另外安装.它有点像java中的swing图形模块(由众多组件集成,组件通过创建实例添加,组件通过坐标定位在窗口上). 2.PIL:Python Imaging Library,是Python平台的图像处理标准模块.在Python3也是自带

  • jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】

    本文实例讲述了jQuery+HTML5实现WebGL高性能烟花绽放动画效果.分享给大家供大家参考,具体如下: 运行效果: 完整代码如下: <!DOCTYPE html> <html class=" -webkit- js flexbox canvas canvastext webgl no-touch geolocation postmessage websqldatabase indexeddb hashchange history draganddrop websocket

  • JavaScript实现烟花绽放动画效果

    先编写一个烟花绽放的动画效果. 放烟花时,一个烟花可分为两个阶段:(1)烟花上升到空中:(2)烟花炸开成碎片,炸开的碎片慢慢消散. 为此抽象出两个对象类:Firework和Particle.其中,Firework用于表示一个烟花对象,Particle用于表示一个烟花炸开后的各碎片. Firework对象类定义6个属性:表示烟花上升轨迹中各点的坐标(x,y).烟花弧状轨迹的偏转角度angle.上升阶段水平和垂直方向的位移改变量xSpeed和ySpeed.烟花的色彩色相hue. 坐标属性值y的初始值

  • Python新年炫酷烟花秀代码

    先介绍下 Pygame 绘制烟花的基本原理,烟花从发射到绽放一共分为三个阶段: 1,发射阶段:在这一阶段烟花的形状是线性向上,通过设定一组大小不同.颜色不同的点来模拟“向上发射” 的运动运动,运动过程中 5个点被赋予不同大小的加速度,随着时间推移,后面的点会赶上前面的点,最终所有点会汇聚在一起,处于 绽放准备阶段: 2,烟花绽放:烟花绽放这个阶段,是由一个点分散多个点向不同方向发散,并且每个点的移动轨迹可需要被记录,目的是为了追踪整个绽放轨迹. 3,烟花凋零,此阶段负责描绘绽放后烟花的效果,绽放

  • Python Pygame制作雪夜烟花景

    目录 运行截图 实现过程 核心代码 基础架子 下雪的过程 雪落到地上堆起来的过程 实现烟花的过程 完整代码 运行截图 运行效果: 什么?你说你看不清烟花?那我换一种颜色,请点开看. 实现过程 准备工作 使用语言和框架:python.pygame. 安装pygame: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn pygame 你需要知道的基础知识

  • 利用Python Pygame放个烟花

    uu们,有多久没放烟花了?今年你所在的地方允许放烟花么?既然我们不能线下放,那么我们就在线上放个够吧,先上最后效果图 老规矩,先导包,导入pygame,Python Pygame 是一款专门为开发和设计 2D 电子游戏而生的软件包,它支 Windows.Linux.Mac OS 等操作系统,具有良好的跨平台性. import pygame from random import randint, uniform, choice import math Pygame 绘制烟花的基本原理 1.发射阶段

  • 原生Js实现简易烟花爆炸效果的方法

    本文实例讲述了原生Js实现简易烟花爆炸效果的方法.分享给大家供大家参考.具体分析如下: 实现原理: 在一定范围内,随机生成一些div,形成烟花效果 复制代码 代码如下: <!doctype html> <html> <head> <meta charset="utf-8"> <title>js烟花效果</title> <script type="text/javascript"> d

  • Python实现Windows上气泡提醒效果的方法

    本文实例讲述了Python实现Windows上气泡提醒效果的方法.分享给大家供大家参考.具体实现方法如下: # -*- encoding: gbk -*- import sys import os import struct import time import win32con from win32api import * # Try and use XP features, so we get alpha-blending etc. try: from winxpgui import * e

  • Android游戏开发学习②焰火绽放效果实现方法

    本文实例讲述了Android游戏开发学习②焰火绽放效果实现方法.分享给大家供大家参考.具体如下: 本节介绍在游戏开发中常用到的数学物理应用--粒子系统.粒子系统与上一节的小球有类似的地方,都是通过数学方法和物理公式模拟客观世界中的物体的运动轨迹.不同的是小球更强调个体运动,而焰火粒子等粒子系统更注重整体感觉. 一.焰火粒子效果 1.粒子对象类Particle类和粒子集合类ParticleSet类 每个粒子都为一个Particle类的对象,程序中产生的所有Particle对象都由一个Particl

随机推荐