Magic_Game/core/Base/Input.cpp

257 lines
5.3 KiB
C++
Raw Normal View History

2018-01-30 16:45:38 +08:00
#include "..\ebase.h"
#include "..\etools.h"
#include "..\emanagers.h"
2018-01-30 16:45:38 +08:00
#pragma comment(lib, "dinput8.lib")
#pragma comment(lib, "dxguid.lib")
using namespace e2d;
static IDirectInput8* s_pDirectInput = nullptr; // DirectInput <20>ӿڶ<D3BF><DAB6><EFBFBD>
static IDirectInputDevice8* s_KeyboardDevice = nullptr; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
static char s_KeyBuffer[256] = { 0 }; // <20><><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰<EFBFBD><CCB0><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-02-02 10:06:29 +08:00
static char s_KeyRecordBuffer[256] = { 0 }; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-01-30 16:45:38 +08:00
static IDirectInputDevice8* s_MouseDevice = nullptr; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
static DIMOUSESTATE s_MouseState; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><E1B9B9>
2018-02-02 10:06:29 +08:00
static DIMOUSESTATE s_MouseRecordState; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-01-30 16:45:38 +08:00
static POINT s_MousePosition; // <20><><EFBFBD><EFBFBD>λ<EFBFBD>ô洢<C3B4><EFBFBD><E1B9B9>
bool Input::__init()
2018-01-30 16:45:38 +08:00
{
ZeroMemory(s_KeyBuffer, sizeof(s_KeyBuffer));
2018-02-02 10:06:29 +08:00
ZeroMemory(s_KeyRecordBuffer, sizeof(s_KeyRecordBuffer));
2018-01-30 16:45:38 +08:00
ZeroMemory(&s_MouseState, sizeof(s_MouseState));
2018-02-02 10:06:29 +08:00
ZeroMemory(&s_MouseRecordState, sizeof(s_MouseRecordState));
2018-01-30 16:45:38 +08:00
// <20><>ʼ<EFBFBD><CABC><EFBFBD>ӿڶ<D3BF><DAB6><EFBFBD>
HRESULT hr = DirectInput8Create(
HINST_THISCOMPONENT,
DIRECTINPUT_VERSION,
IID_IDirectInput8,
(void**)&s_pDirectInput,
2018-02-01 22:07:44 +08:00
nullptr
2018-01-30 16:45:38 +08:00
);
if (SUCCEEDED(hr))
{
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
hr = s_pDirectInput->CreateDevice(
GUID_SysKeyboard,
&s_KeyboardDevice,
2018-02-01 22:07:44 +08:00
nullptr
2018-01-30 16:45:38 +08:00
);
if (SUCCEEDED(hr))
{
s_KeyboardDevice->SetCooperativeLevel(
Window::getHWnd(),
2018-01-30 16:45:38 +08:00
DISCL_FOREGROUND | DISCL_NONEXCLUSIVE
);
s_KeyboardDevice->SetDataFormat(
&c_dfDIKeyboard);
s_KeyboardDevice->Acquire();
s_KeyboardDevice->Poll();
}
else
{
2018-03-06 09:56:17 +08:00
MessageBox(nullptr, L"Keyboard not found!", L"Error", MB_ICONERROR | MB_OK);
Game::quit();
2018-01-30 16:45:38 +08:00
return false;
}
}
if (SUCCEEDED(hr))
{
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-02-01 22:07:44 +08:00
hr = s_pDirectInput->CreateDevice(GUID_SysMouse, &s_MouseDevice, nullptr);
2018-01-30 16:45:38 +08:00
if (SUCCEEDED(hr))
{
s_MouseDevice->SetCooperativeLevel(Window::getHWnd(), DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
2018-01-30 16:45:38 +08:00
s_MouseDevice->SetDataFormat(&c_dfDIMouse);
s_MouseDevice->Acquire();
s_MouseDevice->Poll();
}
else
{
2018-03-06 09:56:17 +08:00
MessageBox(nullptr, L"Mouse not found!", L"Error", MB_ICONERROR | MB_OK);
2018-01-30 16:45:38 +08:00
return false;
}
}
return SUCCEEDED(hr);
}
void Input::__uninit()
{
if (s_KeyboardDevice)
s_KeyboardDevice->Unacquire();
if (s_MouseDevice)
s_MouseDevice->Unacquire();
SafeReleaseInterface(&s_MouseDevice);
SafeReleaseInterface(&s_KeyboardDevice);
SafeReleaseInterface(&s_pDirectInput);
}
void e2d::Input::__update()
{
Input::__updateDeviceState();
InputManager::__update();
}
void Input::__updateDeviceState()
2018-01-30 16:45:38 +08:00
{
if (s_KeyboardDevice)
{
HRESULT hr = s_KeyboardDevice->Poll();
if (FAILED(hr))
{
hr = s_KeyboardDevice->Acquire();
while (hr == DIERR_INPUTLOST)
hr = s_KeyboardDevice->Acquire();
}
else
{
for (int i = 0; i < 256; i++)
2018-02-02 10:06:29 +08:00
s_KeyRecordBuffer[i] = s_KeyBuffer[i];
2018-01-30 16:45:38 +08:00
s_KeyboardDevice->GetDeviceState(sizeof(s_KeyBuffer), (void**)&s_KeyBuffer);
}
}
if (s_MouseDevice)
{
HRESULT hr = s_MouseDevice->Poll();
if (FAILED(hr))
{
hr = s_MouseDevice->Acquire();
while (hr == DIERR_INPUTLOST)
hr = s_MouseDevice->Acquire();
}
else
{
2018-02-02 10:06:29 +08:00
s_MouseRecordState = s_MouseState;
2018-01-30 16:45:38 +08:00
s_MouseDevice->GetDeviceState(sizeof(s_MouseState), (void**)&s_MouseState);
}
}
GetCursorPos(&s_MousePosition);
ScreenToClient(Window::getHWnd(), &s_MousePosition);
2018-01-30 16:45:38 +08:00
}
bool Input::isKeyDown(int nKeyCode)
2018-01-30 16:45:38 +08:00
{
if (s_KeyBuffer[nKeyCode] & 0x80)
return true;
return false;
}
bool Input::isKeyPress(int nKeyCode)
2018-01-30 16:45:38 +08:00
{
2018-02-02 10:06:29 +08:00
if ((s_KeyBuffer[nKeyCode] & 0x80) && !(s_KeyRecordBuffer[nKeyCode] & 0x80))
2018-01-30 16:45:38 +08:00
return true;
return false;
}
bool Input::isKeyRelease(int nKeyCode)
2018-01-30 16:45:38 +08:00
{
2018-02-02 10:06:29 +08:00
if (!(s_KeyBuffer[nKeyCode] & 0x80) && (s_KeyRecordBuffer[nKeyCode] & 0x80))
2018-01-30 16:45:38 +08:00
return true;
return false;
}
bool Input::isMouseLButtonDown()
2018-01-30 16:45:38 +08:00
{
if (s_MouseState.rgbButtons[0] & 0x80)
return true;
return false;
}
bool Input::isMouseRButtonDown()
2018-01-30 16:45:38 +08:00
{
if (s_MouseState.rgbButtons[1] & 0x80)
return true;
return false;
}
bool Input::isMouseMButtonDown()
2018-01-30 16:45:38 +08:00
{
if (s_MouseState.rgbButtons[2] & 0x80)
return true;
return false;
}
bool Input::isMouseLButtonPress()
2018-01-30 16:45:38 +08:00
{
2018-02-02 10:06:29 +08:00
if ((s_MouseState.rgbButtons[0] & 0x80) && !(s_MouseRecordState.rgbButtons[0] & 0x80))
2018-01-30 16:45:38 +08:00
return true;
return false;
}
bool Input::isMouseRButtonPress()
2018-01-30 16:45:38 +08:00
{
2018-02-02 10:06:29 +08:00
if ((s_MouseState.rgbButtons[1] & 0x80) && !(s_MouseRecordState.rgbButtons[1] & 0x80))
2018-01-30 16:45:38 +08:00
return true;
return false;
}
bool Input::isMouseMButtonPress()
2018-01-30 16:45:38 +08:00
{
2018-02-02 10:06:29 +08:00
if ((s_MouseState.rgbButtons[2] & 0x80) && !(s_MouseRecordState.rgbButtons[2] & 0x80))
2018-01-30 16:45:38 +08:00
return true;
return false;
}
bool Input::isMouseLButtonRelease()
2018-01-30 16:45:38 +08:00
{
2018-02-02 10:06:29 +08:00
if (!(s_MouseState.rgbButtons[0] & 0x80) && (s_MouseRecordState.rgbButtons[0] & 0x80))
2018-01-30 16:45:38 +08:00
return true;
return false;
}
bool Input::isMouseRButtonRelease()
2018-01-30 16:45:38 +08:00
{
2018-02-02 10:06:29 +08:00
if (!(s_MouseState.rgbButtons[1] & 0x80) && (s_MouseRecordState.rgbButtons[1] & 0x80))
2018-01-30 16:45:38 +08:00
return true;
return false;
}
bool Input::isMouseMButtonRelease()
2018-01-30 16:45:38 +08:00
{
2018-02-02 10:06:29 +08:00
if (!(s_MouseState.rgbButtons[2] & 0x80) && (s_MouseRecordState.rgbButtons[2] & 0x80))
2018-01-30 16:45:38 +08:00
return true;
return false;
}
2018-02-27 21:07:43 +08:00
double Input::getMouseX()
2018-01-30 16:45:38 +08:00
{
2018-02-27 21:07:43 +08:00
return (double)s_MousePosition.x;
2018-01-30 16:45:38 +08:00
}
2018-02-27 21:07:43 +08:00
double Input::getMouseY()
2018-01-30 16:45:38 +08:00
{
2018-02-27 21:07:43 +08:00
return (double)s_MousePosition.y;
2018-01-30 16:45:38 +08:00
}
Point Input::getMousePos()
2018-01-30 16:45:38 +08:00
{
2018-02-27 21:07:43 +08:00
return Point((double)s_MousePosition.x, (double)s_MousePosition.y);
2018-01-30 16:45:38 +08:00
}
2018-02-27 21:07:43 +08:00
double Input::getMouseDeltaX()
2018-01-30 16:45:38 +08:00
{
2018-02-27 21:07:43 +08:00
return (double)s_MouseState.lX;
2018-01-30 16:45:38 +08:00
}
2018-02-27 21:07:43 +08:00
double Input::getMouseDeltaY()
2018-01-30 16:45:38 +08:00
{
2018-02-27 21:07:43 +08:00
return (double)s_MouseState.lY;
2018-01-30 16:45:38 +08:00
}
2018-02-27 21:07:43 +08:00
double Input::getMouseDeltaZ()
2018-01-30 16:45:38 +08:00
{
2018-02-27 21:07:43 +08:00
return (double)s_MouseState.lZ;
2018-01-30 16:45:38 +08:00
}