ゲーム全般に関するところの整理。

まず、プログラムに使われる数字は、すべて一箇所で決めていたほうが、
後々楽になる。ということで、マクロの整理をしました。

すべての関数もここで定義されているので、関数の機能にコメントを入れておけば、
自分自身が迷うことが少なくなりますし、他人が見ても、ここを見れば済むようにします。





Game.hのソース

#ifndef __GAME_H__ #define __GAME_H__ void TitleProc(void); //タイトル時処理 void GameStartProc(void); //ゲーム開始時処理 void GameProc(void); //ゲーム中処理 void GameClearProc(void); //ゲームクリア処理 void GameOverProc(void); //ゲームオーバー処理 void Wait(void); //ウエイト処理 void InitGame(void); //ゲーム初期化処理 void MainGame(void); //ゲーム処理 void DrawTitle(int i); //タイトル描画 void CheckClear(void); //クリア判定 void CheckOver(void); //オーバー判定 void InitChara(void); //それぞれの初期化処理 void InitMissile(void); // void InitEnemy(void); // void InitMissileEnemy(void); // void InitBlock(void); // void MoveChara(void); //それぞれの移動及び描画処理 void MoveMissile(void); // void MoveEnemy(void); // void MoveMissileEnemy(void); // void DrawBlock(void); // void DeleteMissile(int i); //それぞれの消滅処理 void DeleteEnemy(int i); // void DeleteMissileEnemy(int i); // void DeleteChara(void); // void DeleteBlock(int i); // void GoMissile(int x,int y); //ミサイルの発射処理 void GoMissileEnemy(int x,int y);// int HitChara(void); //キャラの状態取得 int NumCheckEnemy(void); //敵の数取得 int GetMx(int i); //各x,y座標取得 int GetMy(int i); int GetEx(int i); int GetEy(int i); int GetCx(void); int GetCy(void); int GetMEx(int i); int GetMEy(int i); int GetBx(int i); int GetBy(int i); void CheckHit(void); //当たり判定 bool CheckHitNormal(int ax,int ay,int bx,int by); //普通時判定計算 bool CheckHitBlock(int ax,int ay,int bx,int by); //ブロック時判定計算 bool CheckHitMissile(int ax,int ay,int bx,int by); //ミサイル同士判定計算 #define GAME_STATE_TITLE 0 //ゲーム状態 #define GAME_STATE_START 1 #define GAME_STATE_GAME 2 #define GAME_STATE_CLEAR 3 #define GAME_STATE_OVER 4 #define CHARA_X 300 //自機の初期座標の設定 #define CHARA_Y 440 #define CHARA_NUM 3 //自機の数 #define CHARA_MOVE 4 //自機の移動距離 #define CHARA_LIMITR 600 //自機のx座標の限界 #define CHARA_LIMITL 10 #define MISSILE_MAX 1 //一度に出せるミサイルの数 #define MISSILE_MOVE 8 //敵の移動距離 #define MISSILE_LIMIT 20 //ミサイルの消えるy座標 #define COUNT_M 10 //発射後次のミサイルが出せるまでのカウント #define ENEMY_LINEX 10 //敵の縦、横の数 #define ENEMY_LINEY 5 #define ENEMY_MAX 50 //敵の総数 #define ENEMY_MOVE 16 //敵の移動距離 #define ENEMY_MOVEY 16 #define ENEMY_LIMITR 590 //敵の限界座標 #define ENEMY_LIMITL 20 #define SPACING_X 48 //敵同士の間隔 #define SPACING_Y 48 // #define SPACING_A 20 //敵の初期x座標 #define BLOCK_MAX 4 //ブロックの総数 #define BLOCK_NUM 120 //ブロックの崩れる場所の総数 #define ME_MAX 3 //敵ミサイル総数 #define ME_MOVE 4 //敵ミサイル移動距離 #define ME_LIMIT 460 //敵ミサイルの限界座標 #define HIT 16 //当たり判定普通時用座標距離 #define RANDOM 180 //敵ミサイルの発生率(1/RANDOM) #endif



次に、ゲームの処理を、ゲームの進行状態によって振り分けるようにします。
そうすれば、タイトル中、ゲーム中、終わったときなど、整理しやすくなります。

GameStateがゲームの状態を持つ変数となります。

また、ゲーム中では、各描画処理をあとのほうに置いて、各判定を先におけば、
現在の画面の状態で判定できるようになります。各描画処理は、後に書いたほうが上に来るので、
ここで調整しましょう。

GameMain.cppのソース

#include "Def.h" static int GameState =GAME_STATE_TITLE; void MainGame() { switch(GameState){ case GAME_STATE_TITLE: //タイトル TitleProc(); break; case GAME_STATE_START: // ゲーム開始 GameStartProc(); break; case GAME_STATE_GAME: // ゲーム中 GameProc(); break; case GAME_STATE_CLEAR: // ステージクリア GameClearProc(); break; case GAME_STATE_OVER: // ミス時の処理 GameOverProc(); break; }; } void TitleProc() //タイトル時 { DrawTitle(0); GameState = GAME_STATE_START; } void GameStartProc() //ゲームスタート時 { DrawTitle(0); Uint8 key = KeyCode(); if((key % 8) >=4) { InitGame(); GameState = GAME_STATE_GAME; } } void GameProc() //ゲーム中(ここの順番は描画順にもなっています。判定系は最初にあったほうが、 { //描画された瞬間の状態で判定されます。 CheckClear(); //ゲームクリア判定へ CheckOver(); //ゲームオーバー判定へ CheckHit(); //当たり判定へ DrawBlock(); //ブロック描画 MoveChara(); //キャラ移動 MoveMissile(); //ミサイル移動 MoveEnemy(); //敵移動 MoveMissileEnemy();//敵ミサイル移動 } void GameClearProc() //ゲームクリア中 { GameState = GAME_STATE_CLEAR; DrawTitle(2); Uint8 key = KeyCode(); //キー入力で、続ける。 if((key % 8) >=4) {GameState = GAME_STATE_TITLE;} } void GameOverProc() //ゲームオーバー中 { GameState = GAME_STATE_OVER; DrawTitle(1); Uint8 key = KeyCode(); if((key % 8) >=4) {GameState = GAME_STATE_TITLE;} }