首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

使用 MFC 建構 DirectX 應用程式框架完整教學

     編輯:關於VC++

前言

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 應用程式的基本框架,並進一步封裝成可重複使用的專案範本。

建立 DirectX 基本框架步驟

1. 建立專案並移除預設對話框

  • 使用 MFC AppWizard (exe) 建立「以對話框為基礎」的專案,命名為 DirectX。
  • 在精靈第二步取消「About Box」核取方塊,完成建立。
  • 刪除專案目錄下的 DirectXDlg.cpp、DirectXDlg.h,並在 FileView、ClassWizard、ResourceView 中移除 CDirectXDlg 類別與 IDD_DIRECTX_DIALOG 資源。

2. 新增視窗基底類別 CDirectXWnd

建立 DirectXWnd.h 與 DirectXWnd.cpp,加入專案。這個繼承自 CWnd 的類別將負責:

  • 建立全螢幕視窗
  • 建立 DirectDraw 物件 (lpDD)
  • 建立前景緩衝區 (lpFrontBuffer) 與背景緩衝區 (lpBackBuffer) 實現雙緩衝/三緩衝
  • 提供虛擬函數 InitializeGame、CleanSurface、UpdateFrame、RestoreSurfaces 供衍生類別覆寫
  • 處理 WM_KEYDOWN (ESC/F12 結束) 與 WM_ACTIVATEAPP (啟用狀態追蹤)

3. 修改應用程式進入點 CDirectXApp::InitInstance

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 可離開,基本框架即告完成。

測試框架:建立衍生類別 CTestWnd

  1. 複製框架專案到新目錄,用 ClassView 新增繼承自 CWnd 的 CTestWnd,將所有 "CWnd" 替換為 "CDirectXWnd",並在標頭檔加入 #include "DirectXWnd.h"。
  2. 修改 DirectX.cpp:加入 #include "TestWnd.h",將 CDirectXWnd 替換為 CTestWnd。
  3. 在 CTestWnd 中覆寫 UpdateFrame(),實作簡單的彈球動畫:清除背景緩衝區、取得 HDC 繪製橢圓、翻轉前景緩衝區並處理 Surface Lost 情況。
  4. 編譯執行,螢幕將顯示一顆白球在 640x480 視窗中反彈移動。

進階:封裝為 Custom AppWizard

為方便重複使用,可進一步撰寫自訂 AppWizard,或直接複製專案目錄檔案到新專案即可快速開始 DirectX 開發。

附錄:核心類別程式碼摘要

DirectXWnd.h

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()
};

DirectXWnd.cpp 關鍵實作

  • InitializeGame:建立 DirectDraw、設定獨佔全螢幕模式、設定顯示模式、檢查硬體能力、依據顯示記憶體決定雙/三緩衝、建立複雜 Surface 結構並取得背景緩衝區指標。
  • RestoreSurfaces:處理 Surface Lost 時的還原。
  • CleanSurface:釋放 Surface 介面。
  • 訊息處理:OnKeyDown 處理 ESC/F12 送出 WM_CLOSE;OnActivateApp 更新 blsActive 旗標。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved