http://dixq.net/g/03_14.html
こちらのページを参考にし、FPSを制御するプログラムを作ってみました。
そこでひとつ疑問なのですが、UpdateとWaitの関数はMain関数のどの部分に入れたら良いのでしょうか?
このページではScreenFlipの直後にWaitを入れ、Drawの直前にUpdateを入れていますが、
同じように入れると微妙にずれてしまいます。(許容範囲なのかもしれませんが)
よろしくお願いします。
//FPS計算
bool Fps_Update() {
//1フレーム目なら時刻を記憶
if (count == 0) {
start_time = GetNowCount();
}
//平均を計算
if (count == FPS_AVE) {
int t = GetNowCount();
fps = 1000.f / ((t - start_time) / (float)FPS_AVE);
count = 0;
start_time = t;
}
count++;
return TRUE;
}
//待機関数
void Fps_Wait() {
//処理にかかった時間
took_time = GetNowCount() - start_time;
//設定されたFPSにするために待機するべき時間
wait_time = count * 1000 / FPS - took_time;
//待機する必要があれば待機
if (wait_time > 0) {
Sleep(wait_time);
}
}
//ループごとに実行
bool Process() {
//裏画面を表画面に描画処理
if (ScreenFlip() != 0) {
ERROR_MESSAGE("0004:Flipに失敗しました。");
return FALSE;
}
//メッセージ処理
if (ProcessMessage() != 0) {
ERROR_MESSAGE("0003:メッセージ処理に失敗しました。");
return FALSE;
}
//裏画面クリア処理
if (ClearDrawScreen() != 0) {
ERROR_MESSAGE("0005:画面クリアに失敗しました。");
return FALSE;
}
//キーボードの入力処理
if (UpdateKey() != 0) {
ERROR_MESSAGE("0006:キーボードの入力処理に失敗しました。");
return FALSE;
}
return TRUE;
}
//メイン関数
int WINAPI WinMain(HINSTANCE h1, HINSTANCE hp, LPSTR lpC, int nC) {
//メイン初期化
if (!Main_Init()) return -1;
//最初にタイトル画面を表示
GameMode gamemode = Title;
int game_stat = 0; //各モードのステータス変数
bool flag = TRUE; //起動フラグ
//メインループ
while (Process() && flag) {
//ここに実際の処理があります
}
//DXライブラリの終了
DxLib_End();
return 0;
}