TeamworkCastが配信している、PICO-8のチュートリアル動画の解説を連載中です。
前回はこちら。
そして今回の動画はこちらです。
【今回の目標】
ボールの通過後にパーティクルを表示させる。
【解説】
まず、「パーティクル」って何? ということですが、「小片」とか「粒子」という意味です。
爆発の火花とか、水のしぶきとか、「なんか小さくて 沢山のモノを移動させて表現する」事です。
今回は、ボールの軌道にパーティクルを表示します。
大まかな処理としては、
ボールの移動で粒子(ドット)を発生させ、ある一定の期間が過ぎたら消す。
ということを実装しています。
「パーティクルは、ボールが移動したら発生する」ということだから、パーティクル発生関数spawntrail()をupdateball()関数内の座標を更新する所で実行します。
spawntrail()の内容か以下のとおり、
function spawntrail(_x,_y)
local _ang = rnd()
local _ox = sin(_ang)*ball_r*0.6
local _oy = cos(_ang)*ball_r*0.6
addpart(_x+_ox,_y+_oy,0,15+rnd(15),10,9)
end
_angという方向をrnd()関数でランダムに得ます。
その_angを使って、座標 _ox _oy を導き出します。
そしてその座標を使って、addpart()関数の引数として渡します。
addpart()関数の内容は以下のとおり、
function addpart(_x,_y,_type,_maxage,_col,_oldcol)
local _p = {}
_p.x=_x
_p.y=_y
_p.tpe=_type
_p.mage=_maxage
_p.age=0
_p.col=_col
_p.oldcol=_oldcol
add(part,_p)
end
粒子一つである、テーブル _p をつくり、そこに引数で得たパラメータ(座標、タイプ(未使用)表示期間、表示時間、色、古い色)を加えていき、テーブル part に加えています(2重テーブル)。
次は、partテーブルに加えた要素を更新していくupdateparts()の内容は以下のとおりです。
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
if (_p.age/_p.mage) > 0.5 then
_p.col = _p.oldcol
end
end
end
end
part テーブルから一つ一つの粒子(ドット)を取り出し、時間(_p.age)を更新し、表示期間(_p.mage)より大きくなったら消去する。
また、表示期間の半分経ったら、色を古い色に変えます(実行結果をみると、黄色からオレンジ色に変化しています)。
更新したテーブル情報を描画するdrawparts()関数の内容は以下のとおり、
function drawparts()
for i=1,#part do
_p=part[i]
-- pixel particle
if _p.tpe == 0 then
pset(_p.x,_p.y,_p.col)
end
end
end
更新したときど同様、partテーブルからひとつずつ取り出し、pset()関数でドットを描画させています。
パラメータの計算式などをいじると、様々な見え方になります。
パーティクルは、色々と使い所も多く、また少ないコードで効果が大きいので、ぜひマスターしておきたいテクニックですね。
コメント