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