TeamworkCastが配信している、PICO-8のチュートリアル動画の解説を連載中です。
前回はこちら。
そして今回の動画はこちらです。
【解説メモ】
パワーアップの効果の持続について表にまとめる
スローダウン:時限制
ライフ:時限制限なし
キャッチ/ひっつき:時限制限なし/複数はしない
伸びる:時限制、縮みで解除
縮み:時限制、伸びで解除
メガボール:時限制
複数:ひっつき解除
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)関数でパドルの移動に合わせて、向きを変更するようにして、解決している。
コメント