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

Breakout #38 - Shatter Bricks - Pico-8 Hero PICO-8
Breakout #38 - Shatter Bricks - Pico-8 Hero

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

前回はこちら

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

Breakout #38 – Shatter Bricks – Pico-8 Hero

【今回の目標】

前回実装した、ボールの軌跡のパーティクルを調整する。

ブロックが破壊された時に、パーティクルアニメーションを表示する。

ブロック破壊時のパーティクルアニメーション
ブロック破壊時のパーティクルアニメーション

【解説】

ボールの軌跡のパーティクルで、パーティクルの発生位置の幅を狭くするため、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

コメント

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