MFC架构下的DirectX8[1]

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 ghj1976 的 blog

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

本文关键:MFC架构下的DirectX8
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top