📄 gameinput.cpp
字号:
#include "GameInput.h"
CGameInput* CGameInput::m_pInstance = NULL;
CGameInput::CGameInput()
{
m_pDInput = NULL;
m_pKeyboard = NULL;
m_pMouse = NULL;
}
CGameInput::~CGameInput()
{
CleanUp();
}
CGameInput* CGameInput::GetInstance()
{
if(m_pInstance == NULL)
m_pInstance = new CGameInput;
return m_pInstance;
}
LRESULT CGameInput::InitInput(DWORD keyboardCoopFlags, DWORD mouseCoopFlags, HINSTANCE hInstance, HWND hWnd)
{
ZeroMemory(m_CurrKeyboardState, sizeof(m_CurrKeyboardState));
ZeroMemory(m_PrevKeyboardState, sizeof(m_PrevKeyboardState));
ZeroMemory(&m_CurrMouseState, sizeof(m_CurrMouseState));
ZeroMemory(&m_PrevMouseState, sizeof(m_PrevMouseState));
//创建DIRECTINPUT
if(FAILED(DirectInput8Create( hInstance, DIRECTINPUT_VERSION,
IID_IDirectInput8, (void**)&m_pDInput, 0)))
{
CleanUp();
return E_FAIL;
}
//创建键盘
if(FAILED(m_pDInput->CreateDevice(GUID_SysKeyboard, &m_pKeyboard, 0)))
{
CleanUp();
return E_FAIL;
}
//设置键盘数据格式
if(FAILED(m_pKeyboard->SetDataFormat(&c_dfDIKeyboard)))
{
CleanUp();
return E_FAIL;
}
//设置键盘协调级别
if(FAILED(m_pKeyboard->SetCooperativeLevel(hWnd, keyboardCoopFlags)))
{
CleanUp();
return E_FAIL;
}
//获取键盘
if(FAILED(m_pKeyboard->Acquire()))
{
CleanUp();
return E_FAIL;
}
//创建鼠标
if(FAILED(m_pDInput->CreateDevice(GUID_SysMouse, &m_pMouse, 0)))
{
CleanUp();
return E_FAIL;
}
//设置鼠标数据格式
if(FAILED(m_pMouse->SetDataFormat(&c_dfDIMouse2)))
{
CleanUp();
return E_FAIL;
}
//设置鼠标协调级别
if(m_pMouse->SetCooperativeLevel(hWnd, mouseCoopFlags))
{
CleanUp();
return E_FAIL;
}
//获取鼠标
if(FAILED(m_pMouse->Acquire()))
{
CleanUp();
return E_FAIL;
}
return S_OK;
}
void CGameInput::Update()
{
//保存键盘上一状态
for(int i = 0; i < 256; i++)
{
m_PrevKeyboardState[i] = m_CurrKeyboardState[i];
}
//获取键盘输入
HRESULT hr = m_pKeyboard->GetDeviceState(sizeof(m_CurrKeyboardState), (void**)&m_CurrKeyboardState);
if( FAILED(hr) )
{
//键盘丢失 清空键盘数据
ZeroMemory(m_CurrKeyboardState, sizeof(m_CurrKeyboardState));
//再次获取键盘
hr = m_pKeyboard->Acquire();
}
//保存键盘上一状态
m_PrevMouseState = m_CurrMouseState;
//获取鼠标输入
hr = m_pMouse->GetDeviceState(sizeof(DIMOUSESTATE2), (void**)&m_CurrMouseState);
if( FAILED(hr) )
{
//鼠标丢失 清空鼠标数据
ZeroMemory(&m_CurrMouseState, sizeof(m_CurrMouseState));
//再次获取鼠标
hr = m_pMouse->Acquire();
}
}
bool CGameInput::KeyDown(char key)
{
return (m_CurrKeyboardState[key] & 0x80) != 0;
}
bool CGameInput::MouseButtonDown(int button)
{
return (m_CurrMouseState.rgbButtons[button] & 0x80) != 0;
}
bool CGameInput::KeyClicked(char key)
{
return ((m_CurrKeyboardState[key] & 0x80) != 0 && (m_PrevKeyboardState[key] & 0x80) == 0);
}
bool CGameInput::MouseButtonClicked(int button)
{
return ((m_CurrMouseState.rgbButtons[button] & 0x80) != 0 && (m_PrevMouseState.rgbButtons[button] & 0x80) == 0);
}
float CGameInput::MouseDX()
{
return (float)m_CurrMouseState.lX;
}
float CGameInput::MouseDY()
{
return (float)m_CurrMouseState.lY;
}
float CGameInput::MouseDZ()
{
return (float)m_CurrMouseState.lZ;
}
void CGameInput::CleanUp()
{
SafeRelease(m_pDInput);
m_pKeyboard->Unacquire();
m_pMouse->Unacquire();
SafeRelease(m_pKeyboard);
SafeRelease(m_pMouse);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -