メルマガのサンプルを作っております。
かなり試行錯誤しながらゲームループを作ってみました。
主に 2D の場合のアルゴリズムなのですが、あっているか不安です。
// メッセージループ MSG msg; ::ZeroMemory(&msg, sizeof(MSG)); FLOAT const frame = 16.6666f; DWORD nowTime = ::timeGetTime(); DWORD previousTime = ::timeGetTime(); while (msg.message != WM_QUIT) { if (::PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { ::TranslateMessage(&msg); // メッセージをウィンドウプロシージャに送信 ::DispatchMessage(&msg); } else { // ゲームシステムのメインループ nowTime = ::timeGetTime(); if (frame <(nowTime - previousTime)) { // ゲームの中核処理は必ず実行する ::UpdateGame(); if ((nowTime - previousTime) <(frame * 2)) { // 同じフレーム内に UpdateGame() がすんだ場合は // 描画処理を実行する ::InvalidateRect(hWnd, NULL, FALSE); previousTime = ::timeGetTime(); ::Sleep(1); // 少し待つ } else { // 次のフレームに食い込んでしまった場合は // 強制的に次フレームの更新を実行する previousTime = nowTime - frame; } } } }
大丈夫かな?
Contributions