因为项目的原因,需要用游戏引擎HGE,于是分析了一下。
总结:简单有效,但也过于简单了,下面是System_Start的注释!
bool CALL HGE_Impl::System_Start()
{
MSG msg;
POINT pt;
RECT rc;
if(!hwnd) //如果系统没有初始化
{
_PostError("System_Start: System_Initiate wasn't called");
return false;
}
if(!procFrameFunc) //如果帧函数,没有实现
{
_PostError("System_Start: No frame function defined");
return false;
}
bActive=true; //HGE进入活动状态
for(;;)
{
if(!hwndParent) //如果没有父句柄
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message == WM_QUIT) break;
// TranslateMessage(&msg);
DispatchMessage(&msg);
continue;
}
}
//取光标的位置,这个光标是屏
GetCursorPos(&pt);
//取客户端区域
GetClientRect(hwnd, &rc);
//当光标切换为当前窗口所对应的坐标
MapWindowPoints(hwnd, NULL, (LPPOINT)&rc, 2);
//判断鼠标是否在当前窗口
if(bCaptured || (PtInRect(&rc, pt) && WindowFromPoint(pt)==hwnd)) bMouseOver=true;
else bMouseOver=false;
//
if(bActive || bDontSuspend)
{
do
{
dt = timeGetTime() - t0; //t0以来经过的毫秒数,要确定要超过ms退出(相当于等待ms)
}
while(dt < 1);
if( dt >= nFixedDelta ) //如果到了帧的时间
{
fDeltaTime = dt / 1000.0f;
if( fDeltaTime > 0.2f ) //如果超过.2秒
{
if(nFixedDelta) fDeltaTime = nFixedDelta/1000.0f;
else fDeltaTime = 0.01f;
}
fTime += fDeltaTime; //累计游戏的时间
t0 = timeGetTime(); //当前帧处理的时间
if( t0 - t0fps < 1000) cfps++; //小于毫秒时,帧数加
else //如果超过毫秒时
{
nFPS = cfps; //设置当前秒帧计数
cfps = 0; //计数器清
t0fps = t0; //重设计数时间
}
if( procFrameFunc() ) break; //执得帧
if( procRenderFunc ) procRenderFunc(); //如果有渲染,则执得渲染
if( hwndParent ) break;
_ClearQueue();
if(!bWindowed && nHGEFPS == HGEFPS_VSYNC) Sleep(1);
}
else
{
if(nFixedDelta && dt+3 < nFixedDelta) Sleep(1);
}
}
else Sleep(1);
}
_ClearQueue(); //清除没有处理的事件
bActive=false;
return true;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zdhsoft/archive/2009/04/24/4106748.aspx