孔雀开发小屋

专注并致力于手机客户端开发
<2009年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

统计

  • 随笔 - 103
  • 文章 - 0
  • 评论 - 251
  • 引用 - 0

常用链接

留言簿(38)

随笔分类

随笔档案

关注的博客

朋友的博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜

DirectInput入门
我想在博客里记录一些学习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, 00)) 
 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 孔雀 阅读(2394) 评论(7)  编辑 收藏 引用 所属分类: C/C++

评论

# re: DirectInput入门 2010-03-31 08:17 Code Knight

其实写逻辑是很考验设计能力的,到现在为止我还没看到过非常优雅的逻辑代码,大篇幅为实现功能而写的代码凌乱不堪,没有美感,一般来说没有专职写过两年以上逻辑的程序员都意识不到自己写的代码有多么乱,不是没有设计,就是设计不好。
  回复  更多评论    

# re: DirectInput入门 2010-03-31 09:26 溪流

@Code Knight
是啊是啊,整个工程老是有一部分地方是乱的,这部分正是逻辑
  回复  更多评论    

# re: DirectInput入门 2010-03-31 09:27 溪流

跟楼主学习dx~
  回复  更多评论    

# re: DirectInput入门 2010-03-31 13:29 普派官方网站

是见对方是你吗爱的
  回复  更多评论    

# re: DirectInput入门 2010-04-02 14:44 好文章

挺好的,正好对这方面有兴趣
  回复  更多评论    

# re: DirectInput入门 2010-04-06 14:07 陈排

真的开始弄DX了么??
  回复  更多评论    

# re: DirectInput入门[未登录] 2010-10-14 15:56 ccsdu2009

支持你阿 等你弄好了 给我一个dinput插件 我帮定到我的游戏引擎中去吧 哈哈
  回复  更多评论    

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理