• 沒有找到結果。

第三章 遊戲開發類別庫說明

3.4 GAF函數說明

在下一章的遊戲實作說明之前,我必須先簡單地介紹一下幾個GAF 的主要類別及其函數之功能。

3.4.1 GAFApp類別

這個類別主要是跟視窗建立、訊息機制有關。

1. 函數:virtual BOOL InitInstance();

功能:初始化視窗實體,可以由使用者重新載入初始化自己的資料。

2. 函數:virtual int ExitInstance();

功能:結束視窗實體,可以由使用者重新載入釋放自己的資料。

3. 函數:virtual int Run();

功能:遊戲主循環迴圈,可以由使用者重新載入做自己的遊戲循環。

4. 函數:virtual void OnIdle();

功能:訊息空閒時間處理,可以在這裡放置重繪和更新遊戲資料操 作。

5. 函數:BOOL HandleMessage();

功能:阻塞訊息循環,如果沒有訊息則呼叫OnIdle()。返回FALSE 則表示可以退出程式。

6. 函數:BOOL ProcessMessage();

功能:異步消息處理,由程式設計者自己控制消息處理,不呼叫 OnIdle(),返回FALSE則表示可以退出程式。

7. 函數:void BindWndMenu(UINT uID);

功能:給視窗新增功能表。參數uID是功能表的資源ID編號。

8. 函數:void BindWndClassName(LPCTSTR szWndClassName=GAFDEFWNDCLASSNAME);

void BindWndClassName(UINT uID);

功能:修改視窗類別。這個函數有兩個形式,第一個形式可以通過 指定字串來修改視窗類別名稱,第二個形式則通過資源ID編號。

9. 函數:void BindWndTitle(LPCTSTR szWndTitle=GAFDEFWNDTITLE);

void BindWndTitle(UINT uID);

功能:修改視窗標題。這個函數有兩個形式,第一個形式通過字串 來修改視窗標題,第二個形式則通過資源ID編號。

10. 函數:void BindWndWidth(int w);

功能:修改視窗寬度。參數w是你想要的視窗寬度。

11. 函數:void BindWndHeight(int h);

功能:修改視窗高度。參數h是你想要的視窗高度。

12. 函數:void BindWndIcon(UINT uID);

功能:修改視窗小圖示。參數uID是小圖示的資源ID編號。

13. 函數:void BindWndStyle(DWORD dwExStyle=WSEXAPPWINDOW, DWORD dwStyle=WSPOPUP|WSVISIBLE|WSCAPTION|WSSYSMENU);

功能:修改視窗風格。第一個參數dwExStyle指定視窗延伸風格,

第二個參數dwStyle指定視窗基本風格。通常情況下可以選擇預設 值,即不填寫任何參數。

14. 函數:void ScreenToClient(LONG *px, LONG *py);

void ScreenToClient(LPPOINT lpPoint);

功能:將螢幕座標轉換為客戶區(即除了標題,視窗邊框以及功能 表工具欄區的視窗範圍)座標。有兩種形式,第一個可以指定要轉 換的座標x和y座標值,第二種可以指定一個POINT指標。

15. 函數:void ClientToScreen(LONG *px, LONG *py);

void ClientToScreen(LPPOINT lpPoint);

功能:將客戶區座標換成螢幕座標。有兩種形式,第一種可以指定 要轉換的座標的x和y座標值,第二種可以指定一個POINT指標。

16. 函數:virtual int OnActivateApp(BOOL bActive, DWORD dwThreadID);

virtual int OnCreate(LPCREATESTRUCT lpCreateStruct);

virtual int OnSetFocus();

virtual int OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);

virtual int OnClose(HWND hWnd);

virtual int OnCommand(UINT nNotifyCode, UINT uID, HWND hWndCtrl);

virtual int OnDestroy();

virtual int OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);

virtual int OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);

virtual int OnKillFocus();

virtual int OnLButtonDblClk(UINT nFlags, LONG XPos, LONG YPos);

virtual int OnLButtonDown(UINT nFlags, LONG XPos, LONG YPos);

virtual int OnLButtonUp(UINT nFlags, LONG XPos, LONG YPos);

virtual int OnMouseMove(UINT nFlags, LONG XPos, LONG YPos);

virtual int OnRButtonDblClk(UINT nFlags, LONG XPos, LONG YPos);

virtual int OnRButtonDown(UINT nFlags, LONG XPos, LONG YPos);

virtual int OnRButtonUp(UINT nFlags, LONG XPos, LONG YPos);

virtual int OnPaint(HDC hDC);

virtual int OnSetCursor(HWND hWnd, UINT nHitTest, UINT message);

virtual int OnShowWindow(BOOL bShow, UINT nStatus);

virtual int OnTimer(UINT nIDEvent, TIMERPROC *tmPrc);

功能:由於訊息處理函數比較多,所以下面做統一的介紹。這裡所 有的參數均不需要填寫,由Windows訊息機制來完成。

OnActivateApp函數處理程式被啟動或由活動狀態轉為非活動狀態 的訊息。bactive表示視窗是否被啟動,dwThreadID是執行緒ID編 號。

OnCreate函數處理視窗建立訊息。

OnSetFocus函數處理視窗獲得焦點訊息。

OnChar函數處理鍵盤訊息、nChar是虛擬鍵盤值。

OnClose函數處理視窗關閉訊息、hWnd是視窗控制碼。

OnCommand函數處理功能表、控制項訊息。

OnDestroy函數處理視窗銷毀訊息。

OnKeyDown函數處理鍵盤按鍵按下的訊息。

OnKeyUp函數處理鍵盤按鍵放開的訊息。

OnKillFocus函數處理視窗失去焦點的訊息。

OnLButtonDblClk函數處理滑鼠左鍵雙擊訊息,XPos和YPos分別代 表滑鼠所處的座標的x和y座標。相應的函數有:

OnLButtonDown, OnLButtonUp, OnRButtonDblClk, OnRButtonDown, OnRButtonUp。它們分別處滑鼠左鍵按下、放開,滑鼠右鍵雙擊、

按下、放開的訊息。

OnMouseMove函數處理滑鼠移動訊息。XPos和YPos分別代表滑鼠所 處位置。

OnPaint函數處理視窗重繪訊息。

OnSetCursor函數處理螢幕上的滑鼠設置訊息。

OnShowWindow函數處理視窗顯示訊息。bShow代表視窗是否被顯示。

OnTimer函數處理計時器訊息。

3.4.2 GAFDDraw類別

這個類別如同之前所說的,是對應於DirectX的DirectDraw,主要 是用來設定圖片,不論是背景或是圖片表層,都可以在此設定顯示模 式,另一個重點則是顯示放記憶體的使用與釋放。

1. 函數:HRESULT CreateFullScreen(HWND hWnd, DWORD Width, DWORD Height);

功能:設置寬高為指定值的全螢幕16bit模式,並且自動建立主表 面和後臺表面的翻轉鏈。hWnd指定視窗的控制碼,Width指定表面 寬度,Height指定表面高度。

2. 函數:HRESULT CreateWindowMode(HWND hWnd, DWORD Width, DWORD Height, BYTE bBackSurfacePos=GAFMEMVIDTHENSYS);

功能:設置寬高為指定值的視窗模式,如果視窗客戶區小於指定大

3. 函數:HRESULT Present(BOOL Vsync=TRUE, BOOL displayFPS=FALSE);

功能:用來顯示表面,如果是全螢幕模式則自動翻轉主後表面,如 果是視窗模式會自動Blt,預設值為TRUE。VSync指定是否等待顯示 器垂直回掃週期。displayFPS指定是否顯示每秒幀速率,預設為 FALSE。

4. 函數:HRESULT Restore();

功能:發生主表面資料遺失的時候,自動恢復主表面。這個操作會 由GAFDDraw自動呼叫自動完成。

5. 函數:BOOL is555();

功能:檢查顯示卡的16位元顏色模式是否是555格式,如果顯示卡 支持555格式的16位色,則返回TRUE。

6. 函數:BOOL isFullScreen();

功能:檢查程式是否為全螢幕模式。如果是全螢幕模式,則返回 TRUE。

7. 函數:LPDIRECTDRAW7 GetDD();

功能:獲取原始的LPDIRECTDRAW7介面。

8. 函數:LPCGAFDDRAWSURFACE GetPrimary();

功能:獲取由GAFDDraw生成的主表面(前臺緩衝)。

9. 函數:LPCGAFDDRAWSURFACE GetBack();

功能:獲取由GAFDDraw生成的後臺緩衝。

3.4.3 GAFDDrawSurface類別

這個類別跟上一個類別有很密切的關係,它的主要用途是設定圖層 的載入、屬性設定等。

1. 函數:HRESULT CreateSurface(LPCGAFDDRAW lpGAFDD, int Width , int Height, BYTE MemoryType=GAFMEMVIDTHENSYS);

功能:建立一個空的指定大小的圖層表面,可以指定表面放的位

2. 函數:HRESULT CreateByJPEG(LPCGAFDDRAW lpGAFDD, LPCTSTR szFileName, BYTE MemoryType=GAFMEMVIDTHENSYS);

功能:根據一個JPEG檔來自動建立表面。lpGAFDD指定GAFDDraw類 別指標。SzFileName指定需要載入的圖檔檔名。MemoryType指定表 面所在位置。用法同上。

3. 函數:HRESULT CreateByBitmap(LPCGAFDDRAW lpGAFDD, LPCTSTR szFileName, BYTE MemoryType-GAFMEMVIDTHENSYS);

功能:根據一個BMP檔來自動建立表面。參數用法同上。

4. 函數:HRESULT Restore();

功能:圖層資料遺失的時候自動呼叫Restore恢復圖層,但是目前 還沒有自動恢復圖層內圖像的功能。

5. 函數:HRESULT BltFastTo(CGAFDDrawSurface *lpDDS, LONG lDestX, LONG lDestY, BOOL bTrans, LPRECT srcRect=NULL, BOOL

bAutoClip=TRUE);

功能:向lpDDS表面複製圖像。lpDDS是目標表面的指標。lDestX 和lDestY分別指定目標位置的x和y座標。bTrans決定是否做透明色 檢查。srcRect指定要複製的矩形區域指標,如為NULL則為複製整 個圖層。bAutoClip指定是需要自動裁剪(比如要複製的區域超出目 標圖層的部分會被自動裁掉)。

6. 函數:HRESULT BltTo(CGAFDDrawSurface *lpDDS, LONG lDestX, LONG lDestY, BOOL bTrans, LPRECT srcRect = NULL, BOOL

bAutoClip = TRUE);

功能:功能和參數用法同上。

7. 函數:HRESULT StretchBltTo(CGAFDDrawSurface *lpDDS, BOOL bTrans, LPRECT destRect = NULL, LPRECT srcRect = NULL, BOOL bAutoClip = TRUE);

功能:功能和參數用法大致同上,但可以指定目標圖層上接受圖像 的區域大小。destRect指定複製到目標表面的矩形區域指標,如果 為NULL則為複製到整個圖層。

8. 函數:HRESULT BltFast(CGTAFDDrawSurface *lpDDS, LONG lDestX, LONG lDestY, BOOL bTrans, LPRECT srcRect=NULL, BOOL

bAutoClip=TRUE);

HRESULTBlt(CGTAFDDrawSurface *lpDDS, LONG lDestX, LONG lDestY, BOOL bTrans, LPRECT srcRect=NULL, BOOL

bAutoClip=TRUE);

HRESULT StretchBlt(CGTAFDDrawSurface *lpDDS, BOOL bTrans, LPRECT destRect=NULL, LPRECT srcRect=NULL , BOOL

bAutoClip=TRUE);

功能:功能與前面介紹的3個函數一樣,不過這裡是將lpDDS表面的 圖像複製過來。

9. 函數:void SetClipRect(const LPRECT lprt=NULL);

功能:設置表面可以接受圖片位元傳送的區域。lprt指定裁剪區矩 形,如果為NULL則指定整個表面。

10. 函數:BOOL ClipRect(LPRECT lprt);

功能:根據表面自身的裁剪區域來裁剪矩形區域。lprt指定該矩形 區域。

11. 函數:BOOL ClipRectOffset(LPRECT lprt, LONG *plDestX, LONG

*plDestY);

功能:根據表面自身的裁剪區域來裁剪位移(lDestX, lDestY)以後 的lprt。

12. 函數:void GetSurfaceRect(LPRECT lprt);

功能:獲取整個表面的區域。lprt為呼叫後獲得的矩形區域的指標。

13. 函數:DWORD GetWidth();

DWORD GetHeight();

功能:獲取表面的寬度和高度。返回值分別為寬度和高度值。

14. 函數:LPDIRECTDRAWSURFACE7 GetSurface();

功能:獲取原始的LPDIRECTDRAWSURFACE7介面。

15. 函數:HRESULT SetColorKey(DWORD dwColorKey);

HRESULT SetColorKey();

功能:設置顏色鍵。第一個函數指定dwColorKey為顏色鍵。第二個 函數則設置圖片左上角的像素為顏色鍵。

16. 函數:HRESULT Lock(LPRECT lprt=NULL);

HRESULT Unlock(LPRECT lprt=NULL);

功能:第一個函數Lock用於鎖定表面。lprt指定要鎖定的區域,如 果為NULL則鎖定整個表面。第二個函數Unlock則是解鎖表面。

17. 函數:DWORD GetPitch();

功能:獲取鎖定以後的每行字節數。

18. 函數:BYTE* GetSurfacePointer();

功能:獲取鎖定以後的記憶體指標。

19. 函數:HRESULT Fill(DWORD FillColor, LPRECT lprt=NULL, BOOL bAutoClip=FALSE);

功能:用指定顏色填充矩形。FillColor指定要填充的顏色鍵。lprt 指定要填充的矩形區域,如果為NULL則填充整個表面。bAutoClip 指定是否要進行自動裁剪,預設為FALSE。

20. 函數:HRESULT SetFont(const LPCTSTR szFontName, const int nHeight, const int nWidth=0, const int

nAttributes=FWNORMAL);

功能:設置字體。SzFontName指定字體名。nHeight指定字體高度。

nWidth指定字體寬度,預設為0。nAttributes指定字體風格,預設 為FWNORMAL。

21. 函數:HRESULT TextXY(int x, int y, DWORD col, LPCTSTR pString);

功能:在表面上顯示文字。x,y指定了文字在表面上的位置的座標。

Col指定文字的顏色。pString指定文字內容。

22. 函數:HDC GetDC();

功能:獲取表面的DC。返回值為DC的控制碼。

23. 函數:HRESULT ReleaseDC();

功能:釋放表面DC。

3.4.4 GAFDInput類別

這個類別主要是對DirectX裡的DirectInput元件進行封裝,並且 額外對立即方式的輸入增加了「按鍵放開」的支援。不過此類別並沒 有提供對搖桿的支援。

1. 函數:HRESULT InitDInput(const HINSTANCE hInstance, const HWND hWnd);

功能:用來初始化DInput,HInstance和HWnd是主程式的視窗實體 和視窗控制碼。

2. 函數:HRESULT Update(BOOL updateMouse=TRUE, BOOL updateKeyboard=TRUE);

功能:更新DInput狀態,獲取新的資料,可以指定是否更新滑鼠或 者鍵盤。

3. 函數:intGetKeyState(int nKeyIndex);

int GetMouseKeyState(int nMouseKeyIndex);

功能:讀取鍵盤按鍵狀態和滑鼠按鍵狀態。KeyIndex為按鈕的索引 號,比如DIK_SPACE,DIK_ESCAPE,DIK_E等等。滑鼠按鈕索引為 DIK_MOUSELEFT,DIK_MOUSERIGHT等。

返回值:

GAFDIKEY_NONE //當前按鍵未按下 GAFDIKEY_RELEASE //按鍵恰好放開 GAFDIKEY_PRESS //按鍵按下

4. 函數:void GetMousePos(LONG *px, LONG *py);

void GetSysMousePos(LONG *px, LONG *py);

功能:獲取DInput滑鼠位置和獲取系統預設滑鼠位置。DInput的滑

5. 函數:void SetMouseAcceleration(BOOL ac);

BOOL IsMouseAcceleartion();

功能:設置和讀取GAFDInput滑鼠自動加速開關。當覺得DInput的 滑鼠速度慢時,那就打開這個選項。

6. 函數:HRESULT SetMouseExculsive(BOOL ExclusiveMouseAccess);

功能:設置是否採用滑鼠獨佔瀏覽。

7. 函數:void SetMouseLimit(LONG x1, LONG y1, LONG x2, LONG y2);

void SetMouseLimit(const LPRECT lprt);

功能:設置滑鼠運動範圍,可以使用左上角(x1,y1)和右下角(x2,y2) 座標來指定範圍,也可以使用RECT來指定一個矩形區域。如果不指 定,那麼GAFDInput將自動指定運動範圍為螢幕範圍。

8. 函數:BOOL hasKeyBoard();

BOOL hasMouse();

功能:查詢是否擁有滑鼠和鍵盤設備的不常用功能。

相關文件