ちょっと間が空いてしまいましたが、システムクラス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;
}