在Pocket PC上编写游戏之六 |
作者: 来源: 阅读 数 599 人次 , 2006-4-25 9:09:00 |
|
导读
大多数动作游戏运行时,我们看见游戏在不停的移动着。如果在DOS操作系统下,程序员很容易可以做到这点,但是如果在Win32这个多支持任务的操作系统环境,超过一个以上的应用程序好象正在在同一个时间同时运行。 这时你的游戏只是其中的一个,另外的程序虽然可能没有显示出来,但它们运行在后台。 这将引起一个问题,就是我们需要和其他的程序进程分享CPU时间。
自己运行
在先前的章节,在最后例子源码中你可能已经发现了一个API函数SetTimer(..)。一个典型的Win32程序有一个主窗口函数,和一个过程处理函数WndProc,用来处理Windows操作系统发送来的消息。如果没有新消息进来,我们的代码便什么也不做,好象休眠了一样。如何使程序能够自动的运行,而不需要人工的干涉呢?建立一个无限循环确实可以达到这个目的,但是你会失去和操作系统之间的通讯。因为只要你还在循环体中,你便不可能处理下一条来自消息队列的消息。那怎么办,我们可以使用SetTimer(...)这个API函数,他可以适时的向WndProc发送请求,让操作系统招呼一下我们。*_-
在你调用SetTimer(hwnd,wid,n,0)以后只是一时间。 操作系统将每[n] 毫秒发送一个WM_TIMER消息到你的窗口过程函数。现在,让我们试试这代码
// replace to startup.c LRESULT MainWndProc(HWND hWnd, UINT message, WPARAM uParam, LPARAM lParam) { switch(message) { case WM_TIMER: MessageBeep(0); break; case WM_KEYDOWN: DestroyWindow(hWnd); break; case WM_CREATE: SetTimer(hWnd,1,500,0); break; case WM_DESTROY: PostQuitMessage(0); break; default: DefWindowProc(hWnd, message, uParam, lParam); } return 0; } | 这个程序的效果是:每500毫秒便会发出哔哔声。
什么是可分享的时间?
现在, 我们能让使用定时器使程序工作了。在游戏应用程序中,定时器是非常重要的,因为如果没有这种方法,想要让我们的程序运行要复杂的多。
好让我们进一步的学习有关可分享的时间。这是一个什么样的机制呢?我们来看看。由操作系统发送WM_TIMER 消息到我们的WndProc开始。消息将会在我们规定了的时间间隔再次发送送SetTimer(...)。如果间隔是500毫秒。 那意味我们需要在下次发送之前完成我们的工作。如果不能完成,那我们只好等下一次了。我们将失去500毫秒。
在两次时间的间隔中我们需要做游戏需要的大量的工作,例如:处理输入和游戏人工智能,移动对象,碰撞检查等等。如果你设计游戏的运动速率是8帧/秒,所以你有最多125毫秒(1000/ 8 = 125毫秒)的时间处理每个帧。不过不必担心125毫秒会不会够用,因为我们的PDA运行速率是100-200 MHz。它能立刻处理超过一个百万指令。
请注意,定时器和回调函数象迈步一样不停的转换。在处理以后一个定时器消息后,需要回到系统。在这意味着我们暂时放弃了应用程序的控制权。直到消息再次到达,我们的代码才会再次运行。 |
|