ゲームループのバグ修正と可読性を向上させました。でも書いている途中に別のバグに気づきました。ソフトウェアの設計って難しいですね…
ちなみにサンプルゲームはブロック崩しに決定しました。
// メッセージループ 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(); afterGameUpdateTime = ::timeGetTime(); if ((afterGameUpdateTime - enterTime) <frame) { // 同じフレーム内に UpdateGame() がすんだ場合は // 描画処理を実行する ::InvalidateRect(hWnd, NULL, FALSE); previousTime = ::timeGetTime(); ::Sleep(1); // 少し待つ } else { // 次のフレームに食い込んでしまった場合は // 強制的に次フレームの更新を実行する previousTime = enterTime - (DWORD)frame; } } } }
明日もお仕事がんばるぞ!
Contributions