这里我们提出一种游戏循环的概念,游戏循环是将原先程序中的消息循环加以修改,方法是判断其中的内容目前是否有要处理的消息,如果有则进行处理,否则按照设定的时间间隔来重绘画面。下面是接下来一段游戏循环的程序代码:
//游戏循环
while( msg.message!=WM_QUIT ) //注释点1(详细内容见下)
{
if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) ) //注释点2(详细内容见下)
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
tNow = GetTickCount(); //注释点3
if(tNow-tPre >= 100) //注释点4
MyPaint(hdc);
}
}
我们来讲解一下游戏循环片段中的几个重点。
<1>注释点1:当收到的msg.message不是窗口结束消息WM_QUIT,则继续运行循环,其中msg是一个MSG的消息结构,其结构成员message则是一个消息类型的代号。
<2>注释点2:使用PeekMessage()函数来检测目前是否有需要处理的消息,若检测到消息(包含WM_QUIT消息)则会返回一个非“0”值,否则返回“0”.因此在游戏循环中,若检测到消息便进行消息的处理,否则运行else叙述之后的程序代码。这里我们要注意的是,PeekMessage()函数不能用原先消息循环的条件GetMessage()取代,因为GetMessage()函数只有在取得WM_QUIT消息时才会返回“0”,其他时候则是返回非“0”值或“-1”(发生错误时)
<3>注释点3:GetTickCount()函数会取得系统开始运行到目前所经过的时间,单位是毫秒(milliseconds)。 之前我理解错了,在这里感谢worldy的指出我的错误。
DWORD GetTickCount() //取得系统开始到目前经过的时间
这里取得时间的目的主要是可以搭配接下来的判断式,用来调整游戏运行的速度,使得游戏不会因为运行计算机速度的不同而跑得太快或者太慢。