TeamworkCastが配信している、PICO-8のチュートリアル動画の解説を連載中です。
前回はこちら。
そして今回の動画はこちらです。
【解説メモ】
ボールが分裂(増える)関数、multiball()を定義(setang関数とsign関数の間に記述)し、内容はまだ書かない。
つぎに、カプセルの取得でmultiball()を実行することを記述。
powerupget(_p)関数内のelseif _p == 7 then〜end内に、multiball()を記述。
newball()関数の下に、
function copyball(ob)
b={}
b.x=ob.x
b.y=ob.y
b.dx=ob.dx
b.dy=ob.dy
b.ang=ob.ang
return b
end
を記述。
引数で受けたテーブルの要素をコピーしたテーブルを返す。
copyball(ob)関数を使って、multiball()関数の内容を記述
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
まず、copyball(ob)関数を使って、オリジナルのボールを2回コピーする。
このままだと、進行方向(角度)が同じなので、ボール3つが重なっている状態になっている。
なので、3種類ある角度を割り振り、全て違う角度で進むようにする。
角度を変更したら、ballテーブルにコピーしたボール2つを加える。
試しにカプセルをマルチボールばかり出すため、_t=flr(rnd(7))+1の下に_t=7を記述する。
実行すると、カプセルを取ると分裂するが、そのボールの打ち一つでも打ち逃すと、ミスになってしまう(最後の一つのボールを打ち逃したら、ミスにしたい)。
そこで、ボールを打ち逃したチェックの箇所を修正する。
-- check if ball left screen
if nexty >127 then
sfx(2)
lives-=1
if lives<0 then
gameover()
else
serveball()
end
end
この部分を
-- check if ball left screen
if nexty >127 then
sfx(2)
if #ball > 1 then
del(ball,myball)
else
lives-=1
if lives<0 then
gameover()
else
serveball()
end
end
end
として、まずballテーブルに複数ボールがあるなら、打ち逃したボールをテーブルから削除して、そうでない場合(一つだけボールがある場合)、ミスとしてライフを一つ減らす。
【自分の感想】
テーブル(配列)を使うことで、簡単にマルチボールを実現できる。
シューティングゲームの弾などは、正にこれですね。
いくらコピーしても、角度を変えないと重なったままになってしまう。
前回も書いたけれど、スティッキー状態でのボールの方向変更が、直されていない。
コメント