-- part
parts={}
parts_next=1

-- 粒子的对象池
for i=0,400 do
 add(parts,{t=0})
end

-- t:time d:加速度 s:半径 ds:半径变化率 c:color bc:border color
function parts_spawn(t,x,y,vx,vy,d,s,ds,c,bc)
 parts_next=next_i(parts,parts_next)
 
 local p=parts[parts_next]
 
 p.t,p.x,p.y,p.vx,p.vy,p.d,p.s,p.ds,p.c,p.bc=t,x,y,vx,vy,d,s,ds,c,bc
end

--
function parts_explode(count,br,rr,t,bx,by,rx,ry,d,s,rs,ds,c,bc)
 for i=1,count do
  local a,r=rnd(),br+rnd(rr)
  local vx,vy=r*cos(a),r*sin(a)
  parts_spawn(t,bx+rnd(rx),by+rnd(ry),vx,vy,d,s+rnd(rs),ds,c,bc)
 end
end

--
function parts_update()
 for k,p in pairs(parts) do
  if p.t>0 then
   p.t-=one_frame
   
   p.vx*=p.d
   p.vy*=p.d
   
   p.x+=p.vx
   p.y+=p.vy
   
   p.s=max(0,p.s+p.ds)
   
   if p.s<=0 then
    p.t=0
   end
  end
 end
end

--
function part_draw(p,o,c)
 circfill(flr(p.x),flr(p.y),p.s+o,c)
end

--
function parts_draw()
  --先绘制border 为底
 for k,p in pairs(parts) do
  if p.t>0 then
   part_draw(p,1,p.bc)
  end
 end
  --再绘制part颜色,在前层。先后顺序,可以绘制融合的效果
 for k,p in pairs(parts) do
  if p.t>0 then
   part_draw(p,0,p.c)
  end
 end
end