91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用python實現煙花綻放效果的案例

發布時間:2021-04-07 12:44:45 來源:億速云 閱讀:428 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關使用python實現煙花綻放效果的案例,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

一.編譯環境

Pycharm

二.模塊

1.tkinter:這個小項目的主角,是一個python圖形模塊。且Python3已經自帶了該模塊,不用另外安裝。它有點像java中的swing圖形模塊(由眾多組件集成,組件通過創建實例添加,組件通過坐標定位在窗口上)。

2.PIL:Python Imaging Library,是Python平臺的圖像處理標準模塊。在Python3也是自帶的,在這個項目中用于背景圖片的導入。

3.time:相信這個模塊大家都不會陌生,導入它用來控制煙花的綻放,墜落及消失時間。

4.random:隨機數模塊,用于生成煙花隨機坐標點,隨機綻放速度,隨機消失時間。

5.math:這個模塊大家應該也很熟悉了,導入它的目的是使煙花綻放的粒子以一定角度散開。

三.效果

使用python實現煙花綻放效果的案例

項目最終實現的效果就跟上面一樣了。

四.代碼

以下是我學習(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.增加文字繪制功能,在背景圖中隱藏有字樣,煙花綻放后落于字樣中的粒子不消失,而是定格在窗口中。

關于“使用python實現煙花綻放效果的案例”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

称多县| 景洪市| 建水县| 克山县| 永仁县| 大足县| 久治县| 商水县| 金乡县| 阳谷县| 都昌县| 娱乐| 休宁县| 贡山| 思茅市| 绥棱县| 武冈市| 五大连池市| 融水| 南平市| 革吉县| 南靖县| 萨嘎县| 安溪县| 渝北区| 于都县| 长岛县| 兴宁市| 颍上县| 应用必备| 钟祥市| 常德市| 防城港市| 德格县| 巴青县| 彰化县| 德庆县| 平原县| 隆林| 曲阳县| 太康县|