Python粒子煙花動態(tài)效果實現(xiàn)
跨年倒計時還有18天?我已經(jīng)開始整煙花了,雖然不是很好看吧,但是也能將就看看 ??
這個的背景圖,音樂,還有文字都是可以自己修改的哦
效果展示
依次導(dǎo)入本次需要使用到的模塊
import random import pygame as py import tkinter as tk from time import time, sleep from tkinter import filedialog from PIL import Image, ImageTk from math import sin, cos, radians from random import choice, uniform, randint
實現(xiàn)代碼
生成隨機顏色
def randomcolor(): #生成隨機顏色 colArr = ['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'] color = "" for i in range(6): color += colArr[random.randint(0,14)] return "#"+color GRAVITY = 0.06 #重力變量 colors = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 'seagreen','indigo', 'cornflowerblue', 'pink'] #顏色列表
屬性
Generic class for particles particles are emitted almost randomly on the sky, forming a round of circle (a star) before falling and getting removed from canvas Attributes(屬性): - id: 粒子的id - x, y: 粒子的坐標 - vx, vy: 粒子在對應(yīng)坐標的變化速度 - total:一顆煙花里的粒子總數(shù) - age: 粒子在畫布上停留的時間 - color: 自我移植 - cv: 畫布 - lifespan: 粒子在畫布上停留的時間
粒子運動的速度
這個里面的新年快樂是可以自己更改的哦
class part: #為每一個煙花綻放出來的粒子單獨構(gòu)建一個類的對象 ,每個粒子都會有一些重要的屬性,決定它的外觀(大小、顏色)、移動速度等 def __init__(self, cv, idx, total, explosion_speed, x=0., y=0., vx = 0., vy = 0., size=3., color = 'red', lifespan = 2, **kwargs): self.id = idx #每個煙花的特定標識符 self.x = x #煙花綻放x軸 self.y = y #煙花綻放y軸 self.initial_speed = explosion_speed #粒子初始速度 self.vx = vx #粒子運動x軸速度 self.vy = vy #粒子運動y軸速度 self.total = total #綻放粒子數(shù) 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, outline='white',width=0.01) #指定一個限定矩形(Tkinter 會自動在這個矩形內(nèi)繪制一個橢圓) self.lifespan = lifespan #粒子在畫布上停留的時間
xy軸移動位移
如果粒子僅存活不擴張(只是停留時間足夠,說明膨脹到最大了),則自由墜落
elif self.alive(): columnFont = ('華文行楷',14) self.cv.create_text(250, 100, text='新',tag="write_tag", fill=choice(colors),font = columnFont) #字體 self.cv.create_text(300, 100, text='年',tag="write_tag", fill=choice(colors),font = columnFont) self.cv.create_text(350, 100, text='快',tag="write_tag", fill=choice(colors),font = columnFont) self.cv.create_text(400, 100, text='樂',tag="write_tag", fill=choice(colors),font = columnFont) #刪除文字標簽 move_x = cos(radians(self.id*360/self.total)) #x軸的移動位移 # we technically don't need to update x, y because move will do the job self.cv.move(self.cid, self.vx + move_x, self.vy+GRAVITY*dt) self.vy += GRAVITY*dt #更新y軸
膨脹效果時間幀
判斷膨脹時間是否小于1.2秒
def expand (self): #定義膨脹效果時間幀 return self.age <= 1.2
判斷粒子是否仍在生命周期內(nèi)
判斷已停留時間是否小于應(yīng)該停留時間
def alive(self): #判斷粒子是否仍在生命周期內(nèi) return self.age <= self.lifespan
剩下代碼
不想一步步寫出來咯,有點麻煩哈哈
代碼后面都有注釋哈
def simulate(cv): t = time() #返回自1970年后經(jīng)過的浮點秒數(shù),精確到小數(shù)點后7位 explode_points = [] #爆炸點列表,煙花列表 wait_time = randint(10,100) #等待時間為10到100之間整數(shù) numb_explode = randint(8,20) #爆炸煙花個數(shù)時6到10之間的隨機整數(shù) # create list of list of all particles in all simultaneous explosion for point in range(numb_explode): #為所有模擬煙花綻放的全部粒子創(chuàng)建一列列表 if point<=4: objects = [] #每個點的爆炸粒子列表粒子列表 x_cordi = 250 + point*50 #每個爆炸點的x軸 y_cordi = 100 #每個爆炸點的y軸 speed = uniform (0.5, 2.5) #每個爆炸點的速度 size = uniform (0.5,3) #每個爆炸點的大小 color = choice(colors) #每個爆炸點的顏色 explosion_speed = uniform(0.6, 3) #爆炸的綻放速度 total_particles = randint(10,60) #煙花的總粒子數(shù) 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)) #把上述參數(shù)代入part函數(shù),但是每個粒子的生存時間是自己獨立的 objects.append(r) #把r添加進粒子列表 explode_points.append(objects) #把粒子列表添加進煙花列表 else: objects = [] #每個點的爆炸粒子列表粒子列表 x_cordi = randint(50,550) #每個爆炸點的x軸 y_cordi = randint(50, 250) #每個爆炸點的y軸 speed = uniform (0.5, 2.5) #每個爆炸點的速度 size = uniform (0.5,3) #每個爆炸點的大小 color = choice(colors) #每個爆炸點的顏色 explosion_speed = uniform(0.3, 2) #爆炸的綻放速度 total_particles = randint(10,50) #煙花的總粒子數(shù) 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)) #把上述參數(shù)代入part函數(shù),但是每個粒子的生存時間是自己獨立的 objects.append(r) #把r添加進粒子列表 explode_points.append(objects) #把粒子列表添加進煙花列表 total_time = .0 #初始化總時間 # keeps undate within a timeframe of 1.8 second while total_time < 2: #當總時間小于1.8秒時運行該循環(huán) sleep(0.03) #讓畫面暫停0.01秒 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循環(huán)增加時間 root.after(wait_time, simulate, cv) #將組件置于其他組件之后,放在最頂層,覆蓋下面的,遞歸調(diào)用自己,形成新一輪的爆炸 def close(*ignore): #打開模擬循環(huán)并關(guān)閉窗口 """Stops simulation loop and closes the window.""" global root root.quit() if __name__ == '__main__': root = tk.Tk() root.title('新年快樂~~') # 設(shè)置窗體的標題欄 cv = tk.Canvas(root, height=600, width=600) #繪制一個高600,寬600的畫布 bgpath = filedialog.askopenfilename(title='請選擇背景圖片') #選擇背景圖片 image = Image.open(bgpath) #打開背景圖片 image = image.resize((600,600), Image.ANTIALIAS) #把背景圖片調(diào)整成窗口大小 photo = ImageTk.PhotoImage(image) cv.create_image(0, 0, image=photo, anchor='nw') #在畫布上繪制加載的背景圖片 bgmusic = filedialog.askopenfilename(title='請選擇背景音樂') py.mixer.init() # 初始化 py.mixer.music.load(bgmusic) # 文件加載 py.mixer.music.play(-1, 0, fade_ms=50) # 播放 第一個是播放值 -1代表循環(huán)播放, 第二個參數(shù)代表開始播放的時間 py.mixer.music.pause() #暫停 py.mixer.music.unpause() #取消暫停 cv.pack() #把cv添加進去 root.protocol("WM_DELETE_WINDOW", close) root.after(200, simulate, cv) #在0.1秒后再調(diào)用stimulate函數(shù),生成一輪煙花綻放效果 root.mainloop() #執(zhí)行root,生成窗口
到此這篇關(guān)于Python粒子煙花動態(tài)效果實現(xiàn)的文章就介紹到這了,更多相關(guān)Python粒子煙花內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python一行sql太長折成多行并且有多個參數(shù)的方法
今天小編就為大家分享一篇python一行sql太長折成多行并且有多個參數(shù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07Python使用Scapy實現(xiàn)構(gòu)造特殊數(shù)據(jù)包
Scapy是一款Python庫,可用于構(gòu)建、發(fā)送、接收和解析網(wǎng)絡(luò)數(shù)據(jù)包,這篇文章主要為大家詳細介紹了python如何使用Scapy構(gòu)造特殊數(shù)據(jù)包,有需要的可以參考下2023-11-11如何解決Selenium包安裝成功卻無法導(dǎo)入的問題
這篇文章主要介紹了如何解決Selenium包安裝成功卻無法導(dǎo)入的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08