註:繼續翻譯一些基礎性的文章。
本文: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