mfc架构下的directx8
第一章 mfc框架
(dx8mfc)
这里的mfc框架指的是一个符合游戏开发应用的框架,当然你也可以写一个符合你要求的mfc框架。如果你对mfc比较熟悉的话可以直接从第二章开始阅读。本框架是以后几个例子的基础,如果你对mfc不是很了解的话,就要认真阅读本章,以求对这个mfc框架有一个深入的了解。
框架中包括两个类:
cdx8mfcapp类和cframewin类,cdx8mfcapp类是应用程序类,cframewin类是框架的主类,以后我们的大部分代码都是从这里扩展的。首先来看一看cdx8mfcapp类,它包括cdx8mfcapp()、exitinstance()、initinstance()、onidle(long lcount)等成员函数和一个game对象。
initinstance()成员函数在程序初始化时就被调用,在这里我建立了一个窗口:
bool cdx8mfcapp::initinstance()
{
// the one and only window has been initialized, so show and update it.
m_pmainwnd = new cframewin();
m_pmainwnd->showwindow(m_ncmdshow);
m_pmainwnd->updatewindow();
game = (cframewin*) m_pmainwnd;
game->init();
return true;
}
exitinstance()成员函数在程序终止时被调用,在这里我们释放一些对象和指针:
int cdx8mfcapp::exitinstance()
{
// todo: add your specialized code here and/or call the base class
game->end();
delete game;
return cwinapp::exitinstance();
}
onidle(long lcount)成员函数会在没有windows消息要处理的时候被调用,也就是说onidle()成员函数会不断的被调用,这正好被我们用作游戏循环。
bool cdx8mfcapp::onidle(long lcount)
{
// todo: add your specialized code here and/or call the base class
if(game->window_active==true)
{
game->active();
game->window_active=false;
}
game->go();
return true;
}
game对象是一个cframewin类指针,我们在initinstance()成员函数中创建了一个cframewin对象并把cframewin对象的指针值赋给game。
下面我们来看一看cframewin类,它包括active()、end()、go()、init()、update()等成员函数。
init()成员函数,你可以在这里做一些自己的初始化。回顾cdx8mfcapp类的initinstance()成员函数可知,在完成窗口初始化后initinstance()成员函数里就调用了game->init(),也就是说init()在窗口初始化后被调用。
void cframewin::init()
{
afxmessagebox("init");
}
go()成员函数会不断的被循环调用,它又调用了update()和destroywindow()。update()用于更新窗口,调用destroywindow()则会结束应用程序。如果你把destroywindow()语句删除掉,程序会不断的循环。
void cframewin::go() //game循环
{
afxmessagebox("go");
update();
destroywindow();
}
active()成员函数会在应用程序被击活的时候被调用。
void cframewin::active() //窗口被激活
{
trace("active\n");
afxmessagebox("active");
}
这个程序并不做任何事,只是一个mfc框架。你可以从http://gamedev.363.net 下载例子的源程序,或通过e-mail: laical@21cn.com 向本文作者索取。
第二章 初始化directx8
(dx8mfc1)
本例将以第一章的mfc框架为基础对cframewin类进行扩展。主要加入了drawscene()、initdirect3d(hwnd hwnd)和shutdowndirect3d()三个函数。
initdirect3d(hwnd hwnd)函数对direct3d进行初始化:
hresult cframewin::initdirect3d(hwnd hwnd)
{
pid3d = direct3dcreate8(d3d_sdk_version);
hresult hr;
do
{
// we need the display mode so we can get
// the properties of our back buffer
d3ddisplaymode d3ddm;
hr = pid3d->getadapterdisplaymode(d3dadapter_default, &d3ddm);
if(failed(hr))
break;
d3dpresent_parameters present;
zeromemory(&present, sizeof(present));
present.swapeffect = d3dswapeffect_copy;
present.windowed = true;
present.backbufferformat = d3ddm.format;
hr = pid3d->createdevice(d3dadapter_default,
d3ddevtype_hal,
hwnd,
d3dcreate_software_vertexprocessing,
&present,
&pid3ddevice);
if(failed(hr))
break;
// we do our own coloring, so disable lighting