游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2333|回复: 4

求教DirectInput8里读取缓冲数据的具体方法

[复制链接]

38

主题

275

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2006-3-30 00:31:00 | 显示全部楼层 |阅读模式
   最近做了个飞机射击类游戏,感觉在控制上有点问题。现在我希望在我按下方向键的同时------不松开方向键----我按下了空格键来FIRE!如果用DirectInput 的立即数据模式的话,显然无法同时读取这个信息。
  于是我研究了下缓冲数据模式。但是发现我的《WINDOWS游戏编程》上讲的很模糊。我上网去找资料,似乎都讲的比较模糊。
  只好自己动手写程序来研究。
  一般的情况,先       
hr=lpdiKeyboard->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),didod,&dwElements,0);

然后是保证其执行正确,最后
for(int i=0 ; i<dwElements;i++)
{
        if(didod.dwData & 0x80)                                        {
                //这里didod.dwOfs 就是那个被按下的键。缓冲区大小为16               
        }

}
  但是经过我测试,每次调用完GetDevicData 后,dwElements 的值都是 1 。
  即使我同时按下两个键,它还是 1。
  这个读取到底该怎么去做?  

38

主题

275

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
 楼主| 发表于 2006-3-30 00:45:00 | 显示全部楼层

Re:求教DirectInput8里读取缓冲数据的具体方法

PS:上述方法中有个值的我注意的地方,我的程序是这样的:在消息循环里,只要程序是激活状态,程序就会调用那个得到按键并把一些信息绘制到窗口的函数-----GetDeviceData 最后一个参数为 0 时,它会清空缓冲区域的内容,想了想,于是把消息循环改了改,改为当程序处于激活状态时,每1000/30 ms  才调用那个得到按键的函数,结果就好象正常了。意思就是说:缓冲区记录了 1000/30 MS 的时间间隔里的按键信息。而原来那样做,缓冲区的内容根本得不到积累-----不知道我这样理解对不对?(呵呵,才刚把问题贴出来,就自己给自己结帖了~~)

但是我还是有些迷惑的地方,有没有牛人来帮我解释清楚一下~~

7

主题

44

帖子

94

积分

注册会员

Rank: 2

积分
94
发表于 2006-3-30 10:59:00 | 显示全部楼层

Re:求教DirectInput8里读取缓冲数据的具体方法

首先说说第一点,DINPUT的立即模式是检测当前输入设备的状态,所以当一个按键被按下或弹起时,你会不断的得到这个按下或弹起的消息。所以在这种模式下很难检测准确一些特定的消息比如先按下后弹起的具体时机,这取决于你两次检测之间的时间长度,这一般是游戏中一帧的长度。
第二点,DINPUT的缓冲模式发送的不是设备的状态信息而是事件信息,所以当你按下一个键以后只会发出一个该键被按下的事件信息,哪怕你按住不放,这个消息也只会被发送一次。如果两个键同时被按下这个肯定会在同一帧中被检测到,如果你先按住一个键然后在按下一个健则不会,这个我前面解释过了,另外在DIDEVICEOBJECTDATA这个结构中带有按键的时间戳,有兴趣的可以自行研究。

38

主题

275

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
 楼主| 发表于 2006-4-1 16:47:00 | 显示全部楼层

Re:求教DirectInput8里读取缓冲数据的具体方法

  先谢过~~还是有些不明白~~~

38

主题

275

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
 楼主| 发表于 2006-4-4 16:53:00 | 显示全部楼层

Re:求教DirectInput8里读取缓冲数据的具体方法

  恩,我现在的目的已经达到了。
  关于《游戏中同一帧下的多次按键检测》,我特地写出来,告诉大家我的研究结果。欢迎阅读!http://blog.csdn.net/kevinlynx/archive/2006/04/04/650467.aspx
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 02:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表