使用缓冲数据的DirectInput来控制游戏

来源:互联网 发布:mac youtube 视频下载 编辑:程序博客网 时间:2024/06/15 07:11

使用缓冲数据的DirectInput来控制游戏 作者:蒋轶民   


 DirectInput结构的确是非常出色。因为在处理即时数据的优越性,它仍然是许多DirectX程序员的首选。
    DirectInput的优越性和丰富性给了我们更多的选择和自由。它提供了即时数据(immediate data)和缓冲数据(buffered data)的方式使我们可以完全地抛弃windows消息队列。不过我们在使用DirectInput的时候遇到了一些问题。
    试想一下,在游戏的菜单界面上,使用DirectInput的即时数据,如果我们在点击鼠标的时候,程序就会一直地响应鼠标的按键,于是当我们在进行菜单项选择的时候,如果手没有及时松开,会出现按错的现象。那么这个时候,使用缓冲数据的DirectInput就显得很重要了。
    那么怎样才能设置缓冲数据的DirectInput呢?我在看了很多书(包括《游戏开发大全(Game Programming All in One)》《Microsoft DirectX SDK (April 2006)》)后,终于在自己的机器上试验成功了。下面我就实现这个功能给大家分享分享。 

1、创建DirectInput。使用DirectInput8Create( hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&g_pInputObject, NULL )。

2、创建DirecInput设备。使用g_pInputObject->CreateDevice( GUID_SysKeyboard, &g_pInputDevice, NULL )。
3、设置数据格式。使用g_pInputDevice->SetDataFormat( &c_dfDIKeyboard )。
4、设置合作等级。使用g_pInputDevice->SetCooperativeLevel( hWnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND )。

    接下来这个就与使用即时数据的方式不同了。我们要设置DIPROPDWORD结构。并且使用SetProperty()函数。
5、设置DIPROPDWORD结构。并且调用SetProperty()。这样调用:SetProperty( DIPROP_BUFFERSIZE, &kDIProp.diph )。
6、获取输入设备。使用g_pInputDevice->Acquire()函数。

    然后就是在游戏的交互中使用DirectInput了。
7、定义DIDEVICEOBJECTDATA结构的数组和DWORD结构的缓冲数据大小。
8、取得装置的数据,调用g_pInputDevice->GetDeviceData( sizeof( DIDEVICEOBJECTDATA ), objData, &dItems, 0 )函数。
9、通过检测DIDEVICEOBJECTDATA::dwOfs判断某键是否按下。
10、解除对输入设备的控制,使用Unacquire()函数,并且释放设备。
    使用带有缓冲数据的DirectInput要注意一点。由于它设置了缓冲区,也就是在即时数据的基础上,判断输入设备的状态变化来进或者出队列。换句话说,在我们按下按键的时候,状态的变化使消息进入队列,松开按键的时候,状态的变化又传递一个消息,消息又进入队列。结果是一按一松发送了两个消息。这点要引起注意。


原创粉丝点击