在大部分设计的游戏中播放动画的方法有两种:一种是直接播放影片文件(如AVI和MPEG)文件,常用在游戏的片头与片尾;另一种则是游戏时利用连续贴图的方式,制作动画的效果。事实上游戏程序本身几乎都不得是以无限循环的方式不断地在游戏窗口中进行画面重绘的操作,即使用画面没有任何变化,这个重绘的操作还是不断进行的,一直到玩家选择结束游戏为止。
进行连续的播放图片,一种是得用定时器,另一个是重写消息循环,又称为游戏循环。
1:定时器:UINT SetTimer(HWND 接收定时器消息的窗口 ,UINT 定时器代号(必唯一),
UINT 时间间隔, TIMERPROC 处理响应函数); 如:SetTimer(1,500,NULL);
删除定时器用KillTimer(int 定时器代号);
2:游戏循环:
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) //检测消息
{
TranslateMessage(&msg); DispatchMessage(&msg);
}
else
{
tNow=GetTickCount(); //取得系统开始到目前经过的时间
if(tNow-tPre>=40) MyPaint(hdc);//tPre为记录前次绘图时间。MyPaint(hdc)为重绘函数
}
}
Note:
(1);使用PeekMessage()函数来检测目前是否有要处理的消息,若检测到消息(包含WM—QUIT消息)则会返回一个非零值,否则返回零;
(2):不能用GetMessage代替PeekMessage,因为GetMessage只有在取得WM—QUIT消息的时候才返回零,其他的时候则返回非零或"-1"(发生错误时);
(3):if(tNow-tPre>=40) MyPaint(hdc);这里设定40个单位的原因是,因为每隔40个单位进行一次绘图操作那么1秒钟大约重绘窗口1000/40=25次,刚好可以达到期望值.要使玩家感觉不到延迟的状况,基本上游戏画面必须在一秒钟之内至少更新25次以上.由于循环的运行速度远比定时器发出时间信号来得快,因此使用游戏循环可以更精确的控制程序运行速度并提高每秒钟画面重画的次数.