| 
									
										
										
										
											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-05-14 22:51:40 +08:00
										 |  |  |  | #define BUFFER_SIZE	256
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-17 23:53:27 +08:00
										 |  |  |  | static char s_KeyBuffer[BUFFER_SIZE] = { 0 };			// <20><><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰<EFBFBD><CCB0><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | static char s_KeyRecordBuffer[BUFFER_SIZE] = { 0 };		// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | static std::vector<e2d::Listener*> s_vListeners;		// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | e2d::Input * e2d::Input::_instance = nullptr; | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | e2d::Input::Input() | 
					
						
							|  |  |  |  | 	: _directInput(false) | 
					
						
							|  |  |  |  | 	, _keyboardDevice(false) | 
					
						
							|  |  |  |  | 	, _mouseDevice(false) | 
					
						
							|  |  |  |  | 	, _mouseState() | 
					
						
							|  |  |  |  | 	, _mouseStateRecord() | 
					
						
							|  |  |  |  | 	, _mousePos() | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | 	CoInitialize(nullptr); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-07-04 15:33:09 +08:00
										 |  |  |  | 	ZeroMemory(&_mouseState, sizeof(_mouseState)); | 
					
						
							|  |  |  |  | 	ZeroMemory(&_mouseStateRecord, sizeof(_mouseStateRecord)); | 
					
						
							| 
									
										
										
										
											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-03 18:16:26 +08:00
										 |  |  |  | 	auto window = Window::getInstance(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 	if (SUCCEEDED(hr)) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸
 | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | 		hr = _directInput->CreateDevice( | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 			GUID_SysKeyboard, | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | 			&_keyboardDevice, | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  |  | 			nullptr | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 		); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		if (SUCCEEDED(hr)) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | 			_keyboardDevice->SetCooperativeLevel( | 
					
						
							| 
									
										
										
										
											2018-07-03 18:16:26 +08:00
										 |  |  |  | 				window->getHWnd(), | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 				DISCL_FOREGROUND | DISCL_NONEXCLUSIVE | 
					
						
							|  |  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | 			_keyboardDevice->SetDataFormat( | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 				&c_dfDIKeyboard); | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | 			_keyboardDevice->Acquire(); | 
					
						
							|  |  |  |  | 			_keyboardDevice->Poll(); | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 		} | 
					
						
							|  |  |  |  | 		else | 
					
						
							|  |  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | 			throw SystemException(L"Keyboard not found!"); | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	if (SUCCEEDED(hr)) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸
 | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | 		hr = _directInput->CreateDevice(GUID_SysMouse, &_mouseDevice, nullptr); | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 		if (SUCCEEDED(hr)) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | 			_mouseDevice->SetCooperativeLevel(window->getHWnd(), DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); | 
					
						
							|  |  |  |  | 			_mouseDevice->SetDataFormat(&c_dfDIMouse); | 
					
						
							|  |  |  |  | 			_mouseDevice->Acquire(); | 
					
						
							|  |  |  |  | 			_mouseDevice->Poll(); | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 		} | 
					
						
							|  |  |  |  | 		else | 
					
						
							|  |  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | 			throw SystemException(L"Mouse not found!"); | 
					
						
							| 
									
										
										
										
											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-07-04 15:33:09 +08:00
										 |  |  |  | e2d::Input * e2d::Input::getInstance() | 
					
						
							| 
									
										
										
										
											2018-03-11 23:56:40 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | 	if (!_instance) | 
					
						
							|  |  |  |  | 		_instance = new (std::nothrow) Input; | 
					
						
							|  |  |  |  | 	return _instance; | 
					
						
							|  |  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-03-11 23:56:40 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | void e2d::Input::destroyInstance() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	if (_instance) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		delete _instance; | 
					
						
							|  |  |  |  | 		_instance = nullptr; | 
					
						
							|  |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-03-11 23:56:40 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-05 22:05:23 +08:00
										 |  |  |  | void e2d::Input::update() | 
					
						
							| 
									
										
										
										
											2018-03-11 23:56:40 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	Input::__updateDeviceState(); | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | 	Input::__updateListeners(); | 
					
						
							| 
									
										
										
										
											2018-03-11 23:56:40 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | void e2d::Input::__updateDeviceState() | 
					
						
							| 
									
										
										
										
											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-05-14 22:51:40 +08:00
										 |  |  |  | 			for (int i = 0; i < BUFFER_SIZE; ++i) | 
					
						
							| 
									
										
										
										
											2018-02-02 10:06:29 +08:00
										 |  |  |  | 				s_KeyRecordBuffer[i] = s_KeyBuffer[i]; | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | 			_keyboardDevice->GetDeviceState(sizeof(s_KeyBuffer), (void**)&s_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
										 |  |  |  | 			_mouseStateRecord = _mouseState; | 
					
						
							|  |  |  |  | 			_mouseDevice->GetDeviceState(sizeof(_mouseState), (void**)&_mouseState); | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | 	GetCursorPos(&_mousePos); | 
					
						
							|  |  |  |  | 	ScreenToClient(Window::getInstance()->getHWnd(), &_mousePos); | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | bool e2d::Input::isDown(Key key) | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-04-24 21:22:34 +08:00
										 |  |  |  | 	if (s_KeyBuffer[static_cast<int>(key)] & 0x80) | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 		return true; | 
					
						
							|  |  |  |  | 	return false; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | bool e2d::Input::isPress(Key key) | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-04-24 21:22:34 +08:00
										 |  |  |  | 	if ((s_KeyBuffer[static_cast<int>(key)] & 0x80) &&  | 
					
						
							|  |  |  |  | 		!(s_KeyRecordBuffer[static_cast<int>(key)] & 0x80)) | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 		return true; | 
					
						
							|  |  |  |  | 	return false; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | bool e2d::Input::isRelease(Key key) | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-04-24 21:22:34 +08:00
										 |  |  |  | 	if (!(s_KeyBuffer[static_cast<int>(key)] & 0x80) &&  | 
					
						
							|  |  |  |  | 		(s_KeyRecordBuffer[static_cast<int>(key)] & 0x80)) | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 		return true; | 
					
						
							|  |  |  |  | 	return false; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-18 23:56:36 +08:00
										 |  |  |  | bool e2d::Input::isDown(Mouse 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-05-18 23:56:36 +08:00
										 |  |  |  | bool e2d::Input::isPress(Mouse 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) &&  | 
					
						
							|  |  |  |  | 		!(_mouseStateRecord.rgbButtons[static_cast<int>(code)] & 0x80)) | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 		return true; | 
					
						
							|  |  |  |  | 	return false; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-18 23:56:36 +08:00
										 |  |  |  | bool e2d::Input::isRelease(Mouse 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) &&  | 
					
						
							|  |  |  |  | 		(_mouseStateRecord.rgbButtons[static_cast<int>(code)] & 0x80)) | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | 		return true; | 
					
						
							|  |  |  |  | 	return false; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | double e2d::Input::getMouseX() | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | 	return (double)_mousePos.x; | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | double e2d::Input::getMouseY() | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | 	return (double)_mousePos.y; | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | e2d::Point e2d::Input::getMousePos() | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | 	return Point((double)_mousePos.x, (double)_mousePos.y); | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | double e2d::Input::getMouseDeltaX() | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | 	return (double)_mouseState.lX; | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | double e2d::Input::getMouseDeltaY() | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | 	return (double)_mouseState.lY; | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | double e2d::Input::getMouseDeltaZ() | 
					
						
							| 
									
										
										
										
											2018-01-30 16:45:38 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-07-04 15:33:09 +08:00
										 |  |  |  | 	return (double)_mouseState.lZ; | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-22 21:21:04 +08:00
										 |  |  |  | e2d::Listener * e2d::Input::addListener(const Function& func, const String& name, bool paused) | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-07-06 12:59:32 +08:00
										 |  |  |  | 	auto listener = new (e2d::autorelease) Listener(func, name, paused); | 
					
						
							| 
									
										
										
										
											2018-07-06 00:47:50 +08:00
										 |  |  |  | 	listener->retain(); | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | 	s_vListeners.push_back(listener); | 
					
						
							| 
									
										
										
										
											2018-05-22 21:21:04 +08:00
										 |  |  |  | 	return listener; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::Input::addListener(Listener * listener) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	if (listener) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		auto iter = std::find(s_vListeners.begin(), s_vListeners.end(), listener); | 
					
						
							|  |  |  |  | 		if (iter == s_vListeners.end()) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2018-07-06 00:47:50 +08:00
										 |  |  |  | 			listener->retain(); | 
					
						
							| 
									
										
										
										
											2018-05-22 21:21:04 +08:00
										 |  |  |  | 			s_vListeners.push_back(listener); | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::Input::removeListener(Listener * listener) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	if (listener) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		auto iter = std::find(s_vListeners.begin(), s_vListeners.end(), listener); | 
					
						
							|  |  |  |  | 		if (iter != s_vListeners.end()) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2018-07-06 00:47:50 +08:00
										 |  |  |  | 			GC::safeRelease(listener); | 
					
						
							| 
									
										
										
										
											2018-05-22 21:21:04 +08:00
										 |  |  |  | 			s_vListeners.erase(iter); | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-22 15:54:01 +08:00
										 |  |  |  | void e2d::Input::stopListener(const String& name) | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	if (s_vListeners.empty() || name.isEmpty()) | 
					
						
							|  |  |  |  | 		return; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	for (auto listener : s_vListeners) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		if (listener->_name == name) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2018-05-22 15:54:01 +08:00
										 |  |  |  | 			listener->stop(); | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-22 15:54:01 +08:00
										 |  |  |  | void e2d::Input::startListener(const String& name) | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	if (s_vListeners.empty() || name.isEmpty()) | 
					
						
							|  |  |  |  | 		return; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	for (auto listener : s_vListeners) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		if (listener->_name == name) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2018-05-22 15:54:01 +08:00
										 |  |  |  | 			listener->start(); | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-22 21:21:04 +08:00
										 |  |  |  | void e2d::Input::removeListener(const String& name) | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	if (s_vListeners.empty() || name.isEmpty()) | 
					
						
							|  |  |  |  | 		return; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	for (auto listener : s_vListeners) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		if (listener->_name == name) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			listener->_stopped = true; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-22 15:54:01 +08:00
										 |  |  |  | void e2d::Input::stopAllListeners() | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	for (auto listener : s_vListeners) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-05-22 15:54:01 +08:00
										 |  |  |  | 		listener->stop(); | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-22 15:54:01 +08:00
										 |  |  |  | void e2d::Input::startAllListeners() | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	for (auto listener : s_vListeners) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-05-22 15:54:01 +08:00
										 |  |  |  | 		listener->start(); | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-22 21:21:04 +08:00
										 |  |  |  | void e2d::Input::removeAllListeners() | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | { | 
					
						
							|  |  |  |  | 	for (auto listener : s_vListeners) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-07-05 22:05:23 +08:00
										 |  |  |  | 		listener->_stopped = true; | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::Input::clearAllListeners() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	for (auto listener : s_vListeners) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		listener->release(); | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-07-05 16:34:53 +08:00
										 |  |  |  | 	s_vListeners.clear(); | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void e2d::Input::__updateListeners() | 
					
						
							|  |  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-07-03 01:49:20 +08:00
										 |  |  |  | 	if (s_vListeners.empty() || Game::getInstance()->isPaused()) | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | 		return; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	for (size_t i = 0; i < s_vListeners.size(); ++i) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		auto listener = s_vListeners[i]; | 
					
						
							|  |  |  |  | 		// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ<CDA3>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 		if (listener->_stopped) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2018-07-06 00:47:50 +08:00
										 |  |  |  | 			GC::safeRelease(listener); | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | 			s_vListeners.erase(s_vListeners.begin() + i); | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 		else | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			// <20><><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2018-05-22 15:54:01 +08:00
										 |  |  |  | 			listener->_update(); | 
					
						
							| 
									
										
										
										
											2018-05-22 00:36:03 +08:00
										 |  |  |  | 			++i; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } |