【漫天烟花】绚烂烟花点亮夜空也太美了叭、某程序员携带烟花秀给大家拜年啦~
前言
?🚀 作者 :“程序員梨子”
🚀 **文章簡(jiǎn)介 **:本篇文章主要講解制作一個(gè)新年界面化放煙花特效啦。
🚀 **文章源碼獲取 **: 為了感謝每一個(gè)關(guān)注我的小可愛(ài)💓每篇文章的項(xiàng)目源碼都是無(wú)償分
享滴💓👇👇👇👇
點(diǎn)這里藍(lán)色這行字體自取,需要什么源碼記得說(shuō)標(biāo)題名字哈!私信我也可!
🚀 歡迎小伙伴們 點(diǎn)贊👍、收藏?、留言💬
正文
燃放煙花爆竹是我們的一種迎新辭舊的習(xí)俗,然而,大量的燃放行為,會(huì)大大地降低空氣質(zhì)量,造
成空氣污染還伴隨著火災(zāi)、傷人等安全隱患。所以很早開(kāi)始大部分地區(qū)都禁止放煙花了~
現(xiàn)在已然是開(kāi)工高峰期了撒,很多小伙伴兒可能煙花都沒(méi)見(jiàn)過(guò),吶吶吶 小編今天給大家用代碼放?
煙花,讓大家一次過(guò)夠煙花隱🎇🎇🎇🎇🎇🎇
?
一、效果展示
二、源碼展示
1)功能實(shí)現(xiàn)用到的 Python 庫(kù)包括:tkinter、PIL、time、random、math,如果之前沒(méi)有裝過(guò)第三
方庫(kù)的話,使用?pip install + 模塊名字?裝一下即可。
2)首先,我們使用 tkinter 來(lái)創(chuàng)建一個(gè)畫布
root?=?tk.Tk()
#?繪制一個(gè)畫布
cv?=?tk.Canvas(root,?height=457,?width=690)
#?背景圖
image?=?Image.open("bg.jpeg")
photo?=?ImageTk.PhotoImage(image)
#?在畫板上繪制一張圖片
cv.create_image(0,?0,?image=photo,?anchor='nw')
cv.pack()
3)接著我們來(lái)實(shí)現(xiàn)煙花燃放的效果并在畫布上顯示。先來(lái)定義一個(gè)煙花類 fireworks,類中主要包
括:初始化方法和更新數(shù)據(jù)方法。
初始化方法主要參數(shù)包括:煙花綻放坐標(biāo)軸、速度、顏色、粒子數(shù)和時(shí)間等,代碼實(shí)現(xiàn)如下:
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?=?y
?self.initial_speed?=?explosion_speed
?#?外放?x?軸速度
?self.vx?=?vx
?#?外放?y?軸速度
?self.vy?=?vy
?#?綻放的粒子數(shù)
?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)
?self.lifespan =?lifespan
4)當(dāng)煙花燃放過(guò)后需要進(jìn)行刷新,看一下更新方法,代碼實(shí)現(xiàn)如下:
def?update(self,?dt):
?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.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
?#?過(guò)期移除
?elif?self.cid?is?not?None:
??cv.delete(self.cid)
??self.cid?=?None
5)再接著來(lái)看煙花燃放的實(shí)現(xiàn),主要元素包括:煙花的個(gè)數(shù)、爆炸的范圍和速度、停留時(shí)間和刷
新時(shí)間等,代碼實(shí)現(xiàn)如下:
def?ignite(cv):
????t?=?time()
????#?煙花列表
????explode_points?=?[]
????wait_time?=?randint(10,?100)
????#?爆炸的個(gè)數(shù)
????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)
????????#?爆炸的粒子數(shù)半徑
????????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))
????????????#?添加進(jìn)粒子列表里
????????????objects.append(r)
????????#?把粒子列表添加到煙花列表
????????explode_points.append(objects)
????total_time?=?.0
????#?在?1.8?秒時(shí)間幀內(nèi)保持更新
????while?total_time?<?1.8:
????????#?讓畫面暫停?0.01s
????????sleep(0.01)
????????#?刷新時(shí)間
????????tnew?=?time()
????????t,?dt?=?tnew,?tnew?-?t
????????#?遍歷煙花列表
????????for?point?in?explode_points:
????????????#?遍歷煙花里的粒子列表
????????????for?item?in?point:
????????????????#?更新時(shí)間
????????????????item.update(dt)
????????#?刷新頁(yè)面
????????cv.update()
????????total_time?+=?dt
????root.after(wait_time,?ignite,?cv)
?
總結(jié)
這么多的煙花.gif 夠看了嘛 代碼還可以自己制作,想怎么來(lái)怎么來(lái)~
關(guān)注小編獲取更多精彩內(nèi)容!記得點(diǎn)擊傳送門哈👇
記得三連哦! 如需打包好的源碼+素材免費(fèi)分享滴!!傳送門
總結(jié)
以上是生活随笔為你收集整理的【漫天烟花】绚烂烟花点亮夜空也太美了叭、某程序员携带烟花秀给大家拜年啦~的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Opencv实战】“一岁年龄一岁心,匆
- 下一篇: 【自动群发小助手】微信也能定时发送消息?