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

Breakout #31 - Sticky Balls - Pico-8 Hero PICO-8
Breakout #31 - Sticky Balls - Pico-8 Hero

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

前回はこちら

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

Breakout #31 – Sticky Balls – Pico-8 Hero

【解説メモ】

パワーアップの効果の持続について表にまとめる

スローダウン:時限制
ライフ:時限制限なし
キャッチ/ひっつき:時限制限なし/複数はしない
伸びる:時限制、縮みで解除
縮み:時限制、伸びで解除
メガボール:時限制
複数:ひっつき解除

function newball()に
b.stuck = falseを追加する(stuck:「くっつける」「離れない 」の意味)。

function copyball(ob)に
b.stuck = ob.angを追加。

function updateball(bi)内の

if sticky then
    -- ball_x=pad_x+flr(pad_w/2)
    ball[1].x=pad_x+sticky_x
    ball[1].y=pad_y-ball_r-1

if myball.stuck then
    -- ball_x=pad_x+flr(pad_w/2)
    myball.x=pad_x+sticky_x
    myball.y=pad_y-ball_r-1

に変更。

同じく、function updateball(bi)内の

--catch powerup
if powerup==3 and myball.dy < 0 then
    sticky = true
    sticky_x = myball.x - pad_x
end

--catch powerup
if sticky and myball.dy < 0 then
    releasestuck()
    sticky = false
    myball.stuck = true
    sticky_x = myball.x - pad_x
end

に変更。

function powerupget(_p)の前に

function releasestuck()
    for i=1,#ball do
        if ball[i].stuck then
            ball[i].x=mid(3,ball[i].x,124)
            ball[i].stuck=false
        end
    end
end

を記述。

function update_game()内の

if sticky and btnp(4) then
    sticky=false
    ball_x=mid(3,ball_x,124)
end

if btnp(4) then
    releasestuck()
end

に変更。

function releasestuck()〜endの後に、

function pointstuck(sign)
    for i=1,#ball do
        if ball[i].stuck then
            ball[i].dx=abs(ball[i].dx)*sig
        end
    end
end

を記述。

function update_game()内のif btn(0) then〜endの

if sticky then
    ball_dx=-1
end

pointstuck(-1)

に変更。

function update_game()内のif btn(1) then〜endの

if sticky then
    ball_dx=1
end

pointstuck(1)

に変更。

function serveball()内にball[1].stuck=trueを追加し、sticky=trueを削除。

実行するとエラー。

function updateball(bi)のif myball.stuck thenでmyballがnillになっていると。

myball = ball[bi]を関数内の一番上に持ってくる(if文の上に)。

function draw_game()内

if sticky then
    -- serve preview
    line(ball[1].x+ball[1].dx*4,ball[1].y+ball[1].dy*4,ball[1].x+ball[1].dx*6,ball[1].y+ball[1].dy*6,10)
end

を消去して、

for i=1,#ball do
    circfill(ball[i].x,ball[i].y,ball_r, 10) 
end

for i=1,#ball do
    circfill(ball[i].x,ball[i].y,ball_r, 10)
    if ball[i].stuck then
        line(ball[i].x+ball[i].dx*4,ball[i].y+ball[i].dy*4,ball[i].x+ball[i].dx*6,ball[i].y+ball[i].dy*6,10)
    end
end

に変更。

function startgame()のsticky=trueをsticky=falseに。

function nextlevel()内のsticky=trueを消去し、serveball()の前にsticky=falseを加える。

function copyball(ob)内のb.stuck = ob.angをb.stuck = ob.stuckに変更。

function powerupget(_p)内のelseif _p == 3 thenの

  powerup = 3
  powerup_t = 900

hasstuck=false
for i=1,#ball do
    if ball[i].stuck then
        hasstuck=true
    end
end
if hasstuck==false then
    sticky=true
end

に変更。

function powerupget(_p)内のelseif _p == 7 thenの

powerup = 7
powerup_t = 0
multiball()

releasestuck()
multiball()

に変更。

テストでマルチボールとスティッキーのカプセルを出すため、_t=flr(rnd(7))+1を

_t=flr(rnd(2))
if _t==0 then
    _t=7
else
    _t=3
end

とする。

【自分の感想】

パワーアップの条件を組み合わせることを考えると、複雑になってくる。

「キャッチ」と「マルチボール」では、

  • キャッチできるボールは、一つだけ(他のボールを受けても、跳ね返る)
  • 「キャッチ」カプセルの効果は、一度きり
  • キャッチしている時間の制限は無し
  • キャッチしているとき、「マルチボール」のカプセルを取ると、キャッチは解除される

という条件を満たす為、カプセル取得を表すsticky変数の他に、ボール毎にstuckを設ける。

そして、前から気になっていた、ボールをくっついた時に方向が変わらない問題も、pointstuck(sign)関数でパドルの移動に合わせて、向きを変更するようにして、解決している。

catchとmultiballの組み合わせ 動画
catchとmultiballの組み合わせ 動画

コメント

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