すでにソースは公開したのですが、後の人が参考にできるように掲載しておきます。
ちなみに UpdateGame() はゲームの計算処理。 DrawGame() はゲームの描画処理です。お好みで読み替えてください。
// メッセージループ MSG msg; ::ZeroMemory(&msg, sizeof(MSG)); FLOAT const frame = 16.6666f; DWORD enterTime = ::timeGetTime(); DWORD previousTime = ::timeGetTime(); DWORD afterGameUpdateTime = ::timeGetTime(); while (msg.message != WM_QUIT) { if (::PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { ::TranslateMessage(&msg); // メッセージをウィンドウプロシージャに送信 ::DispatchMessage(&msg); } else { // ゲームシステムのメインループ enterTime = ::timeGetTime(); if (frame <(enterTime - previousTime)) { // ゲームの中核処理は必ず実行する ::UpdateGame(hWnd); afterGameUpdateTime = ::timeGetTime(); if ((afterGameUpdateTime - enterTime) <frame) { // 同じフレーム内に UpdateGame() がすんだ場合は // 描画処理を実行する ::InvalidateRect(hWnd, NULL, TRUE); ::UpdateWindow(hWnd); previousTime = ::timeGetTime(); ::Sleep(1); // 少し待つ } else { // 次のフレームに食い込んでしまった場合は // 強制的に次フレームの更新を実行する previousTime = enterTime - (DWORD)frame; } } } }
よく見るとここだけポリシーが違うんですよね。 const で定数を作っていたり。なんというかモダンな書き方に違和感がある私は古い人間なのかもしれません。
Contributions