DirectX8和鼠标(翻译)

注:继续翻译一些基础性的文章。

本文:http://blog.csdn.net/closeall2008 

DirectX8和鼠标
by Mason Smtih

初始化:
首先让我们看一下下面的代码:

//globals
LPDIRECTINPUT8 lpdi ;
LPDIRECTINPUTDEVICE8 m_keyboard ;
LPDIRECTINPUTDEVICE8 m_mouse ;

//initialization function
bool Init( HWND hWnd )
{
   if( FAILED( DirectInput8Create( GetModuleHandle(NULL), DIRECTINPUT_VERSION,
                                    IID_IDirectInput8, (void**)&lpdi, NULL )))
     return false ;

   //initialize keyboard
   if( FAILED( CreateDevice( GUID_SysKeyboard, &m_keyboard, NULL)))
      return false ;
  
   if( FAILED( m_keyboard->SetDataFormat(&c_dfDIKeyboard)))
      return false ;

   if( FAILD ( m_keyboard->SetCooperativeLevel(hWnd, DISCL_BACKGROUND | DISCL_NOEXCLUXIVE)))
      return false ;
 
   if( FAILED( m_keyboard->Acquire() ))
      return false ;

  
   //initialize mouse
   if( FAILED( CreateDevice( GUID_SysMouse, &m_mouse , NULL ) ) )
      return false ;

   if( FAILED( m_mouse->SetCooperativeLevel( hWnd, DISCL_BACKGROUND | DISCL_NOEXCLUSIVE )))
      return false ;

   if( FAILED( m_mouse->SetDataFormat( &c_dfDIMouse ) ))
      return false ;

   if( FAILED( m_mouse->Acquire() ))
      return false ;

   return true ;
}


初始化的第一件事情是我们调用DirectInput8Create函数来得到一个DirectInput对象接口。这个函数的第一

个参数是你的应用程序的句柄。第二个参数是一个常量,用来告诉这个函数使用当前的DirectInput版本,这

个常量在dinput.h中定义。第三个参数用来说明你想使用那个版本的接口。下一个参数用来存储我们将要得到

一个接口指针。最后一个参数设置为NULL就行了。

 

DirectInput对象能够代表所有的输入设备。在我们的应用程序中,常用的有2个:一个是鼠标,一个是键盘。


得到了DirectInput对象接口后, 我们需要呼叫CreateDevice方法来创建设备。和键盘一样,鼠标也有一个指

定的GUID。因此,把CreateDevice 方法的第一个参数也是一个GUID(GUID_SysMouse).第二个参数是指向该设

备的一个指针。最后一个参数从来不用,设置成NULL 就行了。


下面的事情是我们要为应用程序设置合作模式。和所有的DirectX设备一样,调用SetCooperativeLevel方法。

第一个参数是程序的主窗口句柄。第二个参数用来设置一些标记。对于鼠标我们通常使用DISCL_FOREGROUND

或 DISCL_BACKGROUND 和DISCL_EXCLUSIVE 或 DISCL_NONEXCLUSIVE .下面是一些说明:

DISCL_FOREGROUND
只有应用程序有焦点的时候,设备才接收输入
DISCL_BACKGROUND
任何时候,设备都接受输入
DISCL_EXCLUSIVE

DISCL_NONEXCLUSIVE


在这个例子中我们使用DISCL_BACKGROUND | DISCL_NOEXCLUSIVE

下一步, 我们呼叫SetDataFormat方法。这个函数设置我们接受数据的格式。通常我们只需传入全局变量
c_dfDIMouse的地址即可。


最后调用Acquire方法来获取设备。这个函数不需要任何参数。


更新设备:
初始化完成以后,我们需要从输入设备得到数据。下面是一些代码例子。

UCHAR keystate[256] ;
DIMOUSESTATE mouse_state ;

bool Update(void)
{
  if (FAILED(m_keyboard->GetDeviceState(sizeof(UCHAR[256]), (LPVOID)keystate)))
    return false;
  if (FAILED(m_mouse->GetDeviceState(sizeof(DIMOUSESTATE), (LPVOID)&mouse_state)))
    return false;

  return true;
}

要得到输入设备的数据,只需调用GetDeviceState方法即可。第一个参数是一个结构的大小。第二个参数是一

个用来保留数据的一个结构的指针。指针类型一顶要是LVOID 类型的


资源释放:

bool Release(void)
{
  m_mouse->Unacquire();
  m_mouse->Release();
  m_mouse = NULL;

  m_keyboard->Unacquire();
  m_keyboard->Release();
  m_keyboard = NULL;

  lpdi->Release();
  lpdi = NULL;

  return true;
}

 

这篇文章翻译自 http://www.gamedev.net

 如有翻译的不对的地方,还请路上的朋友指正,谢谢

 

译者;closeall

时间:2005.09. 21

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值