我想在博客里记录一些学习DirectX的笔记。这是第一篇。
一直以来对于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>
相关的全部变量:
LPDIRECTINPUT g_dinput = 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 }
在哪里使用呢?我们在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 }
基本就是这些了。
我这里主要是作为学习笔记留在blog上,说的不清楚或者不专业或者其他原因让你没有看明白的,请看
《windows游戏编程大师技巧》一书。