![]() |
| ||
| 新浪首页 > 游戏世界 > 游民论谈 > 文章内容 |
M$新型快速图形API的实用观点
游民部落网友品雪
上次给出DirectDraw的浏览和用法(“UsingDirectDrawwithC++”,PCMagezineJune25,1996);现在是 更实用的看M$这个forWin95的快速图形API的时候了。本文将讨论可重用C++类(建议把DD封装在类中),及 我们使用这些类建立的游戏。[figure1] 我们游戏开发方面的主要目标是演示DD及C++构成了多媒体开发的绝妙队伍。我们已经许多类,多数是基于 MFC的。(假定你对Windows编程及MFC和C++已有所知)。 figure1:This Asteroids-style program use Driect Draw to speed display performace。 框架 我们的游戏主要包括两个类及其衍生类:CGameApp和CGameFrame。我们决定干掉M$VCAppWizard生成的 Doc/View,因为我们犯不上跟Doc/view结构纠缠。CGameApp是标准CWinApp子类。我们在CGameApp的 InitInstance函数里直接建立一个CFrameWnd来取代创建一个文档模板(这将建立主窗口): m_pMainWnd=GetNewFrame(); ASSERT(m_pMainWnd!=NULL); m_pMainWnd->ShowWindow(SW_SHOWNORMAL); 注意对GetNewFrame虚函数的调用,它建立当前应用程序主窗口类的一个实例。它发生在我们建立CGameApp和 CGameFrame衍生类时。 我们应用程序类最重要的函数是Run,它被标准MFC处理过程在所有应用初始化工作完成后调用。在Run中,我 们完成所有的游戏初始化,然后循环直到PumpMessage函数返回TRUE应用程序结果信号。我们使用 PeekMessage检查任何已排队消息,如果返回TRUE,PumpMessage取得一条已经存在的队列消息并强制它通过 MFC的处理过程。
if(::PeekMessage(&m_msgCur,NULL,NULL,NULL,PM_NOREMOVE))
{
//pumpmessage,butquitonWM_QUIT
if(!PumpMessage())
{
GetGameFrame()->KillGraphics();
GetGameFrame()->DestroyWindow();
returnExitInstance();
}
}
Run循环的下一部分是我们调用CGameFrame的UpdateGame函数的地方,它更新游戏内部,完成绘制并切换视频页:
if(m_bPlaying)
{
if(!GetGameFrame()->UpdateGame())
{
StopPlay();
PostQuitMessage(0);
}
}
else
{
::WaitMessage();
}
你会发现UpdateGame的真正主体是CSpaceFrame。StartPlay和StopPlay是另外两个重要的函数,它们支持重 新开始和暂停游戏。在CGameFrame的ActivateApp函数中,你会注意到我们在推动焦点时调用了StopLlay,在 获得焦点时调用了StartPlay。注意,StopPlay设置CGameApp成员m_bPlaying为FALSE,它将防止UpdateGame 被调用。当程序得到或失去输入焦点时OnActivateApp被调用,这是调用StartPlay和StopPlay的地方。当程序处理后台时不会进行循环。
|