初心者のためのゲームプログラミング入門

プログラミングとゲームの杜

初心者のためのプログラミング入門 & ゲームプログラムの作り方入門

文系でもわかるBASIC入門

19.落下ゲームを作ってみよう その3

[ 18.落下ゲームを作ってみよう その2 ] の続きです。
前回は、谷間の壁と落下物を作りました。
次は、ゲームらしくなるように当たり判定を付けます。

 

1. 配列変数を覚えよう

配列変数は、沢山の変数を必要とした時に使います。

basic 配列変数とはなにか

配列変数を使いたい時には、DIM命令を使用して宣言をします

DIM 変数名(用意する数)

使用例です。

basic 配列変数の使い方

行番号10 で、配列変数の宣言
行番号30 で、配列変数に数を代入しています。

実行結果を見ると、行番号50 と 60 は正常に表示されてますが
行番号70 はエラーになっています。
その原因は、宣言した数よりも大きな数値を指定したからです。

 

2. 整数の割り算と余りの計算

割り算を行う時、スラッシュ(/)を使うと小数点付きの計算になります。
整数での割り算や余りが欲しい時に便利な方法があります。

次の例を見て下さい。

basic 整数の除算と剰余の出し方

割り算に円マーク(¥)を使うと整数の割り算になります。(行番号20)
MODを使うと割り算の余りを算出することができます。(行番号30)

 

3. 当たり判定を付ける

当たり判定とは何か
ずばり、存在Aと存在Bが当たったか(重なったか)どうかを判定する仕組みを言います。

今回のゲームでは、谷間の壁(存在A)と落下物(存在B)との当たり判定が必要になります。
プログラムを見てみましょう。

落下ゲームの当たり判定

行番号120 から 280 までは変更無し。その他が当たり判定用に追加された部分です。

実行してみましょう。

basic 衝突判定 当たり判定の仕組み

壁と落下物が重なるとプログラムが止まります。

 

4. 当たり判定の仕組み

当たり判定には大きく分けて2つタイプがあります。

存在しているもの同士の当たり判定を直接調べる方法

これは存在Aと存在Bが当たったかを、システムから通知してもらうか
または、座標を比べて重なっているか調べる方法です。
一般的によく使われる手法で、シューティングゲームなどでは
撃った弾が敵と当たったか調べる時に使います。

仮想存在データとの見比べで当たりを判定する方法

存在の情報を仮想データ上に配置して、
存在Aがいる場所と重なっている仮想データと見比べる方法です。
例えば、マップデータもこれに該当します。
ゴルフゲームならボールのある場所が、バンカーなのかグリーン上なのか
そういった情報をマップデータから読み取って、ボールに対する影響を決めます。

今回のゲームでは、
2つ目の仮想存在データとの見比べで当たりを判定しています。
落下物の進む先に壁があるか調べることができるなら、1つ目の方法が取れるのですが
このBASICには、テキスト画面の情報を読み取る命令がないため出来ないのです。

よって、壁を作った時にその情報を配列データに保存して
落下物と同じ座標にある配列データと比べる方法にしました

 

5. 壁の情報を配列データに保存する

当たり判定の準備として、配列データに壁情報を記録している所を説明します。

マップデータから当たり判定する

行番号100 で、壁情報を記録する配列変数HIT(16)を宣言しています。
添字に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内の数値がどのように変化するかサンプルプログラムを作ってみました。

basic mod 割った余りでループする数を作る

変数IDXが 0 から 15 の間で変化してますね。
16 で割った余りを使っている為に、数値がループします

 

6. 壁と落下物の重なりを調べる方法

配列変数HITを 0 から 15 の間で使っている理由です。
それは、落下物と壁の表示位置に関係があります。

配列変数でマップデータを作る

23 - 8 でその差は 15 です。

当たり判定のプログラムを見てみましょう。

当たり判定の方法 入門

行番号 310 では、変数に壁の当たり情報を代入しています。
変数IDXに+1した位置が落下物との比較対象になっています。

初心者向け ゲームプログラミング入門

変数IDXが 15 なら (IDX+1) MOD 16 の答えは 0 になります。
つまり、HIT(0)を参照しています。
行番号290 で HIT(15) に壁の座標を代入し、
行番号310 で HIT(0) から当たり判定用に壁の座標を参照しているのです。

320 IF X<Z OR X>(Z+28) THEN END

この行で当たり判定を行ってます。条件を満たしていればプログラムを停止します。
変数Zは左壁のX座標です。
変数Z+28は右壁のX座標です。(正確にはZ+30)

マップデータを使ったあたり判定

空白の文字数が30 なので、左壁のX座標に+30した値が右壁のX座標になります。
しかし、行番号320 では+28としています。
その理由は、落下物に2文字分の厚みがあるからです。

 

ちょっと今回は内容がハードになり過ぎました。
説明が分からなくても「こんな感じの仕組みなんだ」程度に思ってくれればいいです。
ここでプログラミングは難しいなと諦めてしまうのは勿体無いので
あまり深く考えず次へ進んで下さい。