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

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

  我们把整个的对象传递到回调函数里,枚举方式选择DIDFT_ALL。然后在枚举对象函数里设置对象的属性。

BOOL CALLBACK Joystick::EnumObjectsCallback( const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext )

{

HRESULT hr;

CJoystick * js = (CJoystick*)pContext; //首先取得JS对象指针

//设置游戏杆输入特性

if( pdidoi->dwType & DIDFT_AXIS ) //如果枚举的对象为轴

{

DIPROPRANGE diprg; //设置轴范围结构

diprg.diph.dwSize = sizeof(DIPROPRANGE);

diprg.diph.dwHeaderSize = sizeof(DIPROPHEADER);

diprg.diph.dwHow = DIPH_BYID;

diprg.diph.dwObj = pdidoi->dwType; // 枚举的轴

diprg.lMin = -1024; //最小值

diprg.lMax = +1024; //最大值

// 设置轴范围

hr = js->m_lpDIDevice->SetProperty( DIPROP_RANGE, &diprg.diph);

if( FAILED(hr))

{

OutputDebugString("设置轴范围失败 - in CDIJoystick::EnumObjectsCallback\n");

return DIENUM_STOP;

}

//设置死区属性,如果你使用的是电平式的游戏手柄,需要注释掉一下部分

DIPROPDWORD dipdw; //死区结构

dipdw.diph.dwSize = sizeof( dipdw );

dipdw.diph.dwHeaderSize = sizeof( dipdw.diph );

diprg.diph.dwObj = pdidoi->dwType; // 枚举的轴

dipdw.diph.dwHow = DIPH_DEVICE;

dipdw.dwData = 1000; //10%的死区

hr = js->m_lpDIDevice->SetProperty(DIPROP_DEADZONE, &dipdw.diph);

if( FAILED(hr))

{

OutputDebugString("设置死区失败 - in CDIJoystick::EnumObjectsCallback\n");

return DIENUM_STOP;

}

}

return DIENUM_CONTINUE;

}


  回调函数首先得到类对象的指针,判断扫描到的对象类型。本例中只设置了轴的属性,其实也可以在枚举对象的回调函数中扫描方式使用DIDFT_AXIS标志,例子目的在于说明如何依次设置手柄的各个对象属性。后面的代码设置每个轴的范围在-1024~+1024,如果是游戏杆的话,那么还设置了10%的死区。回调函数的返回值有一下两种:

  #define DIENUM_STOP 0 //停止扫描

  #define DIENUM_CONTINUE 1 //继续扫描


  注意如果你使用的游戏手柄,一定要注释掉设置死区的部分,因为如果仍然对手柄设置死区,那么不会成功,回调函数就会返回DIENUM_STOP,后面也不会再枚举对象,所以有的轴并没有设置成功。甚至,在初始化的函数里,因为hr的错误代码导致初始化函数Initialise()返回了false,以后的代码将因此而失效。
键盘也能翻页,试试“← →”键

相关文章

关注我们

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