正在阅读:MFC下DirectX DirectInput的实现MFC下DirectX DirectInput的实现

2005-07-27 10:07 出处: 作者:苗苗 责任编辑:moningfeng

  设置游戏杆任何特性,包括游戏杆范围、相对或绝对数据格式、死区、最小灵敏度等,都使用SetPorperty()函数完成。函数原型为:

  HRESULT SetProperty(

  REFGUID rguidProp, //所要改变属性的GUID

  LPCDIPROPHEADER pdiph //指向属性头结构的指针,包含一些需要修改的信息细节

  );


  对于诸多的特性,一般来说主要设置游戏手柄的范围就可以了。对于游戏杆,可能还需要设置死区。如果想了解更多的特性,请参考SDK。下面我们首先需要了解几个数据结构。

typedef struct DIPROPHEADER { //属性头部结构

DWORD dwSize; //结构大小

DWORD dwHeaderSize; //属性头部结构大小

DWORD dwObj; //对象

DWORD dwHow; //存取方式

} DIPROPHEADER, *LPDIPROPHEADER;

typedef struct DIPROPRANGE { //属性轴范围的结构

DIPROPHEADER diph;

LONG lMin; //轴最小值

LONG lMax; //轴最大值

} DIPROPRANGE, *LPDIPROPRANGE;

typedef struct DIPROPDWORD { //属性死区设置结构

DIPROPHEADER diph;

DWORD dwData; //死区范围值

} DIPROPDWORD, *LPDIPROPDWORD;


  属性头部的结构用来说明一些基本信息。比如属性结构的大小,头部大小,要设置的对象以及存取方式是绝对数据还是相对的偏移。

  属性轴范围结构用来表示属性轴的范围,第一个参数为属性头部,后两个参数分别表示轴最小值和最大值。

  属性死区设置结构用来设置死区,当然如果你使用的仅仅是电平式的游戏手柄,那么这个是不必要的。第一个参数是属性头部,第二个参数是死区范围值。对于死区,可能你还不太了解。游戏杆的方向摇杆是一个模拟设备,在摇杆的中间地带,应该是没有输出的,这样你才可能控制你的飞机或人物停下来不动。对于中间地带的中心往外一个小的范围,游戏杆都应该是没有输出的,所以你必须定义这个中间的小的范围。死区的值用0~10000之间的绝对值表示,所以如果你要定义中间10%的范围为死区,那么dwData的值应该为1000。

  枚举对象函数和枚举函数类似,枚举函数枚举连接到系统上的设备,枚举对象函数枚举设备中每一个对象,比如设备中的轴、按钮、滑杆等等。这里我们简单的使用枚举对象函数来设置轴的特性。

hr = m_lpDIDevice->EnumObjects(EnumObjectsCallback, (VOID*)this, DIDFT_ALL );

if FAILED(hr)

{

OutputDebugString("枚举对象失败 - in CDIJoystick::Initialise\n");

return false;

}


  和枚举函数类似,在声明中枚举对象函数需要声明为static类型,返回值仍然为BOOL型。参数第一个为枚举对象的回调函数名,第二个为传递给回调函数的指针,可以在这个指针指向的结构中保存所修改的信息。第三个为枚举方式,主要有一下的一些标志选项。

  #define DIDFT_ALL 0x00000000 //所有的对象

  #define DIDFT_AXIS 0x00000003 //所有的轴

  #define DIDFT_BUTTON 0x0000000C //所有的按钮

  #define DIDFT_ANYINSTANCE 0x00FFFF00 //所有的实例

键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品