プチコン3号 11日目 当たり判定を追加して迷路探検ゲーム完成!

pc11-1.jpg

前回は迷路の中に敵を登場させて動かしました。
あとは、敵と自分の当たり判定を行い、さらに自分がゴールに到達したことを判定すれば、ゲームの完成です。

当たり判定は、プチコン3号のSmileBASICにスプライト同士の衝突判定をする命令が用意されていますので、これを使います。
ゴール判定のほうも、今回はゴールにスプライトで宝箱を置いて、そのスプライトとの衝突で判定することにしました。

今回、衝突(Collision)判定に使う命令は

SPCOL
SPHITSP

の二つです。

SPCOLは、スプライトの16×16ピクセルの領域のうち、当たりと判定すべき領域を矩形で指定します。
この指定をしなければ衝突判定は行われません。

SPHITSPは、2つのスプライトが重なっていればTRUEを返し、そうでなければFALSEを返します。
SmileBASICには、このほかスプライトが指定した矩形(Rectangle)領域に重なっているかどうかを判定するSPHITRC命令や、重なり状況(重なっていた時間、座標など)をより詳しく取得するSPHITINFO命令も用意されています(今回は使いません)。

当たり判定領域は、スプライトに実際に割り当てる絵に合わせて決めます。
今回は、敵およびプレイヤーの当たり判定領域としてキャラクタの中心部12×12ピクセルを指定しました。
また、ゴールである宝箱は16×16ピクセル全体を指定しました。
領域を狭くすれば当たり判定が甘く、広くすれば厳しくなります。

pc11-2.png

プレイヤーと敵が衝突した場合の処理ですが、とりあえず迷路内のランダムな座標へ飛ばしてしまうことにします。
プレイヤーがゴールの宝箱にタッチしたらゲーム終了です。

他に、BGMや効果音、アニメーションなども追加しましょう。
これらは8日目9日目で簡単に触れました。

以上の処理を前回のプログラムに追加します。
前回との差分を以下に掲載します。(82行目から)

pc11-3.jpg
FOR I=0 TO E_MAX
EX[I]=12+32*RND(M_W-1)
EY[I]=12+32*RND(M_H-1)
SPSET 1+I,1022
SPCOL 1+I,2,2,12,12,1
NEXT
SPCOL 0,2,2,12,12,1
SPANIM 0,"I",10,500,10,501,10,502,10,503,0
SPSET 100,269 'GOAL
SPCOL 100,0,0,16,16
BGMPLAY 14
@LOOP
SPOFS 100,M_W*32-X+172,M_H*32-Y+88
IF SPHITSP(0,100) THEN
BGMSTOP
BEEP 71:WAIT 80
ACLS
END
ENDIF
FOR I=0 TO E_MAX
IF SPHITSP(0,1+I) THEN
  BEEP 4:WAIT 50
X=12+32*RND(M_W-1)
Y=12+32*RND(M_H-1)
ENDIF
IF ((EX[I]-12) MOD 32)==0 && ((EY[I]-12) MOD 32) ==0 THEN
REPEAT
D=RND(4)

82行目で、敵の座標の初期設定のあとに衝突判定領域の設定を追加しました。

同様に、プレイヤーのスプライトも衝突判定領域を設定します(84行目)。
さらにプレイヤーのみアニメーションも追加しました(85行目)。
9日目では移動方向に合わせて絵を変えていましたが、今回は手抜きして、移動方向に合わせた絵の変更は行わず、常に正面を向いた状態になっています。

86行目で、100番のスプライトを宝箱の絵に設定しています。
これがゴールになります。
その次の行で衝突判定領域を設定しています。
そしてBGMも追加しました。

そのあとは、ゲームのループの中に入ります。

まず、宝箱を表示します。
宝箱の位置は迷路の右下隅に固定しています。
ですが、このゲームは画面の中ではプレイヤーのキャラクタが固定されていて、地形のほうが動きますので、宝箱の表示位置を常時以下のように指定する必要があります。

SPOFS 100,M_W*32-X+172,M_H*32-Y+88

この座標の計算が分かりにくければ、前回の説明を参照してください。

次に、宝箱との衝突を

IF SPHITSP(0,100) THEN

で判定しています。
衝突していればゴールしたと見なし、BGMを止めて効果音を出し、ENDでプログラムを終了しています。
こういう風にプログラムをループのど真ん中でいきなり終わらせるのは行儀が悪いのですが、小さなプログラムですので大目に見ましょう。

敵との当たり判定は、同様にFORループの内側で

SPHITSP(0,1+I)

で敵1匹ずつ当たり判定をしています。
もし敵と衝突していれば、効果音を出してプレイヤーのキャラクタをランダムな座標に飛ばしています。

以上で、小さな「迷路探検」ゲームが完成しました。
今回はプログラムをMiiverseへアップロードしましたので、プログラムリストは載せません。
公開キーは「J23XVK3V」です。

このゲーム、実際に遊んでみると「迷路のできが今ひとつだ」と感じることと思います。
次回は、もう少し迷路らしい迷路の生成をやってみます。

コメント