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)
|
2018-03-11 23:56:40 +08:00
|
|
|
|
{
|
2018-08-23 16:37:44 +08:00
|
|
|
|
HWND hwnd = window->hWnd();
|
2018-03-11 23:56:40 +08:00
|
|
|
|
|
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();
|
2018-03-11 23:56:40 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-07-05 22:05:23 +08:00
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-07-16 22:11:27 +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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-07-16 22:11:27 +08:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-08-23 16:37:44 +08:00
|
|
|
|
float e2d::Input::mouseX()
|
2018-01-30 16:45:38 +08:00
|
|
|
|
{
|
2018-08-23 16:37:44 +08:00
|
|
|
|
return mousePos().x;
|
2018-01-30 16:45:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-08-23 16:37:44 +08:00
|
|
|
|
float e2d::Input::mouseY()
|
2018-01-30 16:45:38 +08:00
|
|
|
|
{
|
2018-08-23 16:37:44 +08:00
|
|
|
|
return mousePos().y;
|
2018-01-30 16:45:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-08-23 16:37:44 +08:00
|
|
|
|
e2d::Point e2d::Input::mousePos()
|
2018-01-30 16:45:38 +08:00
|
|
|
|
{
|
2018-08-23 16:37:44 +08:00
|
|
|
|
auto window = Game::instance()->window();
|
2018-07-24 00:24:29 +08:00
|
|
|
|
|
2018-07-17 22:16:56 +08:00
|
|
|
|
POINT mousePos;
|
2018-07-28 22:22:58 +08:00
|
|
|
|
::GetCursorPos(&mousePos);
|
2018-08-23 16:37:44 +08:00
|
|
|
|
::ScreenToClient(window->hWnd(), &mousePos);
|
2018-07-17 23:59:21 +08:00
|
|
|
|
|
2018-08-23 16:37:44 +08:00
|
|
|
|
float dpi = window->dpi();
|
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
|
|
|
|
}
|
|
|
|
|
|
|
2018-08-23 16:37:44 +08:00
|
|
|
|
float e2d::Input::mouseDeltaX()
|
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
|
|
|
|
}
|
|
|
|
|
|
|
2018-08-23 16:37:44 +08:00
|
|
|
|
float e2d::Input::mouseDeltaY()
|
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
|
|
|
|
}
|
|
|
|
|
|
|
2018-08-23 16:37:44 +08:00
|
|
|
|
float e2d::Input::mouseDeltaZ()
|
2018-01-30 16:45:38 +08:00
|
|
|
|
{
|
2018-07-28 20:06:27 +08:00
|
|
|
|
return (float)_mouseState.lZ;
|
2018-05-22 00:36:03 +08:00
|
|
|
|
}
|