ちょー簡単RPG講座7-2 ゲーム本編画面遷移

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

ちょー簡単RPG講座7-2 ゲーム本編画面遷移

投稿記事 by softya(ソフト屋) » 14年前

遷移部分の前に前回と違う所と追加したところ解説します。

●comsub
comsubにFPSの制御とFPS表示関数を追加しました。
「ゲームプログラミングの館のs6. FPSを表示する。」のアレンジ版です。
http://dixq.net/g/52.html
なので詳しくは説明しません。
違いといえばFPSを引数に持ったことぐらいでしょうか。

[comsub.h]

CODE:

//	FPSを一定にする。
extern void WaitFpsConstant(int fps);
//	FPSの表示
extern void DrawFps(int fps);
[comsub.cpp]

CODE:

//	ヘッダを先頭に追加
#include 

//----------------------------------------------------------------------
//	FPSを一定にする。
//----------------------------------------------------------------------
void WaitFpsConstant(int fps)
{
	static int beforeTime=0;	//前回の時間。

 	//	fpsの範囲外をチェック
 	assert(fps0);
 	
	//	前回からの経過時間。
	int elapsedTime = GetNowCount() - beforeTime;
	
	//	FPSから余った時間を計算する。
	int oneFrame = 1000 / fps;
	if( (oneFrame-elapsedTime) > 0 ) {
		//	余りがあれば、一定時間を待つ。
		Sleep(oneFrame-elapsedTime);
	}
	//	今回の時間を記録
	beforeTime=GetNowCount();
}


//----------------------------------------------------------------------
//	FPSの表示
//----------------------------------------------------------------------
void DrawFps(int fps)
{
	static int beforeTime=0,aveTime=0,frameTime[100],count=0;
 
 	//	fpsの範囲外をチェック
 	assert(fps0);
 
 	//	フレームあたりの時間を記録。
 	if( count==0 ) {
		frameTime[count%fps] = 0;
	} else {
		frameTime[count%fps] = GetNowCount()-beforeTime;
	}
	beforeTime=GetNowCount();
 	count++;	
	
	//	最後のフレーム
	if((count%fps) == (fps-1) ){
		//	平均フレーム時間を計算する。
		aveTime=0;
		for(int i=0;i<fps;i++) {
			aveTime+=frameTime[i];
		}
		aveTime /= fps;
	}
	//	平均フレーム時間が求まっていたら表示する。
	if(aveTime!=0){
		SetFontSize( 14 );//文字の大きさ
		DrawFormatString(0, 0,GetColor(255,255,255),"%.1fFPS",1000.0/(double)aveTime);
		DrawFormatString(0,20,GetColor(255,255,255),"%dms"	,aveTime);
	}
}
●main
キーコンフィグ対応のための変数を用意しました。
と言ってもキーコンフィグ機能が作られているわけではありません。

[main.h]
構造体を差し替えてください。

CODE:

//	ゲーム全体の管理構造体
typedef struct {
	int key[256];			//キーバッファ
	int AllKeyCount;		//全キーの押下カウント
	GameState_t	gameState;	//ゲーム全体の状態
	int key_up,key_down,key_left,key_right,key_menu,key_act;	//キーコンフィグ対応の機能キーの定義
	
	//	ここに追加の予定。
} MainData_t;
[main.cpp]

○ 定数の追加

CODE:

//----------------------------------------------------------------------
//	定数
//----------------------------------------------------------------------

//	タイトル
#define GAME_TITLE_STR "E A S Y - R P G"

//	1秒間の描画フレーム定数
#define FPS 60
○ 初期化処理の追加

CODE:

//----------------------------------------------------------------------
//	ゲームの各種値を初期化
//----------------------------------------------------------------------
void MainInit()
{
	//	ゲーム全体の値を設定。
	g_MainData.gameState = GAME_STATE_TITLE;	//タイトル画面でスタート
	
	//	ゲーム本編は初期スタートを仮に設定。
	GameMain_Init(GAMEMAIN_INITTYPE_FIRSTSTART);
	
	//	仮にキーコンフィグを行う。
	g_MainData.key_up	= KEY_INPUT_UP;
	g_MainData.key_down	= KEY_INPUT_DOWN;
	g_MainData.key_left	= KEY_INPUT_LEFT;
	g_MainData.key_right= KEY_INPUT_RIGHT;
	g_MainData.key_menu	= KEY_INPUT_RETURN;
	g_MainData.key_act	= KEY_INPUT_SPACE;
}

○ 終了処理を追加

CODE:

//----------------------------------------------------------------------
//	ゲームの各種終了処理
//----------------------------------------------------------------------
void MainEnd()
{
	//	ゲーム本編の終了処理。
	GameMain_End();
}
○ NameInput()関数に、ゲーム本編の初期化を追加。

CODE:

	if( g_MainData.AllKeyCount == 1 ) {
		//	ゲーム本編は初期スタートを設定。
		GameMain_Init(GAMEMAIN_INITTYPE_FIRSTSTART);
		//	次のフレームはゲーム本編へ
		return GAME_STATE_MAIN;
	}
○  GameOver()関数に、ゲーム本編の初期化を追加。

CODE:

	if( g_MainData.AllKeyCount == 1 ) {
		//	ゲーム本編は再スタートを設定。
		GameMain_Init(GAMEMAIN_INITTYPE_RESTART);
		//	次のフレームはゲーム本編へ
		return GAME_STATE_MAIN;
	}
○  WinMainの変更。場所が判りづらいんで全部載せます。
追加したのは、
// FPS表示
DrawFps(FPS);
// 一定速度に保つ処理
WaitFpsConstant(FPS);
// ゲームの各種終了処理
MainEnd();
の3つです。

CODE:

//----------------------------------------------------------------------
//	メイン
//----------------------------------------------------------------------
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;//初期化と裏画面化
	}
	
	//	ゲームの各種値を初期化
	MainInit();
	
	//--------------------------------------------
	//	メインループ
	//--------------------------------------------
	while(ProcessMessage()==0 && ClearDrawScreen()==0 && 
            //↑メッセージ処理         ↑画面をクリア
            GetHitKeyStateAll_2(g_MainData.key)==0 && g_MainData.key[KEY_INPUT_ESCAPE]==0 ) {
            //↑入力状態を保存              ↑ESCが押されていない
		
		//	全キーの押下カウント
		GetCheckHitKeyAll_2(&g_MainData.AllKeyCount);
		
		//	FPS表示
		DrawFps(FPS);
		
		//	ゲーム全体の状態で振り分ける。
		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;
		}
		

		//	裏画面反映
		ScreenFlip();
		//	一定速度に保つ処理
		WaitFpsConstant(FPS);
	}
 	
	//--------------------------------------------
	//	終了処理
	//--------------------------------------------
	
	//	ゲームの各種終了処理
	MainEnd();
	
	// DXライブラリ使用の終了処理
	DxLib_End();

	return 0;
}
以上です。ここまで組み込むとエラーになると思いますが、明日続きを解説します。
最後に編集したユーザー softya(ソフト屋) on 2010年11月27日(土) 16:16 [ 編集 2 回目 ]

コメントはまだありません。