カー・レースを作ろう その1 |
スカッシュ・ゲームでは、バー1個とボール1個が出てくるだけでした。今度は、配列変数を使って複数の敵を扱う例として簡単なカー・レースを作ります。
ルール
1.サブルーチンを作る
2.プログラム実行時の初期設定
3.タイトル画面の表示
4.ゲームスタート時の初期設定
5.再スタート時の初期設定
6.自分の車の移動
7.敵の車の出現
8.敵の車の移動
9.スコアの処理
10.自分の車と敵の車の当たり判定
11.画面の更新
12.自分の車が爆発中の処理
13.6.に戻る
1.サブルーチンを作る |
「画面のクリア」と「メッセージの表示」はスカッシュ・ゲームと同じです。
;画面のクリア *Clear_Screen color 0, 0, 0 boxf 0, 0, 639, 479 return ;メッセージの表示 *Write_Message ;msx,msy : 表示する座標 ;message : メッセージの内容 pos msx, msy color 255, 255, 255 font "MS 明朝", 16 mes message return ;指定した絵を描画 *Graphic_Draw ;gdx, gdy : 描画する座標 ;wid : ウィンドウID ;div_no : 分割画像No. pos gdx, gdy gmode 2 celput wid, div_no return
描画する座標と、仮想画面のウィンドウIDと、分割画像No.を変数に入れて呼ぶと、該当する絵を表示するサブルーチンを追加しています(wはwindow、divはdivision(分割)の略です)。
2.プログラム実行時の初期設定 |
; ;プログラム実行時の初期設定 ; #define GWIDTH 480 ; ゲーム画面の幅 #define GHEIGHT 480 ; ゲーム画面の高さ #define ENEMAX 64 ; 敵の車の最大数 screen 0, 640, 480 title "CAR RACE" gsel 0 gosub *Clear_Screen ;仮想画面に絵を読み込む celload "graphics\\car.bmp", 1 celdiv 1,32,32 celload "graphics\\explosion.bmp", 2 celdiv 2,64,64 ;効果音を読み込む mmload "sound\\loop04.wav", 0, 1 ;走行音 mmload "sound\\bom01.wav", 1 ;爆発音 randomize ;敵の車の配列宣言 dim enemy_f, ENEMAX dim enemy_x, ENEMAX dim enemy_y, ENEMAX dim tmp_enemy_x, 15 hiscore = 5000
#define GWIDTH 480 ; ゲーム画面の幅 #define GHEIGHT 480 ; ゲーム画面の高さ #define ENEMAX 64 ; 敵の車の最大数
左側の480×480の領域をゲーム画面、右の残りの領域をスコア等の表示部とします。敵の車は最大64台まで出せるものとします。
#defineは定義です。
#define GWIDTH 480
と書くと、480という数字にGWIDTHという別名を与えます。以降、GWIDTHと書くと480と書いたのと同じになります。480と書くよりGWIDTHと書いた方が「ゲーム画面の幅を表しているんだな」ということが分かりやすくなります。
またプログラムのあちこちに64と書いた場合、後で敵の車の最大数を変えたくなった時に、それらを全部修正しなければなりません。このように書いておけば、
#define ENEMAX 64
の1行を修正するだけで済みます(Gはgame、ENEはenemy(敵)の略です)。
;仮想画面に絵を読み込む celload "graphics\\car.bmp", 1 celdiv 1,32,32 celload "graphics\\explosion.bmp", 2 celdiv 2,64,64
"car.bmp"は64×32の画像で、32×32の絵が2つ並んでいます。赤い車(自分の車)には分割画像No.0が、青い車(敵の車)には分割画像No.1がつきます。
"explosion.bmp"は64×64の爆発の画像です。画像と同じ大きさで分割すると、分割画像No.0がつきます。1つの絵からなる画像でも、あえてceldivを行って分割画像No.0をつけることによって、同じサブルーチンで描画できます。
;効果音を読み込む mmload "sound\\loop04.wav", 0, 1 ;走行音
mmload命令の第3引数に1を指定すると、その音はループ再生(延々繰り返して再生されること)となります。
;敵の車の配列宣言 dim enemy_f, ENEMAX dim enemy_x, ENEMAX dim enemy_y, ENEMAX
敵の車のx座標を配列変数enemy_x、y座標をenemy_yに入れます。enemy_fは存在フラグで、敵の車が存在する場合は1、存在しない場合は0を入れます。0番目のデータはenemy_f(0)、enemy_x(0)、enemy_y(0)、1番目のデータはenemy_f(1)、enemy_x(1)、enemy_y(1)……となります。要素数がENEMAXですから、0番目からENEMAX - 1番目までの要素が使えます。
enemy_f(n)が1である(存在する)場合 | enemy_f(n)が0である(存在しない)場合 |
enemy_x(n)、enemy_y(n)を使って移動、描画、自分の車との当たり判定を行います。 | 移動、描画、自分の車との当たり判定を行いません。enemy_x(n)、enemy_y(n)に入っている値は関係ありません。 |
dim tmp_enemy_x, 15
敵のx座標を一時的に入れておくための配列変数です(詳細は後述)。
hiscore = 5000
ハイスコアです。初期値は5000点とします。