⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inputsystem.cpp

📁 一本关于OPenGL的很好的电子书
💻 CPP
字号:
/****************************************************************************
 InputSystem.cpp
 
 Implementation of a DirectInput class wrapper input system 
  
 Author   :   Dave Astle
 Date     :   3/5/2001

 Written for OpenGL Game Programming
*****************************************************************************/
#include "InputSystem.h"


/*****************************************************************************
 CKeyboard::Constructor

 Initializes the DI device
*****************************************************************************/
CKeyboard::CKeyboard(LPDIRECTINPUT8 pDI, HWND hwnd)
{
  if (FAILED(pDI->CreateDevice(GUID_SysKeyboard, &m_pDIDev, NULL)))
  {
    // error processing
  }

  if (FAILED(m_pDIDev->SetDataFormat(&c_dfDIKeyboard)))
  {
    // error processing
  }

  if (FAILED(m_pDIDev->SetCooperativeLevel(hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE)))
  {
    // error processing
  }

  if (FAILED(m_pDIDev->Acquire()))
  {
    // error processing
  }

  Clear();
} // end CKeyboard::Constructor


/*****************************************************************************
 CKeyboard::Destructor

 Releases the DI device
*****************************************************************************/
CKeyboard::~CKeyboard()
{
  if (m_pDIDev)
  {
    m_pDIDev->Unacquire();
    m_pDIDev->Release();
  }
} // end CKeyboard::Destructor


/*****************************************************************************
 CKeyboard::Update()

 Queries the current state of the keyboard and stores it in the member
 variables.
*****************************************************************************/
bool CKeyboard::Update()
{
  if (FAILED(m_pDIDev->GetDeviceState(sizeof(m_keys), (LPVOID)m_keys)))
  {
    if (FAILED(m_pDIDev->Acquire()))
    {
      return false;
    }
    if (FAILED(m_pDIDev->GetDeviceState(sizeof(m_keys), (LPVOID)m_keys)))
    {
      return false;
    }
  }
  return true;
} // end CKeyboard::Update()


/*****************************************************************************
 CKeyboard::Acquire()

 Acquires the keyboard
*****************************************************************************/
bool CKeyboard::Acquire()
{
  Clear();
  return (!FAILED(m_pDIDev->Acquire()));
} // end CKeyboard::Acquire()


/*****************************************************************************
 CKeyboard::Unacquire()

 Unacquires the keyboard
*****************************************************************************/
bool CKeyboard::Unacquire()
{
  Clear();
  return (!FAILED(m_pDIDev->Unacquire()));
} // end CKeyboard::Unacquire()



/*****************************************************************************
 CMouse::Constructor

 Initializes the DI device
*****************************************************************************/
CMouse::CMouse(LPDIRECTINPUT8 pDI, HWND hwnd, bool isExclusive)
{
  if (FAILED(pDI->CreateDevice(GUID_SysMouse, &m_pDIDev, NULL)))
  {
    // error processing
  }

  if (FAILED(m_pDIDev->SetDataFormat(&c_dfDIMouse)))
  {
    // error processing
  }

  DWORD flags;
  if (isExclusive)
    flags = DISCL_FOREGROUND | DISCL_EXCLUSIVE | DISCL_NOWINKEY;
  else
    flags = DISCL_FOREGROUND | DISCL_NONEXCLUSIVE;


  if (FAILED(m_pDIDev->SetCooperativeLevel(hwnd, flags)))
  {
    // error processing
  }

  if (FAILED(m_pDIDev->Acquire()))
  {
    // error processing
  }

  if (FAILED(m_pDIDev->GetDeviceState(sizeof(DIMOUSESTATE), &m_state)))
  {
    // error processing
  }
} // end CMouse::Constructor


/*****************************************************************************
 CMouse::Destructor

 Releases the DI device
*****************************************************************************/
CMouse::~CMouse()
{
  if (m_pDIDev)
  {
    m_pDIDev->Unacquire();
    m_pDIDev->Release();
  }
} // end CMouse::Destructor


/*****************************************************************************
 CMouse::Update()

 Queries the current state of the mouse and stores it in the member
 variables.
*****************************************************************************/
bool CMouse::Update()
{
  if (FAILED(m_pDIDev->GetDeviceState(sizeof(DIMOUSESTATE), &m_state)))
  {
    if (FAILED(m_pDIDev->Acquire()))
    {
      return false;
    }
    if (FAILED(m_pDIDev->GetDeviceState(sizeof(DIMOUSESTATE), &m_state)))
    {
      return false;
    }
  }

  return true;
} // end CMouse::Update()


/*****************************************************************************
 CMouse::Acquire()

 Acquires the mouse
*****************************************************************************/
bool CMouse::Acquire()
{
  return (!FAILED(m_pDIDev->Acquire()));
} // end CMouse::Acquire


/*****************************************************************************
 CMouse::Unacquire()

 Unacquires the keyboard
*****************************************************************************/
bool CMouse::Unacquire()
{
  return (!FAILED(m_pDIDev->Unacquire()));
} // end CMouse::Unacquire()


/*****************************************************************************
 CInputSystem::Initialize()

 Initializes the input system. isExclusive should be set to true for exclusive
 mouse access, false otherwise. Flags should be a combination of
 IS_USEKEYBOARD and/or IS_USEMOUSE.
*****************************************************************************/
bool CInputSystem::Initialize(HWND hwnd, HINSTANCE appInstance, bool isExclusive, DWORD flags)
{
  // create the DI object
  if (FAILED(DirectInput8Create(appInstance,
                               DIRECTINPUT_VERSION,
                               IID_IDirectInput8,
                               (void **)&m_pDI,
                               NULL)))
    return false;

  if (flags & IS_USEKEYBOARD)
  {
    m_pKeyboard = new CKeyboard(m_pDI, hwnd);
    if (m_pKeyboard == NULL)
      return false;
  }
  if (flags & IS_USEMOUSE)
  {
    m_pMouse = new CMouse(m_pDI, hwnd, isExclusive);
    if (m_pMouse == NULL)
      return false;
  }

  return true;
} // end CInputSystem::Initialize()


/*****************************************************************************
 CInputSystem::Shutdown()

 Releases all objects and frees memory.
*****************************************************************************/
bool CInputSystem::Shutdown()
{
  UnacquireAll();
  if (m_pKeyboard)
  {
    delete m_pKeyboard;
    m_pKeyboard = NULL;
  }

  if (m_pKeyboard)
  {
    delete m_pMouse;
    m_pMouse = NULL;
  }

  if (FAILED(m_pDI->Release()))
    return false;

  return true;
} // end CInputSystem::Shutdown()


/*****************************************************************************
 CInputSystem::Update()

 Queries the current state of all devices.
*****************************************************************************/
bool CInputSystem::Update()
{
  if (m_pKeyboard)
    m_pKeyboard->Update();
  if (m_pMouse)
    m_pMouse->Update();

  return true;
} // end CInputSystem::Update()


/*****************************************************************************
 CInputSystem::AcquireAll()

 Makes sure all input devices are acquired
*****************************************************************************/
void CInputSystem::AcquireAll()
{
  if (m_pKeyboard)
    m_pKeyboard->Acquire();
  if (m_pMouse)
    m_pMouse->Acquire();
} // end CInputSystem::AcquireAll()


/*****************************************************************************
 CInputSystem::UnacquireAll()

 Unacquires all devices
*****************************************************************************/
void CInputSystem::UnacquireAll()
{
  if (m_pKeyboard)
    m_pKeyboard->Unacquire();
  if (m_pMouse)
    m_pMouse->Unacquire();
} // end CInputSystem::UnacquireAll()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -