DirectX8和滑鼠(翻譯)

來源:互聯網
上載者:User

註:繼續翻譯一些基礎性的文章。

本文: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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.