ここから重要なメインループの制御の部分を作っていきます。
★マークがある部分が追加したところです。
☆マークが変更したところです。
//----------------------------------------------------------------------
// メイン
//----------------------------------------------------------------------
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
//--------------------------------------------
// 初期化
//--------------------------------------------
// ウィンドウモード
ChangeWindowMode(TRUE);
// タイトル
SetMainWindowText(GAME_TITLE_STR);
// 画面の解像度 変更
SetGraphMode(SCREEN_X,SCREEN_Y,32);
// DXライブラリの初期化
if( DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK)!=0 ) {
return -1;//初期化と裏画面化
}
// ゲームの各種値を初期化 ←★1ゲームの初期化処理を呼び出す。
MainInit();
//--------------------------------------------
// メインループ
//--------------------------------------------
while(ProcessMessage()==0 && ClearDrawScreen()==0 &&
//↑メッセージ処理 ↑画面をクリア
GetHitKeyStateAll_2(g_MainData.key)==0 && g_MainData.key[KEY_INPUT_ESCAPE]==0 ) {
//↑入力状態を保存 ↑ESCが押されていない ←☆2全キーの押下状態をカウント。
// 全キーの押下カウント ←★3全キーの押下状態をカウント。
GetCheckHitKeyAll_2(&g_MainData.AllKeyCount);
// ゲーム全体の状態で振り分ける。 ←★4状態遷移のメイン処理。gameStateで処理を振り分けます。
switch( g_MainData.gameState ) {
case GAME_STATE_TITLE: //タイトル画面
g_MainData.gameState = Title();
break;
case GAME_STATE_NAME: //名前入力
g_MainData.gameState = NameInput();
break;
case GAME_STATE_MAIN: //ゲーム本編
g_MainData.gameState = GameMain();
break;
case GAME_STATE_GAMEOVER: //ゲームオーバー
g_MainData.gameState = GameOver();
break;
case GAME_STATE_ENDING: //エンディング
g_MainData.gameState = Ending();
break;
}
// ☆5ここにあった文字表示は取り除きました。
//裏画面反映
ScreenFlip();
}
//--------------------------------------------
// 終了処理
//--------------------------------------------
// DXライブラリ使用の終了処理
DxLib_End();
return 0;
}
以上がメインループの部分です。
説明します。
★1ゲームの初期化処理を呼び出す。
"ゲーム全体の管理データ"などを初期化する関数を呼び出します。
☆2全キーの押下状態をカウント。
取得したキーの値を"ゲーム全体の管理データ"に格納するように変更しました。
★3全キーの押下状態をカウント。
新たにANY KEYの押下状態を取得する関数を追加して、"ゲーム全体の管理データ"に格納するようにしました。
★4状態遷移のメイン処理。gameStateで処理を振り分けます。
"ゲーム全体の管理データ"のgameStateで呼び出す関数を振り分けています。つまり状態毎に処理関数が分かれるわけです。
各関数の戻り値として次のフレームの状態を設定していますので、各関数で戻り値を変えてやることで状態を遷移する事が出来ますし、現在のgameStateを戻り値とすれば現在の状態が維持されます。
わざわざgameStateに代入しているのは、切り替わりますよ~って事を明確にするためです(私のこだわり)。
☆5ここにあった文字表示は取り除きました。
タイトル画面処理に移しました。
うーん。長いなぁ。続きます。