DirectX SDK 是 Microsoft 提供的 Windows 遊戲開發核心工具組,包含 DirectDraw、DirectSound、DirectPlay、Direct3D 與 DirectInput 五大元件,分別負責 2D 繪圖加速、音效合成、網路對戰、3D 繪圖與輸入裝置支援。幾乎所有 Windows 平台遊戲都建構於 DirectX 之上。
MFC (Microsoft Foundation Class) 則是 Visual C++ 中強大的 Windows 應用程式開發類別庫,能簡化 Windows API 操作,並透過 ClassWizard 方便訊息對應。將 MFC 與 DirectX 結合,可獲得程式碼可讀性高、類別管理容易、程式碼可重複使用等優勢。本文將示範如何使用 Visual C++ 5.0 從零建立一個 DirectX 應用程式的基本框架,並進一步封裝成可重複使用的專案範本。
建立 DirectXWnd.h 與 DirectXWnd.cpp,加入專案。這個繼承自 CWnd 的類別將負責:
BOOL CDirectXApp::InitInstance()
{
#ifdef _AFXDLL
Enable3dControls();
#else
Enable3dControlsStatic();
#endif
CDirectXWnd *pWnd = new CDirectXWnd();
pWnd->Create("DirectXWnd Test");
m_pMainWnd = pWnd;
pWnd->UpdateWindow();
pWnd->SetFocus();
if (pWnd->InitializeGame(640, 480, 8) == FALSE) {
pWnd->DestroyWindow();
return FALSE;
}
MSG msg;
while (1) {
if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
if (!GetMessage(&msg, NULL, 0, 0))
return msg.wParam;
TranslateMessage(&msg);
DispatchMessage(&msg);
} else {
if (pWnd->blsActive) {
pWnd->UpdateFrame(); // 遊戲主迴圈繪圖
}
}
}
return FALSE;
}
編譯執行後將出現黑色全螢幕視窗,按 ESC 或 F12 可離開,基本框架即告完成。
為方便重複使用,可進一步撰寫自訂 AppWizard,或直接複製專案目錄檔案到新專案即可快速開始 DirectX 開發。
class CDirectXWnd : public CWnd {
public:
CDirectXWnd();
BOOL Create(LPCSTR lpszAppName);
virtual BOOL InitializeGame(UINT GModeX, UINT GModeY, UINT GBPP);
virtual BOOL CleanSurface();
virtual void UpdateFrame();
virtual BOOL RestoreSurfaces(void);
BOOL blsActive;
protected:
LPDIRECTDRAW lpDD;
LPDIRECTDRAWSURFACE lpFrontBuffer, lpBackBuffer;
int nBufferCount;
void Msg(LPSTR fmt, ...);
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnActivateApp(BOOL bActive, HTASK hTask);
DECLARE_MESSAGE_MAP()
};