应为 PostMessage 是将 消息插入消息队列中等待处理,而不是直接向窗口传递一个消息。如果是直接向窗口传递一个消 息,很有可能打乱了原来的消息队列,引起程序执行次序的混乱,造成一些意想不到的情况。 下面看看另外两个函数:GetMessage 和 PeekMessage。 在前面的程序代码中用的是 GetMessage 函数,就像下面的代码一样: …………………………………………………… while ( GetMessage ( & msg , NULL , 0 , 0 ) ) { TranslateMessage ( &msg ) ; DispatchMessage ( &msg) ; } …………………………………………. 在这个循环中,GetMessage 函数用以接受消息循环中的消息。一旦接受到消息,如鼠标移 动或者按键等,就返回一个非 0 值,执行 while 语句。但是,如果没有任何动静,比如没有按键 或动鼠标,就不会引起 GetMessage 函数响应,就不会有任何代码执行。如果使用 GetMessage 函 数就会产生不按键飞机和子弹都停顿不动的现象,这显然是我们不愿意看到的。 解决的办法就是使用 PeekMessage 函数: ……………………………………………….. while(TRUE) { if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if (msg.message == WM_QUIT) break ; TranslateMessage(&msg) ; DispatchMessage(&msg) ; Game_Main() ; } } …………………………………………………………….. PeekMessage 函数同样是用以接受消息循环中的消息。但是,与 GetMessage 函数不同, PeekMessage 函数如果没有取道消息不会等待,而是执行 while 语句。这样,即使没有任何鼠标 Windows 下的 C/C++编程 或键盘的输入,while 语句照样被执行,也就是即使不按键,子弹和飞机一样正常飞行。 在这里,出现了 Game_Main 函数。这个函数是定义的游戏主函数,位于主循环中,主要负责 处理游戏的逻辑判断和输入输出。在下一节中有他的一个使用实例,只是给出代码,不作详细分 析,具体的情况在后面的章节我们会逐渐熟悉他。 2)游戏中的定时 所谓游戏的定时,就是限制游戏程序处理的速度。就像放 VCD 一样,有正常速度、快放和慢 放。用户当然希望游戏速度不快不慢,如果太快,就会出现电影快放的效果,太慢也一样。 游戏和动画片类似,是由一幅幅的图组成,当图画翻动时,就产生动画效果。