閱讀835 返回首頁    go 阿裏雲 go 技術社區[雲棲]


HGE 係列教材(6) --- 程序流程與細節

HGE 的一些細節,通過源碼可以更加清楚的了解,通過讀源碼,可以更加高效的使用 HGE Engine。

必要的第一步:

Help Classes 層建立於 Core Functions 層之上,這並不意味著用戶隻需要關心 Help Classes 而忽略 Core Functions,因此我們需要獲得一個 HGE 指針,來使用 Core Functions 的函數:

<1> 獲取 HGE 指針:

HGE* pHGE = pgeCreate(HGE_VERSION);

<2> 釋放 HGE 指針:

使用之後,需要釋放 HGE 指針。

pHGE->Release();

Create 和 Release 過程使用了引用計數,也就是說,一般來看,除了第一次的 Create 調用之外幾乎不消耗CPU時間和資源,每調用一次 Create 函數,引用計數器就加一,隻有在第一次調用的時候才會真正的分配空間,調用 Release 會使得引用計數器減一,當它為 0 的時候,才真正是釋放資源。因此以下代碼是可用的:

while(true)

{

    HGE* pHGE = pgeCreate(HGE_VERSION);   // 確保不是第一次調用 pgeCreate 函數,因為如果是第一次調用,會分配內存。

    // ... do something

    pHGE->Release();

}

此外,要成對的調用 pgeCreate 和 Release 函數,每次調用 Release 之後,調用它的指針將被賦值為0,例如:

HGE* pHGE = hgeCreate(HGE_VERSION);

pHGE->Release();

pHGE->Release(); // ERROR: pHGE == 0

另外,pHGE->Release 會調用 pHGE->System_Shutdown();

必要的第二步:

初始化: pHGE->System_Initiate();

初始化語句放在 Windows 入口函數中,這個函數將按順序完成

1)窗口類的注冊

2)創建窗口

3)初始化子係統

4)顯示一個 HGE 的 LOGO(這個東西在 HGE 裏麵被稱之為 HGE splash)

一般使用 System_Initiate() 都會是這樣的:
    if (pHGE->System_Initiate())
    {
        pHGE->System_Start();
    }
    else
    {
        MessageBox(NULL, pHGE->System_GetErrorMessage(), "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL);
    }

必要的第三步:

調用: pHGE->System_Start();

調用了 System_Start 的目的是開始消息循環,見必要的第二步代碼

pHGE->System_Start 和 pHGE->System_Shutdown 是成對出現的,處於某些原因,即使我們知道 pHGE->Release 會調用 System_Shutdown 函數,我們還是應該去顯示的調用 System_Shutdown 函數。System_Shutdown 相比 Release 要安全,我們可以這樣調用,而不會出錯:

pHGE->System_Start();

// ... Something

pHGE->System_Shutdown();

pHGE->System_Shutdown(); // OK

不論如何,Create 和 Release 成對調用,Start 和 Shutdown 成對調用,那麼就不會有問題出現。

還有什麼是需要的?

System_SetState 函數

常常需要設置窗口大小或者是設置為全屏模式,需要設置是否使用聲音等,這一係列操作被稱之為設置係統狀態,統一通過調用 pHGE->System_SetState 函數來完成,最為關鍵的是設置幀函數,調用了 pHGE->System_Start 之後,會在繪製每幀圖像時調用幀函數。

pHGE->System_SetState(XXX, XXX) 通常可以在如何地方,如何情況下調用,不要認為它們隻能在 pHGE->System_Initiate 之前調用

System_SetState 函數的第一個參數表示狀態,在內部實現時,它是 FSM 的狀態,而第二個參數表示值,通過這個函數,可以綁定狀態和相關的值

補充一下,幀函數必須是一個全局函數,而不能是一個類的成員函數,並且幀函數的原型必須是:

bool FunName(void);

慣用法:

我們通常會在程序初始化之前設置狀態,即在 System_Initiate 調用之前,例如:

int WINAPI WinMain( HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nShowCmd)
{
    pHGE->System_SetState(HGE_FRAMEFUNC, FrameFunc);
    pHGE->System_SetState(HGE_WINDOWED, true);
    pHGE->System_SetState(HGE_USESOUND, false);
    pHGE->System_SetState(HGE_TITLE, "HGE");
    pHGE->System_SetState(HGE_SHOWSPLASH, false); // 用於去除 LOGO

    if (pHGE->System_Initiate())
    {
        pHGE->System_Start();
    }
    else
    {
        MessageBox(NULL, pHGE->System_GetErrorMessage(), "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL);
    }

    pHGE->System_Shutdown();
    pHGE->Release();

    return 0;
}

最後更新:2017-04-02 06:51:29

  上一篇:go HGE 係列教材(1) --- 簡介
  下一篇:go 小心為上:注意C++ fstream給你設下的陷阱