ちょっと間が空いてしまいましたが、システムクラスCSystemを作成しています。もともと58.8fpsで動くように作ってあったのをそのまま流用です。そのうちちゃんと60fpsにしよう。
ProcessNextFrame()をメインルーチンWndProc()から呼び出して、システムをフレーム単位で動くようにしています。ProcessNextFrame()内にあるWaitTime()で、動作が一定になるようにウェイトを入れてます。
昔作ったシステムでは場合分けやエラー処理をたくさん入れてたけど、最近はPCの性能も上がったし、OSもWindowsXP以上で動かすこと前提で組んでいるので、ばっさり切ってます。
いつまでも画面が表示されないと寂しいので、次はグラフィックスクラスCGraphicsを作って何か表示させようかね。
//--------------------------------------------------------- #define SPF 17 // 58.8フレーム //--------------------------------------------------------- // 生成 CSystem::CSystem(HWND hWnd) { // パラメータ設定 MyhWnd=hWnd; // 乱数初期化 srand((unsigned)timeGetTime()); // タイマの高精度化開始 timeBeginPeriod(1); } //--------------------------------------------------------- // 解放 CSystem::~CSystem() { // タイマの高精度化終了 timeEndPeriod(1); } //--------------------------------------------------------- // Name: フレーム処理 HRESULT CSystem::ProcessNextFrame() { // 計算 // 時間待ち WaitTime(); // レンダリング return S_OK; } //--------------------------------------------------------- // 時間待ち void CSystem::WaitTime() { static DWORD dwLastTick=0; static LONG lErrTick=0; DWORD dwCurrTick, dwNowTick; LONG lWaitTick; // 待ち時間を計算 dwCurrTick=timeGetTime(); lWaitTick=SPF-(dwCurrTick-dwLastTick)+lErrTick; lErrTick=0; // 処理落ちしている? if (lWaitTick<0) { lErrTick=lWaitTick; // lErrTickはマイナスになる if ((SPF+lErrTick)<0) lErrTick=0; dwLastTick=dwCurrTick; return; } // 処理が早ければスリープする if (lWaitTick>=4) { Sleep(lWaitTick-3); } // ループで細かい時間待ち while (SPF>((dwNowTick=timeGetTime())-dwLastTick)) { ; } dwLastTick=dwNowTick; }