TNP資料室 @ ウィキ

タイトル画面からキー入力でメインゲームの画面に移動する

最終更新:

kokeiro

- view
だれでも歓迎! 編集
メインゲームに移動したかどうかを知るために、ProcessGameMain関数に次を書き足します。

gameMain.cpp

...
void ProcessGameMain(){
	int color = GetColor(255,128,255);
	DrawString(100,100,"メインゲーム画面です",color);
}
...

現在のゲームの状態」を記憶するグローバル変数「GameState」を作成し、この変数の値によってどの画面を表示するのかを分岐してみましょう。
新しくグローバル変数を追加します。

global.cpp

int Key[256];
int GameState;

global.h

...
extern int Key[256];
extern int GameState;
...

define?マクロを用いて、GameStateに入れる値を定めます。ヘッダーフォルダに「define」を場所『sorce』で追加してください。このヘッダーファイルに置換に関する情報を書いていきます。
ちなみに、「GS」はGameStateからきています。

define.h

#ifndef _DEFINE_H_
#define _DEFINE_H_

#define GS_TITLE	0
#define GS_MAIN		1
#define GS_CLEAR	2
#define GS_OVER		3

#endif

このヘッダファイルを読み込みます。また、GameStateなどを初期化するために新しい関数FirstInitのプロトタイプ宣言を追加します。

main.h

...
#include"DxLib.h"
#include"define.h"
#include"global.h"
...
void LoadFiles();
void ChangeGameState(int NewGameState );
void FirstInit();
...

ようやく、GameStateの値で呼ぶ関数を分岐するところまで来ましたorz
最初の画面は当然「タイトル」なので、GameStateGS_TITLEで初期化します。

main.cpp

#include"main.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	ChangeWindowMode(TRUE);
	if(DxLib_Init()==-1)
		return 1;
	SetDrawScreen(DX_SCREEN_BACK);

	FirstInit();
	MainLoop();

	DxLib_End();
	return 0;
}

void MainLoop(){
	while(1){
		if( ProcessMessage() != 0 || CheckHitKey( KEY_INPUT_ESCAPE ) != 0 )
			break;
		ClearDrawScreen();
		GetKeyInput( Key );

		// ゲームステートによって処理する関数を選択する
		switch(GameState){
			case GS_TITLE:
				ProcessTitle();
				break;
			case GS_MAIN:
				ProcessGameMain();
				break;
			case GS_CLEAR:
				ProcessGameClear();
				break;
			case GS_OVER:
				ProcessGameOver();
				break;
		}

		ScreenFlip();
	}
}

// ゲームを起動したときに一度だけ実行する関数
void FirstInit(){
	ChangeGameState( GS_TITLE );		// 最初の画面はタイトル
}

CangeGameState関数の中身を書きます。

other.cpp

#include"main.h"

void ChangeGameState( int NewGameState ){
	if( GameState != NewGameState ){
		GameState = NewGameState;
		switch(GameState){
			case GS_TITLE:
				break;
			case GS_MAIN:
				break;
			case GS_CLEAR:
				break;
			case GS_OVER:
				break;
		}
	}
}

引数として渡されたゲームの状態値現在のゲーム状態値と異なった場合、引数のゲームの状態値に更新されます。
更新した後のswitch文は各画面並行する際の初期化関数を書き足すことになります。
たとえば、新しくメインゲームをすることになった場合、GameStateの値はGS_MAINです。case GS_MAIN にメインゲームの初期化関数を書いておくことで、メインゲームに切り替わった際に初期化がされる、という仕組みです。

思ったより長くなってしまったので、肝心な画面切り替えの仕方は次の項で。