python制作烟花特效_过大年,用Python去绽放最绚丽的烟花
目前日期为农历初二,在这个特殊的日子里向大家问好。春节将至,请允许作为小编的我在这向大家问好。愿大家新春快乐、身体健康、阖家幸福、事事顺心!

今年的春节确实非常特别。大家都选择呆在家里过大年。作为一个狂热爱好者,我自然不能荒废时间。我打算这段时间用来潜心修炼,并时常研读《Python精华》,努力提升自己的技术水平。

今天依然是分享Python海龟库知识的好机会。恰逢新春佳节之际,在无法燃放烟花爆竹的情况下(或者:又不能燃放烟花爆竹),因此利用Python编程技术模拟烟花效果成为了必要的选择。体验一下"year fix"的乐趣!

用Python制作烟花
准备好了吗,我们开始动手吧!
用Python的海龟库(turtle库)制作烟
花的过程大致如下。
1.首先制作一个绚丽的夜空
制作夜空的过程本质上就是搭建画布的基础

(星空图片)

(月亮图片)
好了,照片选用完毕后,下面开始用代码来制作夜空,具体如下。
import turtle
wn=turtle.Screen()
wn.colormode(255)
wn.bgpic('星光back.gif')
wn.setup(1920,1080)
wn.register_shape('月亮.gif')
wn.register_shape('星光.gif')
wn.register_shape('liuxing.gif')
#月亮
moon=turtle.Turtle()
moon.shape('月亮.gif')
moon.shapesize(0.2,0.2)
moon.up()
moon.goto(-400,250)
运行后,效果如下图所示。

2.接下来制作一个炮竹
众所周知,在进行燃放烟花活动时,默认是从点燃火药引燃炮竹开始的。由点燃火药引燃炮竹后,在其上升至预定高度时会触发引信被点燃的过程,并随后会爆炸产生烟花效果。因此我们需要根据这个过程来绘制相应的图形元素——我们的炮竹形状方案就采用长方形这一设定——这种形状正好可以采用画笔的图形类型为' square'来表示。具体代码如下:
#炮竹
firecracker=turtle.Turtle()
firecracker.up()
firecracker.goto(0,-200)
firecracker.lt(90)
firecracker.speed('fastest')
firecracker.color('white')
firecracker.shape('square')
firecracker.shapesize(0.2,0.8)
注意,最后的代码
firecracker.shapesize(0.2,0.8)
该‘square’形状将被横向和纵向进行拉伸。运行后, 具体效果如下

3.来制作烟花
接下来开始说重点,来介绍一下如何制作烟花。制作烟花是本文的重点。

从上图可以看出, 烟花本质上是由一系列形态相近的图案聚合成群而形成的. 其基本原理是, 首先将形态相近的同类图案聚合成群, 然后, 在短暂的时间内向四周展开爆炸. 依据这一规律, 我们在此基础上采用了类似的策略. 与以上炮竹制作类似地, 在本项目中我们同样利用turtle画笔作为基本形状.
firworks=[]
shape=['circle','classic','square','triangle','arrow','turtle']
for i in range(25):
newfirework=turtle.Turtle()
newfirework.speed('fastest')
newfirework.up()
newfirework.shape('circle')
newfirework.shapesize(0.5,2.5)
firworks.append(newfirework)
明显可以看出,在上述代码中将烟花作为Python中的一个形状一致的画笔列表 firworks 来定义。
现在打算让两者协同运转,在达到设定高度时先启动火药枪管上升一段时间。随后将烟花聚集在一起,并使其瞬间爆炸。具体代码如下
while True:
high=200
wn.update()
firecracker.fd(10)
for firework in firworks:
firework.fd(60)
if firecracker.ycor()==high:
color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
for firework in firworks:
firework.color(color)
firework.goto(firecracker.xcor(),firecracker.ycor())
firework.seth(random.randint(0, 360))
firework.showturtle()
if firecracker.ycor() >= high+5:
firecracker.goto(0,-200)
time.sleep(0.05)
此代码为一个无限循环程序,在每次循环开始时,首先让点燃的火药筒(firecracker)上升一段距离。当达到预定高度后将烟花(firework)聚拢在一起随后迅速向四周展开爆炸过程。运行效果如下:

接下来,调整以上代码,加入函数
def set_firworks_shape(apperance):
for firework in firworks:
firework.shape(apperance)
,让烟花的形状随机发生变化,并加入以下代码
firecracker.goto(random.randint(0, 500),-200)
让烟花每次炸完后将炮竹随机换位置。
while True:
high=200
wn.update()
firecracker.fd(10)
for firework in firworks:
firework.fd(60)
if firecracker.ycor()==high:
color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
for firework in firworks:
firework.color(color)
firework.goto(firecracker.xcor(),firecracker.ycor())
firework.seth(random.randint(0, 360))
firework.showturtle()
if firecracker.ycor() >= high+5:
firecracker.goto(random.randint(0, 500),-200)
set_firworks_shape(random.choice(shape))
time.sleep(0.05)
运行后结果如下。

至此,在下面这则绽放烟花的视频为背景来结束今天的文章。小编拍摄了一段短视频作为结尾素材。也再次祝愿大家新春佳节愉快,并且愿大家新的一年里平平安安、万事如意!
-end-

Python 青少年编程
python海龟作图系列推荐阅读:

