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

本文介绍了如何在游戏开发中使用DirectInput的缓冲数据模式来改善用户体验,避免因连续读取鼠标键盘输入而导致的选择错误问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用缓冲数据的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要注意一点。由于它设置了缓冲区,也就是在即时数据的基础上,判断输入设备的状态变化来进或者出队列。换句话说,在我们按下按键的时候,状态的变化使消息进入队列,松开按键的时候,状态的变化又传递一个消息,消息又进入队列。结果是一按一松发送了两个消息。这点要引起注意。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值