採單例模式封裝 Windows 程式進入點難點:OnIdle 處理、HInstance 保存、HWND 保存。
class WEWindow {
public:
static WEWindow* GetInstance();
void SetHInstance(HINSTANCE hInst);
HINSTANCE GetHInstance();
void SetWEWindow(LPCWSTR szTitle, int iWidth, int iHeight, DWORD iStyle);
void CreateMainWindow();
int GetWidth(); int GetHeight();
HWND GetHWnd();
protected:
HINSTANCE hInst; HWND hWnd;
LPCWSTR szTitle; int iWidth, iHeight; DWORD iStyle;
void CreateWEWindow(LPCWSTR szTitle, int iWidth, int iHeight, DWORD iStyle);
void EnterMessageLoop();
private:
static WEWindow* weInstance; WEWindow();
};
INT WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, LPWSTR, int) {
WEWindow* weWindow = WEWindow::GetInstance();
weWindow->SetHInstance(hInstance);
weWindow->SetWEWindow(L"Hello World", 640, 480, WS_OVERLAPPEDWINDOW | WS_VISIBLE);
weWindow->CreateMainWindow();
// ...
}
繼承介面 IDisposed, IRenderable, IUpdatable (純虛函數)。
class BaseGame : virtual public IDisposed, virtual public IRenderable, virtual public IUpdatable {
public:
BaseGame(string name);
GraphicsDevice* GetGraphicsDevice();
void Tick(); // 一幀完整流程
virtual void Run() = 0; // 進入訊息迴圈
virtual void Dispose();
virtual void Update(DWORD dt);
virtual void Render(DWORD dt);
virtual void Initialize();
void RegisterCamera(BaseCamera* camera);
BaseCamera* GetCamera();
protected:
void SetTimeUsed(); void ShowFPS(); void UpdateCamera(DWORD dt);
GraphicsDevice* pDevice; bool isInitialized; BaseCamera* pCamera;
};
void BaseGame::Tick() {
SetTimeUsed(); // 計算幀時間
Update(TimeUsed::LastTickTimeUsed);
Render(TimeUsed::LastTickTimeUsed);
}
TimeUsed 靜態類別保存幀時間、總運行時間等。
WEWindow)。TestGame 實例,呼叫 Run()。Initialize() → EnterMessageLoop()。Initialize(),初始化幾何體、渲染狀態。PeekMessage 處理訊息,無訊息時呼叫 Tick()。void TestGame::EnterMessageLoop() {
MSG kMessage; HWND hWnd = WEWindow::GetInstance()->GetHWnd();
while (1) {
if (PeekMessage(&kMessage, hWnd, 0, 0, PM_REMOVE)) {
if (WM_QUIT == kMessage.message) { Dispose(); return; }
TranslateMessage(&kMessage); DispatchMessage(&kMessage);
} else { Tick(); }
}
}
下篇將介紹渲染核心:Model、Effect、Texture、Transformation、Camera 類別組織。