Files
Techmino/parts/backgrounds/firework.lua
2021-08-28 16:46:10 +08:00

99 lines
2.4 KiB
Lua

--Firework
local gc=love.graphics
local gc_clear=gc.clear
local gc_setColor,gc_setLineWidth=gc.setColor,gc.setLineWidth
local gc_line,gc_circle=gc.line,gc.circle
local rnd=math.random
local ins,rem=table.insert,table.remove
local back={}
local t
local firework,particle
function back.init()
t=26
firework,particle={},{}
end
function back.update(dt)
t=t-1
if t==0 then
ins(firework,{
x=nil,y=nil,
x0=SCR.w*(rnd()*1.2-.1),
y0=SCR.h*1.5,
x1=SCR.w*(.15+rnd()*.7),
y1=SCR.h*(.15+rnd()*.4),
t=0,
v=.5+rnd(),
color=COLOR.random_dark(),
big=rnd()<.1,
})
t=rnd(26,62)
end
for i=#firework,1,-1 do
local F=firework[i]
local time=F.t^.5
if time>1 then
local x,y,color=F.x,F.y,F.color
if F.big then
SFX.play('fall',.5)
for _=1,rnd(62,126)do
ins(particle,{
x=x,y=y,
color=color,
vx=rnd()*16-8,
vy=rnd()*16-8,
t=1,
})
end
else
SFX.play('clear_1',.4)
for _=1,rnd(16,26)do
ins(particle,{
x=x,y=y,
color=color,
vx=rnd()*8-4,
vy=rnd()*8-4,
t=1,
})
end
end
rem(firework,i)
else
F.t=F.t+dt*F.v
F.x=F.x0*(1-time)+F.x1*time
F.y=F.y0*(1-time)+F.y1*time
end
end
for i=#particle,1,-1 do
local P=particle[i]
if P.t<0 then
rem(particle,i)
else
P.x=P.x+P.vx
P.y=P.y+P.vy
P.vy=P.vy+.04
P.t=P.t-dt*.6
end
end
end
function back.draw()
gc_clear(.1,.1,.1)
for i=1,#firework do
local F=firework[i]
gc_setColor(F.color)
gc_circle('fill',F.x,F.y,F.big and 8 or 4)
end
gc_setLineWidth(3)
for i=1,#particle do
local P=particle[i]
local c=P.color
gc_setColor(c[1],c[2],c[3],P.t*.4)
gc_line(P.x,P.y,P.x-P.vx*4,P.y-P.vy*4)
end
end
function back.discard()
firework=nil
end
return back