Magic_Game/core/Base/Input.cpp

157 lines
2.8 KiB
C++
Raw Normal View History

2018-04-21 21:24:46 +08:00
#include "..\e2dbase.h"
#include "..\e2dtool.h"
#include "..\e2dmanager.h"
2018-01-30 16:45:38 +08:00
#pragma comment(lib, "dinput8.lib")
2018-07-04 15:33:09 +08:00
e2d::Input::Input()
: _directInput(false)
, _keyboardDevice(false)
, _mouseDevice(false)
2018-01-30 16:45:38 +08:00
{
2018-07-04 15:33:09 +08:00
CoInitialize(nullptr);
2018-07-17 22:16:56 +08:00
ZeroMemory(_keyBuffer, sizeof(_keyBuffer));
2018-07-04 15:33:09 +08:00
ZeroMemory(&_mouseState, sizeof(_mouseState));
2018-01-30 16:45:38 +08:00
// <20><>ʼ<EFBFBD><CABC><EFBFBD>ӿڶ<D3BF><DAB6><EFBFBD>
HRESULT hr = DirectInput8Create(
HINST_THISCOMPONENT,
DIRECTINPUT_VERSION,
IID_IDirectInput8,
2018-07-04 15:33:09 +08:00
(void**)&_directInput,
2018-02-01 22:07:44 +08:00
nullptr
2018-01-30 16:45:38 +08:00
);
2018-07-04 15:33:09 +08:00
}
2018-01-30 16:45:38 +08:00
2018-07-04 15:33:09 +08:00
e2d::Input::~Input()
{
if (_keyboardDevice)
_keyboardDevice->Unacquire();
if (_mouseDevice)
_mouseDevice->Unacquire();
SafeRelease(_mouseDevice);
SafeRelease(_keyboardDevice);
SafeRelease(_directInput);
CoUninitialize();
2018-01-30 16:45:38 +08:00
}
2018-08-19 15:11:20 +08:00
void e2d::Input::initWithWindow(Window * window)
{
HWND hwnd = window->getHWnd();
2018-08-15 00:06:03 +08:00
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ThrowIfFailed(
_directInput->CreateDevice(
GUID_SysKeyboard,
&_keyboardDevice,
nullptr
)
);
_keyboardDevice->SetCooperativeLevel(hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
_keyboardDevice->SetDataFormat(&c_dfDIKeyboard);
_keyboardDevice->Acquire();
_keyboardDevice->Poll();
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ThrowIfFailed(
_directInput->CreateDevice(
GUID_SysMouse,
&_mouseDevice,
nullptr
)
);
_mouseDevice->SetCooperativeLevel(hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
_mouseDevice->SetDataFormat(&c_dfDIMouse);
_mouseDevice->Acquire();
_mouseDevice->Poll();
}
void e2d::Input::update()
2018-01-30 16:45:38 +08:00
{
2018-07-04 15:33:09 +08:00
if (_keyboardDevice)
2018-01-30 16:45:38 +08:00
{
2018-07-04 15:33:09 +08:00
HRESULT hr = _keyboardDevice->Poll();
2018-01-30 16:45:38 +08:00
if (FAILED(hr))
{
2018-07-04 15:33:09 +08:00
hr = _keyboardDevice->Acquire();
2018-01-30 16:45:38 +08:00
while (hr == DIERR_INPUTLOST)
2018-07-04 15:33:09 +08:00
hr = _keyboardDevice->Acquire();
2018-01-30 16:45:38 +08:00
}
else
{
2018-07-17 22:16:56 +08:00
_keyboardDevice->GetDeviceState(sizeof(_keyBuffer), (void**)&_keyBuffer);
2018-01-30 16:45:38 +08:00
}
}
2018-07-04 15:33:09 +08:00
if (_mouseDevice)
2018-01-30 16:45:38 +08:00
{
2018-07-04 15:33:09 +08:00
HRESULT hr = _mouseDevice->Poll();
2018-01-30 16:45:38 +08:00
if (FAILED(hr))
{
2018-07-04 15:33:09 +08:00
hr = _mouseDevice->Acquire();
2018-01-30 16:45:38 +08:00
while (hr == DIERR_INPUTLOST)
2018-07-04 15:33:09 +08:00
hr = _mouseDevice->Acquire();
2018-01-30 16:45:38 +08:00
}
else
{
2018-07-04 15:33:09 +08:00
_mouseDevice->GetDeviceState(sizeof(_mouseState), (void**)&_mouseState);
2018-01-30 16:45:38 +08:00
}
}
}
bool e2d::Input::isDown(KeyCode key)
2018-01-30 16:45:38 +08:00
{
2018-07-17 22:16:56 +08:00
if (_keyBuffer[static_cast<int>(key)] & 0x80)
2018-01-30 16:45:38 +08:00
return true;
return false;
}
bool e2d::Input::isDown(MouseCode code)
2018-01-30 16:45:38 +08:00
{
2018-07-04 15:33:09 +08:00
if (_mouseState.rgbButtons[static_cast<int>(code)] & 0x80)
2018-01-30 16:45:38 +08:00
return true;
return false;
}
float e2d::Input::getMouseX()
2018-01-30 16:45:38 +08:00
{
return getMousePos().x;
2018-01-30 16:45:38 +08:00
}
float e2d::Input::getMouseY()
2018-01-30 16:45:38 +08:00
{
return getMousePos().y;
2018-01-30 16:45:38 +08:00
}
e2d::Point e2d::Input::getMousePos()
2018-01-30 16:45:38 +08:00
{
auto window = Game::getInstance()->getWindow();
2018-07-17 22:16:56 +08:00
POINT mousePos;
2018-07-28 22:22:58 +08:00
::GetCursorPos(&mousePos);
::ScreenToClient(window->getHWnd(), &mousePos);
2018-07-17 23:59:21 +08:00
float dpi = window->getDpi();
2018-07-28 22:22:58 +08:00
return Point(mousePos.x * 96.f / dpi, mousePos.y * 96.f / dpi);
2018-01-30 16:45:38 +08:00
}
float e2d::Input::getMouseDeltaX()
2018-01-30 16:45:38 +08:00
{
2018-07-28 20:06:27 +08:00
return (float)_mouseState.lX;
2018-01-30 16:45:38 +08:00
}
float e2d::Input::getMouseDeltaY()
2018-01-30 16:45:38 +08:00
{
2018-07-28 20:06:27 +08:00
return (float)_mouseState.lY;
2018-01-30 16:45:38 +08:00
}
float e2d::Input::getMouseDeltaZ()
2018-01-30 16:45:38 +08:00
{
2018-07-28 20:06:27 +08:00
return (float)_mouseState.lZ;
}