![]() |
| ||
| 新浪首页 > 游戏世界 > 游民论谈 > 文章内容 |
M$新型快速图形API的实用观点
游民部落网友品雪
建立一个CAnim并不装入图像或为保存图像分配内存;这些在Load函数中真正发生,所以在使用CAnim之前必须先调用Load函数。Load函数实际上调用保护成员CAnim::InternalLoad,它也会被CAnim::Restore调用。 InternalLoad函数建立一个单独的DirectDrawSurface,动画所有的独立图像在它的网格里绘制。之后CAnim::Render根据所需的帧序号索引网格。这是CAnim::Render的原形: HRESULTRender(intnX,intnY,intnFrameNum,LPDIRECTDRAWSURFACEpDestSurface,BOOLbTransparent=TRUE); 前两个参数是动画左上角象素的x,y坐标。第三个参数是要绘制的帧号,接着是目的界面(使用后缓冲区)。 最后一个参数用于设置透明位传送操作,默认为TRUE或支持透明处理。返回值是来衢标界面BltFast函数的HRESULT。返回该值的基本原因是为了判断界面是否已经丢失。始终应当将返回的HRESULT与DDERR_SURFACELOST比较,如果匹配那么恢复所有的界面。 恢复一CAnim的个界面只要简单的调用一下Restore函数。Restore将先调用为拥有的界面调用IDirectDrawSurface::Restore,取回界面的内存。然后调用CAnim::InternalLoad(TRUE),将图像文件重拷到刚恢复的界面里。CAnim::Release只简单调用CAnim界面的IDirectDrawSurface::Release,这应该在C++对象解析之前完成。(通常忘掉调用这个函数没什么影响,因为主要的DirectDraw对象会在释放时释放所有的界面和调色板,但显式调用是良好的编程习惯。 游戏 我们的游戏是简单的,并不需要很长的解释。你是紫色的船;射击屏幕上所有的盒子以进到下一级,在那里会有更多的盒子。进入一个盒子丢一条命。丢三条命GameOver。左右键旋转你的船,上键加速,下减速,Ctrl开火,Esc退出。屏幕顶上的数字是游戏当前的帧率(帧/秒)。它只是指示当前游戏动画的平滑程度,用户不能控制帧速率。 要运行游戏,系统中必须有GameSDK运行时文件。任何使用GamesSDK的游戏都会安装它们,如果已经装过这样的游戏就可以运行了。要编译代码,需要VisualC++4。x及GamesSDK,它目前包括在MSDNlevelII及VisualC++4.1里了。 那么全部的源代码在哪里呢?我们决定使用C++的特性从我们已有的帧及应用程序类衍生建立一些类。这样我们可以分解,将通用的工作放到CGameApp和CGameFrame中,而把游戏相关代码放在CSpaceApp和CSpaceFrame类里。我们或许应该进一步分解,但我们不想被OOP弄得Crazy。注意CSpaceApp只由GetNewFrame和全局对象theApp组成。我们决定不把这些代码放进CGameApp,这样,通用代码在哪结束,游戏代码在哪开始会更清楚些。
|