![]() |
| ||
| 新浪首页 > 游戏世界 > 游民论谈 > 文章内容 |
M$新型快速图形API的实用观点
游民部落网友品雪
CGameFrame封装了主窗口的建立及功能。它包括游戏所需基本数据成员:一个DirectDrawSurface指向主要的flipping surface(m_pFrontBuffer),一个指向绘制界面(m_pBackBuffer)的指针,及游戏的调色板 (m_pGamePalette)。正如前文所述,所有绘制工作是在绘图界面上完成的,然后切换页实现平滑动画。 我们在建构函数中建立主窗口。首先用AfxRegisterWndClass注册自己的窗口类以改变默认的光标、图标和背 景画刷。我们将光标设为NULL使之不显示;图标是从资源中装入的,背景刷设为black这样在第一次页切换之 前主窗口不会很显眼。下一步我们用CreateEx建立窗口。注意,我们为debug和release版建立不同的窗口。 我们发现用小的、层叠窗口(overlap)会使用调试更容易些,而发行模式窗口是位于最顶层的弹出(pop-up)窗 口,尺寸与屏幕分辨率相同。为什么我们要使用WS_SYSMENU风格呢?因为我们想在切换到其它程序时让游戏 出现在任务栏上,如果不指定WS_SYSMENU风格,任务栏上不会显示出应用程序的图标。 InitGraphics函数包含所有的设定和初始化DirectDraw工作,正如本文前面所述。另一个重要的函数是 RestoreSurface,当切换到其它程序后会需要它。当切换出现时,GDI恢复它控制范围内的视频内存。因此, 当我们的游戏恢复时,我们需要调用为所有的界面调用RestoreSurface以重新请求它的视频内存,然后必要的话将图像复制回界面。 因为我们用WS_SYSMENU建立主窗口,窗口有一个菜单。这样,如果按下Alt键游戏将会停止,系统菜单将取得 焦点。但我们可能想用Alt键进行控制。要允许那样,我们建立一个OnSysCommand函数,它截获并取消菜单键(Alt或F10),将任何其它键传给默认的消息处理程序。 动画 队从MFC衍生的类,我们还写了CAim类,一个直接的C++类以处理DirectDraw动画。这个类不依类于MFC,去掉animation。cpp开始时部分的#include“stdafx。h”就可以在任何其它DirectDraw程序中使用了。以下的片断显示通常如何建立一个CAnim: m_pShipAnim=newCAnim(m_pDD,”ship”,”media/”,32); 第一个参数是指程序的DirectDraw对象的指针,第二、三个参数告诉应用程序到哪找包含独立帧的位图文件。这第二个参数是文件名的路径,每个必须包含三个元素:一个四字符的root标识,表明帧所属群组,跟上以0填充的四位数字标识,表明帧在动画中的位置(从0000开始),以及一个。bmp扩展名。第三个参数是文件所在目录名。第四个参数是动画的帧数,第五个参数是默认为TRUE的布尔变量,它决定CAnim是否尝试将图像装入视频内存。如果视频内存不足则继续使用系统内存。类似的,如果显式设为FALSE,那么图像将会装进系统内存。上边这条命令将从子目录media中装入ship0000。bmp到ship0031。bmp,并在空间许可的情况下装入视频内存中。确认同一动画中所有图像宽高都相同是十分重要的。
|