2023年09月11日 10:51:00
一、 mfc類庫與directxsdk
microsoft directx sdk是開發基於 windows平台遊戲的乙個軟體開發工具,其主要功能主要包括在五個元件中: directdraw、 directsound、directplay、direct3d和directinput,每個元件都具不同的功能:
可以說directxsdk提供了編寫乙個遊戲所必須的功能及基層函式,所以大多windows遊戲都使用了ditrectxsdk。
mfc(microsoft foundation class)類庫是microsoft visual c++中提供的乙個功能強大的windows應用程式開發類,使用這些類我們可以避免和繁瑣的windows apl打交道,而且在visualc++中我們還可以利用c1asswizard對mfc類進行windows訊息對映,所以如果能用mfc類庫來開發directxsdk的應用程式,至少有以下幾個好處:
1.可以用 vc++的 c1asswizard方便地對windows訊息進行對映;
2.增加了程式的可讀性,並且可以用vc++的classview方便的管理所用的類;
3.增加程式**的可重用性,可以在原有的基礎上開發出功能更強大的應用程式更進一步,如果我們能開發出乙個能生成directxsdk應用程式基本框架的vc++的工程嚮導,則為以後開發directx sdk應用程式提供及大的方便。下面,我們將用visua1 c++5.0先編寫乙個directxsdk應用程式的基本框架。
二、編寫directxsdk應用程式基本框架
我們按下列步驟建立乙個勘rectxsdk程式的基本框架:
//call this when using mfc in a shared dll
#else enable3dcontrolsstatic();
//call this when linking to mfc statically
#endif
cdirectxwnd *pwnd=new cdirectxwnd();
pwnd-
m_pmainwnd = pwnd;
pwnd-
pwnd-
if(pwnd-
msg msg;
while(1)
else
}
}三、測試框架
現在,我們按下列步驟寫乙個測試程式來測試這個框架:
1.把剛才建立的工程框架拷貝到乙個新目錄下,並開啟。用c1assview建立乙個基於cwnd的類ctestwnd,然後把ctestwnd.h和ctestwnd.cpp檔案中的所有"cwnd"字串替換為"cdirectxwnd",並在ctestwnd.h檔案頭加入下列
字串:#include"directxwnd.h"。
2.開啟directx.cpp檔案,在檔案頭加入#include"testwnd.h",並把該檔案中的所有"cdirectxwnd"字串替換成"ctestwnd"並儲存。
3.為 ctestwnd類增加乙個虛函式updateframe(),這個函式覆蓋了其基類cdirectwnd的updateframe():
void ctestwnd::updateframe()
if(lpbackbuffer-
while(1)
;
if(ddrval==dderr_su***celost)
}
if(ddrval!=dderr_wasstilldrawing)
}
}
無心柳按:光是這麼追加在測試中沒有成功,可能要在ctestwnd.h中追加兩行:
public:
void updateframe();
否則編譯可能出錯。
4、編譯並執行該程式,螢幕上會出現乙個白色球在移動。
附錄: 檔案:directxwnd.h
檔案:directxwnd.cpp
//directxwnd.cpp:implementation file
#include "stdafx.h"
#include "directx.h"
#include "directxwnd.h"
#ifdef _dubug
#define new debug_new
#undef this_file
static char this_file=__file__;
#endif
cdirectxwnd::cdirectxwnd()
cdirectxwnd::~cdirectxwnd()
}bool cdirectxwnd::initializegame(uint gmodex,uint gmodey,uint gbpp)
ddrval=lpdd-
if(ddrval!=dd_ok)
ddrval=lpdd-
if(ddrval!=dd_ok)
//check capabilites
ddcaps ddcaps;
ddcaps.dwsize=sizeof(ddcaps);
ddrval=lpdd-
if(ddrval!=dd_ok)
if(ddcaps.dwcaps&ddcaps_nohardware)
//default to double buffered on 1mb,triple buffered
if(nbuffercount==0)
else
}
ddsu***cedesc ddsd;
::zeromemory(&ddsd,sizeof(ddsd));
ddsd.dwsize=sizeof(ddsd);
ddsd.dwflags=ddsd_caps|ddsd_backbuffercount;
ddsd.ddscaps.dwcaps=ddscaps_primarysu***ce|ddscaps_flip|ddscaps_complex;
ddsd.dwbackbuffercount=nbuffercount-1;
ddrval=lpdd-
if(ddrval!=dd_ok)
else msg("顯示記憶體允許建立的緩衝區數=%d(最多需要3)",nbuffercount);
ddscaps ddscaps;
ddscaps.dwcaps=ddscaps_backbuffer;
ddrval=lpfrontbuffer-
if(ddrval!=dd_ok)
return true;
}
void cdirectxwnd::msg(lpstr fmt,...)
virtual function
bool cdirectxwnd::restoresu***ces()
bool cdirectxwnd::cleansu***ce()
if(lpfrontbuffer)
return true;
}
void cdirectxwnd::updateframe()
begin_message_map(cdirectxwnd,cwnd)
//}afx_msg_map
end_message_map()
///cdirectxwnd message handlers
void cdirectxwnd::onkeydown(uint nchar,uint nrepcnt,uint nflags)
cwnd::onkeydown(nchar,nrepcnt,nflags);
}
ctestwnd.zip,測試程式原始檔。
----無心柳
本文摘自《計算機程式設計技巧與維護》雜誌2023年第3期
整理:無心柳(全部**已經輸入測試通過)1999/11/02
用Delphi開發DirectX控制項
2000 09 02 00 22 2058人閱讀收藏 舉報 microsoft推出的directx使我們在windows9x下開發遊戲軟體便利了許多。一般在介紹directx 的資料裡都講的是如何用vc 來開發,其實inprise公司的語言也可以用來開發基於directx的遊戲軟體。我們這裡用的是d...
用DirectX實現魔方(一)
魔方英文名字叫做rubik s cube,是由匈牙利建築學教授和雕塑家ern rubik於1974年發明,最初叫做magic cube 這大概也是中文名字的來歷吧 1980年ideal toys公司開始銷售此玩具,並將名字改為rubik s cube。魔方在80年代最為風靡,至今未衰。截至2009年...
用DirectX實現魔方(一)
魔方英文名字叫做rubik s cube,是由匈牙利建築學教授和雕塑家ern rubik於1974年發明,最初叫做magic cube 這大概也是中文名字的來歷吧 1980年ideal toys公司開始銷售此玩具,並將名字改為rubik s cube。魔方在80年代最為風靡,至今未衰。截至2009年...