TeamworkCastが配信している、PICO-8のチュートリアル動画の解説を連載中です。
前回はこちら。
そして今回の動画はこちらです。
【今回の目標】
前回実装した、ボールの軌跡のパーティクルを調整する。
ブロックが破壊された時に、パーティクルアニメーションを表示する。
【解説】
ボールの軌跡のパーティクルで、パーティクルの発生位置の幅を狭くするため、0.6を掛けていたのを、0.3に変更する。
粒子の数を少なくするため、rnd()関数を使い結果が0.5より小さかったら実行するようにする。
function spawntrail(_x,_y)
if rnd()<0.5 then
local _ang = rnd()
local _ox = sin(_ang)*ball_r*0.3
local _oy = cos(_ang)*ball_r*0.3
addpart(_x+_ox,_y+_oy,0,0,0,15+rnd(15),{10,9})
end
end
パワーアップカプセルの前にパーティクルが表示されてしまうので、drawparts()関数の実行を、パワーアップカプセルの描画の前にする。
パーティクルの色を時間毎で変化させる。
function addpart(_x,_y,_dx,_dy,_type,_maxage,_col)
local _p = {}
_p.x=_x
_p.y=_y
_p.dx=_dx
_p.dy=_dy
_p.tpe=_type
_p.mage=_maxage
_p.age=0
_p.col=0
_p.colarr=_col
add(part,_p)
end
引数の_oldcolを無くして、_colには変化順に色番号を並べたテーブルを渡す。
updateparts()関数のif文のelse以後を変更。
カラーテーブルの内容が1つだけの時は、変化しない。
_p.age/_p.mageで現在のパーティクルの寿命の割合を求め、1+flr(_ci*#_p.colarr)で、カラーテーブルのインデックス番号を導き出す。
function updateparts()
local _p
for i=#part,1,-1 do
_p=part[i]
_p.age+=1
if _p.age>_p.mage then
del(part,part[i])
else
-- change colors
if #_p.colarr==1 then
_p.col = _p.colarr[1]
else
local _ci=_p.age/_p.mage
_ci=1+flr(_ci*#_p.colarr)
_p.col = _p.colarr[_ci]
end
--appy gravity
if _p.tpe == 1 then
_p.dy+=0.1
end
--move particle
_p.x+=_p.dx
_p.y+=_p.dy
end
end
end
ブロック破壊時のパーティクルを実装させる。
専用の関数、shatterbrick()をつくる。
for文で繰り返し、0〜10の11個のパーティクルを発生させる。
方向(_ang)をランダムで導き出す。
今度は位置の変化があるため、移動量の_dxと_dyを導き出す(移動しない場合は0)。
※ このコードでは、_dxと_dyが求めるものが一緒なので問題がないが、X座標はコサイン(cos)で、Y座標はサイン(sin)だと思う。
function shatterbrick(_b)
for i=0,10 do
local _ang = rnd()
local _dx = sin(_ang)*1
local _dy = cos(_ang)*1
addpart(_b.x,_b.y,_dx,_dy,1,60,{7})
end
end
updateparts()内で、dxとdyを加算して位置を変化させている。
function updateparts()
local _p
for i=#part,1,-1 do
_p=part[i]
_p.age+=1
if _p.age>_p.mage then
del(part,part[i])
else
-- change colors
if #_p.colarr==1 then
_p.col = _p.colarr[1]
else
local _ci=_p.age/_p.mage
_ci=1+flr(_ci*#_p.colarr)
_p.col = _p.colarr[_ci]
end
--appy gravity
if _p.tpe == 1 then
_p.dy+=0.1
end
--move particle
_p.x+=_p.dx
_p.y+=_p.dy
end
end
end
描画部分の変更。
if文で_p.tpe == 1でも実行するようにする(ブロック破壊時のパーティクル)。
function drawparts()
for i=1,#part do
_p=part[i]
-- pixel particle
if _p.tpe == 0 or _p.tpe == 1 then
pset(_p.x,_p.y,_p.col)
end
end
end
コメント