400 likes | 488 Views
Chapter 20 遊戲輸入訊息處理. 本章重點. 鍵盤輸入訊息 滑鼠輸入訊息 滑鼠相關函式. 鍵盤輸入訊息. 關於 Windows 中的鍵盤 鍵盤訊息 Windows 系統是一個訊息驅動的環境,一旦使用者在鍵盤上進行輸入動作,那麼系統便會接收到對應的鍵盤訊息。. 訊息代號. 說明. WM_KEYDOWN. 按下按鍵訊息. WM_KEYUP. 鬆開按鍵訊息. WM_CHAR. 字元訊息. 系統鍵. Windows 系統本身定義了一組「系統鍵」,這些按鍵通常是 Alt 與其它按鍵的組合,系統鍵對於 Windows 系統本身有一些特定的作用。.
E N D
本章重點 • 鍵盤輸入訊息 • 滑鼠輸入訊息 • 滑鼠相關函式
鍵盤輸入訊息 • 關於Windows中的鍵盤 • 鍵盤訊息 • Windows系統是一個訊息驅動的環境,一旦使用者在鍵盤上進行輸入動作,那麼系統便會接收到對應的鍵盤訊息。
訊息代號 說明 WM_KEYDOWN 按下按鍵訊息 WM_KEYUP 鬆開按鍵訊息 WM_CHAR 字元訊息
系統鍵 • Windows系統本身定義了一組「系統鍵」,這些按鍵通常是Alt與其它按鍵的組合,系統鍵對於Windows系統本身有一些特定的作用。
鍵盤訊息處理 • 觀察訊息處理函式中所傳入的兩個參數wParam與lParam: LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
全域變數宣告 num:人物圖的圖號 dir:人物移動方向 x,y: 人物貼圖座標
Exercise 09 • 下載並改寫ch20_01.cpp程式,使得按下W、X、A、D四鍵亦可讓人物上、下、左、右走,但是這四鍵每按一下只走一步,也就是按著不放不會連續走。 • 專案名稱為『學號_09』 • (例:8223582_09) • 編譯及執行無誤後,使用ftp將『學號_08.cpp』上傳至192.192.155.217的EX09目錄下,帳號:student5,密碼:student5
滑鼠輸入訊息 • lParam參數 • 當滑鼠訊息發生時傳入的參數wParam與lParam則儲存了滑鼠狀態的相關資訊。其中lParam的值可分為高字組與低字組兩個部份,其中高字組部份儲存的是滑鼠游標所在的X座標值;wParam的值記錄著滑鼠按鍵以及鍵盤Ctrl與Shift鍵的狀態資訊 。
lParam參數 WORD LOWORD(lParam參數); //傳回滑鼠游標所在的X座標值 WORD HIWORD(lParam參數); //傳回滑鼠游標所在的Y座標值 以上這兩個函式所傳回的滑鼠游標位置是相對於內部視窗左上點的座標。
測試旗標 說明 MK_LBUTTON 按下滑鼠左鍵 MK_MBUTTON 按下滑鼠中(滾輪)鍵 MK_RBUTTON 按下滑鼠右鍵 MK_SHIFT 按下Shift鍵 MK_CONTROL 按下Ctrl鍵 wParam參數
if(wParam && MK_LBUTTON) { //滑鼠左鍵被按下 } 當某一滑鼠訊息發生時我們要測試滑鼠左鍵是否也被按下,那麼程式的寫法應該像這樣:
滾輪訊息 • 在這裡我們取出wParam高位組與低位組值所用的函式同樣是HIWORD()與LOWORD(): HIWORD(wParam); //高位組,值為120或-120 LOWORD(wParam); //低位組,滑鼠鍵及Shift、Ctrl鍵 的狀態資訊
滑鼠相關函式 • 為了確保程式可以正確的取得滑鼠的輸入訊息,我們會在必要的時候以底下的函式來設定視窗可以取得滑鼠在視窗外所發出的訊息: HWND SetCapture( HWND hWnd ); //設定擷取視窗外的滑鼠訊息
設定滑鼠游標位置 • 在這裡我們告訴您一個可以用來設定滑鼠游標位置的函式: BOOL SetCursorPos( int X軸座標, int Y軸座標); //設定滑鼠游標位置
顯示與隱藏滑鼠游標 • 在遊戲程式中經常會需要隱藏或者顯示滑鼠游標,這項工作很容易來完成,只需要利用下面的這個函式: int ShowCursor(BOOL true或flase); //隱藏及顯示滑鼠游標
限制滑鼠游標移動區域 • API中提供了一個ClipCursor()函式可以用來限制滑鼠游標移動區域以及解除移動限制 。
要設定滑鼠游標移動區域時,傳入這個函式的參數是一個RECT型態的矩形結構,這個結構的內容如下:要設定滑鼠游標移動區域時,傳入這個函式的參數是一個RECT型態的矩形結構,這個結構的內容如下: typedef struct RECT { LONG left; //矩形區域右上點X座標 LONG top; //矩形區域右上點Y座標 LONG right; //矩形區域左上點X座標 LONG bottom; //矩形區域左下點Y座標 } RECT;
取得視窗外部區域以及內部區域的API函式: BOOL GetWindowRect( HWND hWnd,LPRECT 矩形結構 ); //取得視窗外部區域矩形 BOOL GetClientRect( HWND hWnd,LPRECT 矩形結構); //取得視窗內部區域矩形
視窗外部區域 視窗內部區域
Exercise 10 • 下載並改寫ch20_02.cpp程式,使按下空白鍵不放時可讓子彈連發。 • 專案名稱為『學號_10』 • (例:8223582_10) • 編譯及執行無誤後,使用ftp將『學號_10.cpp』上傳至192.192.155.217的EX10目錄下,帳號:student5,密碼:student5
亂數函數 • 產生固定亂數 • #include <stdlib.h> • int rand(void) • 範例 cout << rand() << endl; //輸出亂數 cout << rand() << endl; //輸出亂數 cout << rand() << endl; //輸出亂數
亂數函數 (續) • 產生種子亂數 • #include <stdlib.h> • void srand (unsigned 種子數) • 範例 unsigned seed; cin >> seed; //輸入種子數 srand(seed); //設定亂數種子數 cout << rand() << endl; //輸出亂數 cout << rand() << endl; //輸出亂數 cout << rand() << endl; //輸出亂數
亂數函數 (續) • 產生隨機亂數 • #include <time.h> • time(*指標) • 範例 void srand (time(NULL)); cout << rand() << endl; //輸出亂數 cout << rand() << endl; //輸出亂數 cout << rand() << endl; //輸出亂數
亂數函數 (續) • 調整亂數範圍 • 下限 + rand() % (上限 –下限 + 1) • 範例 int x, y; x = 1 + rand() % (10 - 1 + 1); //1~10的整數亂數 y = rand() % (99 + 1); //0~99的整數亂數