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