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

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

  所有的设备设置都妥当了以后,就应该获取游戏手柄了。获取游戏手柄使用Acquire()函数。在游戏手柄的使用中,还需要用到一个重要的组成部分——轮循(Poll)。

  轮循是因为手柄的驱动程序时序的产生中断,需要我们时序的检测手柄的状态。轮循由函数Poll()来实现。下面实现了类中的轮循:

HRESULT Joystick::PollDevice(void)

{

HRESULT hr;

if( NULL == m_lpDIDevice ) //未获得设备

return S_OK;

hr = m_lpDIDevice->Poll(); // 轮循设备读取当前状态

if( FAILED(hr) )

{

// 输入流中断,不能通过轮循获得任何状态值。

// 所以不需要任何重置,只要再次获得设备就行。


hr = m_lpDIDevice->Acquire();

while( hr == DIERR_INPUTLOST )

{

static int iCount = 0;

if (iCount>30) exit(-1); //累积30次获取设备失败,退出程序。

iCount++;

OutputDebugString("丢失设备,轮循失败 - in CJoystick::PollDevice\n");

hr = m_lpDIDevice->Acquire();

if( SUCCEEDED(hr) ) iCount = 0;

} // hr也许为其他的错误.

return S_OK;

}

// 获得输入状态,存储到成员变量 m_diJs 中

if( FAILED( hr = m_lpDIDevice->GetDeviceState( sizeof(DIJOYSTATE), &m_diJs ) ) )

return hr; // 在轮循过程中设备将为 已获得 状态

return S_OK;

}


  如果轮循失败,则再次获取设备;如果获取失败,则检测失败类型,重复获取设备。如果错误连续出现30次(实际为31次),则退出程序。DIERR_INPUTLOST表示设备输入丢失,并且下一次调用的时候未获得,需要重新获取。其他类型的错误信息请参考SDK。

  再往后你只需要读取游戏手柄状态并把他们存储到你的DIJOYSTATE类型成员变量m_diJs中去了。应用的函数为GetDeviceState(),原型为:

HRESULT GetDeviceState(

DWORD cbData; //存储到的结构的大小

LPVOID lpvData //存储的成员变量的指针

);


  至此,你的游戏手柄类已经基本完成了,如果你需要什么其他的功能或者需要进行其他的设置,你可以自己去添加和修改。现在你的类已经可以为你的程序工作了,你接下来应该做的就是在你的MFC程序中声明一个类的对象并调用他,然后检测状态并完成相关的输出。

  在DirectInputJSDlg.cpp文件中加入自定义类的头文件#include "Joystick.h"。

  然后在所有函数的开始声明一个全局变量Joystick joystick。
键盘也能翻页,试试“← →”键

相关文章

关注我们

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