【37】いっしょにまなぼう

Breakout #37 - Particles! - Pico-8 Hero PICO-8
Breakout #37 - Particles! - Pico-8 Hero

 TeamworkCastが配信している、PICO-8のチュートリアル動画の解説を連載中です。

前回はこちら

そして今回の動画はこちらです。

Breakout #37 – Particles! – Pico-8 Hero

【今回の目標】

ボールの通過後にパーティクルを表示させる。

パーティクルを実装
パーティクルを実装

【解説】

まず、「パーティクル」って何? ということですが、「小片」とか「粒子」という意味です。
爆発の火花とか、水のしぶきとか、「なんか小さくて 沢山のモノを移動させて表現する」事です。

今回は、ボールの軌道にパーティクルを表示します。

大まかな処理としては、
ボールの移動で粒子(ドット)を発生させ、ある一定の期間が過ぎたら消す。
ということを実装しています。

「パーティクルは、ボールが移動したら発生する」ということだから、パーティクル発生関数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()関数でドットを描画させています。

パラメータの計算式などをいじると、様々な見え方になります。

パーティクルは、色々と使い所も多く、また少ないコードで効果が大きいので、ぜひマスターしておきたいテクニックですね。

コメント

タイトルとURLをコピーしました