文系でもわかるBASIC入門
19.落下ゲームを作ってみよう その3
[ 落下ゲームを作ってみよう その2 ] の続きです。
前回は、プレイヤーと谷間の壁を作りました。
次は、ゲームらしくなるように当たり判定を付けます。
配列変数を使おう
配列変数(はいれつへんすう)は、沢山の変数を必要としたときに使います。
配列変数を使うときは、DIM命令で宣言をします。
DIM 変数名(用意する数)
使用例です。
行番号10 で、配列変数の宣言
行番号30 で、配列変数に数を代入しています。
実行結果を見ると、行番号50 と 60 は正常に表示されてますが
行番号70 はエラーになっています。
その原因は、宣言した数よりも大きな数値を指定したからです。
整数の割り算と余りの計算
割り算はスラッシュ(/)を使いますよね。このとき小数点ありの結果になります。
では、整数の割り算や余りが欲しいときはどうするのでしょうか?
次の例を見てください。
スラッシュの代わりに
円マーク(¥)を使うと整数の割り算になります。(行番号20)
MODを使うと、余りを算出します。(行番号30)
当たり判定をしよう
ここから前回のつづきです。
当たり判定を行います。
プレイヤーと壁が当たったか(重なったか)どうかを判定します。
プログラムを見てみましょう。
行番号120 から 280 までは変更ありません。
実行してみましょう。
プレイヤーと壁が重なるとプログラムが止まります。
当たり判定の仕組み
当たり判定は大きく分けて2つタイプがあります。
・存在しているもの同士の当たり判定を直接調べる
これは存在 A と B が当たったかを、システムから通知してもらうか
または、座標を比べて重なっているか調べる方法です。
一般的によく使われる手法で、シューティングゲームなどでは
撃った弾が敵と当たったか調べる時に使います。
・仮想存在データと見比べて当たり判定をする
存在の情報を仮想データ上に配置して、
存在 A のいる場所と重なっているか仮想データと見比べる方法です。
例えば、マップデータもこれに該当します。
ゴルフゲームならボールのある場所が、バンカーなのかグリーン上なのか
情報をマップデータから読み取って、ボールに対する影響を決めます。
今回のゲームでは、
仮想存在データと見比べて当たり判定をしています。
プレイヤーの進む先に壁があるか分かるなら、1つ目の方法も使えます。
このBASICには、テキスト画面の情報を読み取る命令がないため出来ないのです。
よって、壁を作った時にその情報を配列データに保存して
プレイヤーと同じ座標にある配列データと比べる方法にしました。
壁の情報を配列データに保存しよう
配列データに壁の情報を記録している所を説明します。
当たり判定するにはそれなりに準備が必要です。
行番号100 で、壁情報を記録する配列変数HIT(16)を宣言します。
これで 0 から 16 までの変数を用意したことになります。
行番号110 で、配列変数の初期化を行うサブルーチンへジャンプしています。
サブルーチンは、行番号370 から 410 までの間です。
HIT(I) = 40-15
配列変数に代入している数値には意味があります。
40 はプレイヤーの初期X座標であり
15 は谷間の壁と壁の空間の半分です。つまり、中間座標になります。
行番号280 を見て下さい。
SPACE$(30) が空間の文字数です。30 の半分なので 15 です。
壁情報を記録しているのは行番号 290 です。
HIT(IDX) = WX
変数WXは左壁の厚みです。
つまり、変数WXの値は左壁のX座標になります。
この情報を記録する理由は後ほど説明します。
変数IDXは配列変数の格納位置を管理しています。
壁が表示される度に 0 から 15 までの間で変化します。
行番号330 を見て下さい。
IDX = (IDX+1) MOD 16
MODは余りを算出する時に使います。
IDX内の数値がどのように変化するかサンプルプログラムを作ってみました。
変数IDXが 0 から 15 の間で変化してますね。
16 で割った余りを使って数値をループさせます。
プレイヤーと壁の重なりを調べよう
配列変数HITの 0 から 15 を使う理由は、プレイヤーと壁の位置に関係があります。
23 - 8 でその差は 15 です。
当たり判定のプログラムを見てみましょう。
行番号 310 では、変数zに壁の当たり情報を代入しています。
変数IDXに+1した位置がプレイヤーとの比較対象になります。
変数IDXが 15 なら (IDX+1) MOD 16 の答えは 0 になります。
つまり、HIT(0)を参照しています。
行番号290 で HIT(15) に壁の座標を代入し、
行番号310 で HIT(0) から当たり判定用に壁の座標を参照しているのです。
320 IF X
この行で当たり判定を行ってます。条件を満たしていればプログラムを停止します。
変数Zは左壁のX座標です。
Z+28は右壁のX座標です。(正確にはZ+30)
空白の文字数が30 なので、左壁のX座標に+30した値が右壁のX座標になります。
しかし、行番号320 では+28としています。
その理由は、落下物に2文字分の厚みがあるからです。
ちょっと今回は内容がハードになり過ぎました。
説明が分からなくても「こんな感じの仕組みなんだ」程度に思ってくれればいいです。
ここでプログラミングは難しいなと諦めてしまうのは勿体無いので
あまり深く考えず次へ進んで下さい。