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

Breakout #30 - Multiball! - Pico-8 Hero PICO-8
Breakout #30 - Multiball! - Pico-8 Hero

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

前回はこちら

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

Breakout #30 – Multiball! – Pico-8 Hero

【解説メモ】

マルチボールのスクリーンショット
マルチボールのスクリーンショット

ボールが分裂(増える)関数、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テーブルに複数ボールがあるなら、打ち逃したボールをテーブルから削除して、そうでない場合(一つだけボールがある場合)、ミスとしてライフを一つ減らす。

マルチボールの動画
マルチボールの動画

【自分の感想】

テーブル(配列)を使うことで、簡単にマルチボールを実現できる。

シューティングゲームの弾などは、正にこれですね。

いくらコピーしても、角度を変えないと重なったままになってしまう。

前回も書いたけれど、スティッキー状態でのボールの方向変更が、直されていない。

コメント

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