DirectInput入門
我想在博客里記錄一些學習DirectX的筆記。這是第一篇。
一直以來對于DirectX的一套沒有花時間去學習,3D圖形api也是學習了OpenGL,相當長的一段時間里,總是認為自己不會去接觸這些。到公司寫了快一年的游戲邏輯了,才明白邏輯固然很重要,但是寫邏輯寫一年和寫兩年的區別不大。做游戲,做網游不就那幾個大塊么,圖形,網絡,數據庫,io并發。寫邏輯是要寫的,但終究需要在某一領域有所專長,才是正道。
言歸正傳吧。
DirectInput是一個不依賴硬件的虛擬輸入系統,是建立于硬件抽象層(HAL)之上的接口。
微軟的DirectX一套均采用COM開發,所以無論DDraw還是DirectInput的構建、設置、使用,代碼都相差無多。基本步驟都是建立xxx接口對象,建立xxx設備,設置xxx相關屬性(參數),使用之。
我們要在應用程序中使用DirectInput,分以下三步走。
1)初始化
2)獲取設備狀態
3)根據設備狀態,進行你的自定義處理。
我這里給出一個簡單的例子。該例子就是在標準的windows應用程序中使用DirectInput所需的步驟。
首先需要包含必要的宏定義和頭文件
相關的全部變量:
建立初始化函數:
在哪里使用呢?我們在windows消息循環里面,處理完消息之后:
基本就是這些了。
我這里主要是作為學習筆記留在blog上,說的不清楚或者不專業或者其他原因讓你沒有看明白的,請看
《windows游戲編程大師技巧》一書。
一直以來對于DirectX的一套沒有花時間去學習,3D圖形api也是學習了OpenGL,相當長的一段時間里,總是認為自己不會去接觸這些。到公司寫了快一年的游戲邏輯了,才明白邏輯固然很重要,但是寫邏輯寫一年和寫兩年的區別不大。做游戲,做網游不就那幾個大塊么,圖形,網絡,數據庫,io并發。寫邏輯是要寫的,但終究需要在某一領域有所專長,才是正道。
言歸正傳吧。
DirectInput是一個不依賴硬件的虛擬輸入系統,是建立于硬件抽象層(HAL)之上的接口。
微軟的DirectX一套均采用COM開發,所以無論DDraw還是DirectInput的構建、設置、使用,代碼都相差無多。基本步驟都是建立xxx接口對象,建立xxx設備,設置xxx相關屬性(參數),使用之。
我們要在應用程序中使用DirectInput,分以下三步走。
1)初始化
2)獲取設備狀態
3)根據設備狀態,進行你的自定義處理。
我這里給出一個簡單的例子。該例子就是在標準的windows應用程序中使用DirectInput所需的步驟。
首先需要包含必要的宏定義和頭文件
1 #define INITGUID
2 #include <objbase.h>
3 #include <dinput.h>
2 #include <objbase.h>
3 #include <dinput.h>
相關的全部變量:
LPDIRECTINPUT g_dinput = NULL;
LPDIRECTINPUTDEVICE g_Keyboard = NULL;
LPDIRECTINPUTDEVICE g_Keyboard = NULL;
建立初始化函數:
1 BOOL InitDirectInput(HINSTANCE hInstance)
2 {
3 // 創建DirectInput對象
4 if (DI_OK != DirectInputCreate(hInst, DIRECTINPUT_VERSION, &g_dinput, NULL))
5 return FALSE;
6
7 // 創建鍵盤設備
8 if (DI_OK != g_dinput->CreateDevice(GUID_SysKeyboard, &g_Keyboard, NULL))
9 return FALSE;
10
11 // 設置協作等級
12 if (DI_OK != g_Keyboard->SetCooperativeLevel(g_hWnd, DISCL_NONEXCLUSIVE|DISCL_BACKGROUND))
13 return FALSE;
14
15 // 設置數據格式
16 if (DI_OK != g_Keyboard->SetDataFormat(&c_dfDIKeyboard))
17 return FALSE;
18
19 // 獲取設備
20 if (DI_OK != g_Keyboard->Acquire())
21 return FALSE;
22
23 return TRUE;
24 }
2 {
3 // 創建DirectInput對象
4 if (DI_OK != DirectInputCreate(hInst, DIRECTINPUT_VERSION, &g_dinput, NULL))
5 return FALSE;
6
7 // 創建鍵盤設備
8 if (DI_OK != g_dinput->CreateDevice(GUID_SysKeyboard, &g_Keyboard, NULL))
9 return FALSE;
10
11 // 設置協作等級
12 if (DI_OK != g_Keyboard->SetCooperativeLevel(g_hWnd, DISCL_NONEXCLUSIVE|DISCL_BACKGROUND))
13 return FALSE;
14
15 // 設置數據格式
16 if (DI_OK != g_Keyboard->SetDataFormat(&c_dfDIKeyboard))
17 return FALSE;
18
19 // 獲取設備
20 if (DI_OK != g_Keyboard->Acquire())
21 return FALSE;
22
23 return TRUE;
24 }
在哪里使用呢?我們在windows消息循環里面,處理完消息之后:
1 unsigned char keyboard_state[256];
2 // Main message loop:
3 while (GetMessage(&msg, NULL, 0, 0))
4 {
5 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
6 {
7 TranslateMessage(&msg);
8 DispatchMessage(&msg);
9 }
10
11 g_Keyboard->GetDeviceState(256, (LPVOID)keyboard_state);
12 if (keyboard_state[DIK_UP])
13 {
14 ::MessageBox(NULL, "up", "msg", MB_OK);
15 }
16 }
2 // Main message loop:
3 while (GetMessage(&msg, NULL, 0, 0))
4 {
5 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
6 {
7 TranslateMessage(&msg);
8 DispatchMessage(&msg);
9 }
10
11 g_Keyboard->GetDeviceState(256, (LPVOID)keyboard_state);
12 if (keyboard_state[DIK_UP])
13 {
14 ::MessageBox(NULL, "up", "msg", MB_OK);
15 }
16 }
基本就是這些了。
我這里主要是作為學習筆記留在blog上,說的不清楚或者不專業或者其他原因讓你沒有看明白的,請看
《windows游戲編程大師技巧》一書。
posted on 2010-03-30 23:55 孔雀 閱讀(2456) 評論(7) 編輯 收藏 引用 所屬分類: C/C++