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

Breakout #32 - Powerup Timers - Pico-8 Hero PICO-8
Breakout #32 - Powerup Timers - Pico-8 Hero

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

前回はこちら

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

Breakout #32 – Powerup Timers – Pico-8 Hero

【解説メモ】

マルチボールは、3つを2つに分裂するようにして、角度は両端の角度を取り、真ん中は無しにする。

unction multiball()〜end

function multiball()
	ball2=copyball(ball[1])
	ball3=copyball(ball[1])

	if ball[1].ang==0 then
		setang(ball2,1)
		setang(ball3,2)
	elseif ball[1].ang==1 then
		setang(ball2,0)
		setang(ball3,2)
	else
		setang(ball2,0)
		setang(ball3,1)
	end

	ball[#ball+1]=ball2
	ball[#ball+1]=ball3
end

function multiball()
    local ballnum = flr(rnd(#ball))+1
    local ogball = ball[ballnum]

	ball2=copyball(ogball)
	-- ball3=copyball(ball[1])

	if ogball.ang==0 then
		setang(ball2,2)
	elseif ogball.ang==1 then
		setang(ogball,0)
		setang(ball2,2)
	else
		setang(ball2,0)
	end

    ball2.stuck=false
    ball[#ball+1]=ball2
end

にする。

function powerupget(_p)〜endのreleasestuck()を消す。

function powerupget(_p)〜endの内容

function powerupget(_p)
    if _p == 1 then
        -- slowdown
        powerup = 1
        powerup_t = 900
    elseif _p == 2 then
        -- life
        powerup = 0
        powerup_t = 0
        lives+=1
    elseif _p == 3 then
        -- catch
        -- check if there are stuck balls
        hasstuck=false
        for i=1,#ball do
            if ball[i].stuck then
                hasstuck=true
            end
        end
        if hasstuck==false then
            sticky=true
        end
    elseif _p == 4 then
        -- expand
        powerup = 4
        powerup_t = 900
    elseif _p == 5 then
        -- reduce
        powerup = 5
        powerup_t = 900
    elseif _p == 6 then
        -- megaball
        powerup = 6
        powerup_t = 900
    elseif _p == 7 then
        -- multiball
        multiball()
    end
end

function powerupget(_p)
    if _p == 1 then
        -- slowdown
        timer_slow = 900
    elseif _p == 2 then
        -- life
        lives+=1
    elseif _p == 3 then
        -- catch
        -- check if there are stuck balls
        hasstuck=false
        for i=1,#ball do
            if ball[i].stuck then
                hasstuck=true
            end
        end
        if hasstuck==false then
            sticky=true
        end
    elseif _p == 4 then
        -- expand
        timer_expand = 900
    elseif _p == 5 then
        -- reduce
        timer_reduce = 900
    elseif _p == 6 then
        -- megaball
        timer_mega = 900
    elseif _p == 7 then
        -- multiball
        multiball()
    end
end

に変更し、それぞれのタイマーを設定する。

function update_game()〜endの内容の最後の

if powerup!=0 then
	powerup_t-=1
	-- debug = powerup_t
	if powerup_t<=0 then
		powerup=0
	end
end 

-- powerup timers
if timer_mega > 0 then
    timer_mega-=1
end
if timer_slow > 0 then
    timer_slow-=1
end
if timer_expand > 0 then
    timer_expand-=1
end
if timer_reduce > 0 then
    timer_reduce-=1
end

にして、先ほど決めたタイマーの変数のカウントダウンの処理を書く。

unction update_game()〜endの内容のif powerup==4 thenをif timer_expand > 0 thenに
elseif powerup==5 thenをelseif timer_reduce > 0 thenに変更。

function updateball(bi)〜endの内容のif powerup==1 thenをif timer_slow > 0 thenに変更。

function updateball(bi)〜endの内容のif (powerup == 6 and bricks[i].t==”i”) or powerup != 6 thenをif (timer_mega > 0 and bricks[i].t==”i”) or timer_mega <= 0 thenに変更。

function hitbrick(_i,_combo)〜endの内容のif powerup == 6 thenをif timer_mega > 0 thenに変更。

function powerupget(_p)〜endの内容のtimer_expand = 900の下にtimer_reduce = 0を書き、
timer_reduce = 900の下にtimer_expand = 0を書く。

function startgame()〜endの内容のserveball()の前に、

timer_mega=0
timer_slow=0
timer_expand=0
timer_reduce=0

と各タイマーを0でリセットする。

function serveball()〜endの内容のchain=1の下にも同じ様に記述。

【自分の感想】

カプセルの効果の期間を決めるタイマーを、それぞれ独立させて設定し、幾つもの効果を同時に受けられるようにした。

そして、タイマーがゼロということは、効果が無いという意味にも取れる。

マルチボールは、3つだとバランスが悪いのかもしれない。

カプセルの効果のタイマーを独立させて実行してみた
カプセルの効果のタイマーを独立させて実行してみた

コメント

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