注:继续翻译一些基础性的文章。
本文:http://blog.youkuaiyun.com/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