| 
									
										
										
										
											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-08-28 00:06:10 +08:00
										 |  |  |  | e2d::Input * e2d::Input::_instance = nullptr; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | e2d::Input * e2d::Input::getInstance() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	if (!_instance) | 
					
						
							|  |  |  |  | 		_instance = new (std::nothrow) Input; | 
					
						
							|  |  |  |  | 	return _instance; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::Input::destroyInstance() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	if (_instance) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		delete _instance; | 
					
						
							|  |  |  |  | 		_instance = nullptr; | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-09-02 14:03:04 +08:00
										 |  |  |  | 	::CoInitialize(nullptr); | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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>
 | 
					
						
							| 
									
										
										
										
											2018-08-28 00:06:10 +08:00
										 |  |  |  | 	ThrowIfFailed( | 
					
						
							|  |  |  |  | 		DirectInput8Create( | 
					
						
							|  |  |  |  | 			HINST_THISCOMPONENT, | 
					
						
							|  |  |  |  | 			DIRECTINPUT_VERSION, | 
					
						
							|  |  |  |  | 			IID_IDirectInput8, | 
					
						
							|  |  |  |  | 			(void**)&_directInput, | 
					
						
							|  |  |  |  | 			nullptr | 
					
						
							|  |  |  |  | 		) | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 	); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-28 00:06:10 +08:00
										 |  |  |  | 	HWND hwnd = Window::getInstance()->getHWnd(); | 
					
						
							| 
									
										
										
										
											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-08-28 00:06:10 +08:00
										 |  |  |  | e2d::Input::~Input() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	if (_keyboardDevice) | 
					
						
							|  |  |  |  | 		_keyboardDevice->Unacquire(); | 
					
						
							|  |  |  |  | 	if (_mouseDevice) | 
					
						
							|  |  |  |  | 		_mouseDevice->Unacquire(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	SafeRelease(_mouseDevice); | 
					
						
							|  |  |  |  | 	SafeRelease(_keyboardDevice); | 
					
						
							|  |  |  |  | 	SafeRelease(_directInput); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-02 14:03:04 +08:00
										 |  |  |  | 	::CoUninitialize(); | 
					
						
							| 
									
										
										
										
											2018-08-28 00:06:10 +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:51 +08:00
										 |  |  |  | float e2d::Input::getMouseX() | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-08-23 16:37:51 +08:00
										 |  |  |  | 	return getMousePos().x; | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-23 16:37:51 +08:00
										 |  |  |  | float e2d::Input::getMouseY() | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-08-23 16:37:51 +08:00
										 |  |  |  | 	return getMousePos().y; | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-23 16:37:51 +08:00
										 |  |  |  | e2d::Point e2d::Input::getMousePos() | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-08-28 00:06:10 +08:00
										 |  |  |  | 	auto window = Window::getInstance(); | 
					
						
							|  |  |  |  | 	float dpi = window->getDpi(); | 
					
						
							| 
									
										
										
										
											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:51 +08:00
										 |  |  |  | 	::ScreenToClient(window->getHWnd(), &mousePos); | 
					
						
							| 
									
										
										
										
											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:51 +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
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-23 16:37:51 +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
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-23 16:37:51 +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; | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | } |