●comsub
comsubにFPSの制御とFPS表示関数を追加しました。
「ゲームプログラミングの館のs6. FPSを表示する。」のアレンジ版です。
http://dixq.net/g/52.html
なので詳しくは説明しません。
違いといえばFPSを引数に持ったことぐらいでしょうか。
[comsub.h] [comsub.cpp]
// ヘッダを先頭に追加
#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.h]
構造体を差し替えてください。
// ゲーム全体の管理構造体
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;
○ 定数の追加
//----------------------------------------------------------------------
// 定数
//----------------------------------------------------------------------
// タイトル
#define GAME_TITLE_STR "E A S Y - R P G"
// 1秒間の描画フレーム定数
#define FPS 60
//----------------------------------------------------------------------
// ゲームの各種値を初期化
//----------------------------------------------------------------------
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;
}
○ 終了処理を追加
//----------------------------------------------------------------------
// ゲームの各種終了処理
//----------------------------------------------------------------------
void MainEnd()
{
// ゲーム本編の終了処理。
GameMain_End();
}
if( g_MainData.AllKeyCount == 1 ) {
// ゲーム本編は初期スタートを設定。
GameMain_Init(GAMEMAIN_INITTYPE_FIRSTSTART);
// 次のフレームはゲーム本編へ
return GAME_STATE_MAIN;
}
if( g_MainData.AllKeyCount == 1 ) {
// ゲーム本編は再スタートを設定。
GameMain_Init(GAMEMAIN_INITTYPE_RESTART);
// 次のフレームはゲーム本編へ
return GAME_STATE_MAIN;
}
追加したのは、
// FPS表示
DrawFps(FPS);
// 一定速度に保つ処理
WaitFpsConstant(FPS);
// ゲームの各種終了処理
MainEnd();
の3つです。
//----------------------------------------------------------------------
// メイン
//----------------------------------------------------------------------
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;
}