增加按键消息、鼠标消息、碰撞消息
This commit is contained in:
		
							parent
							
								
									f6d044def0
								
							
						
					
					
						commit
						d180c4dd74
					
				|  | @ -58,7 +58,6 @@ e2d::GC::~GC() | |||
| 	Player::destroyInstance(); | ||||
| 	SceneManager::destroyInstance(); | ||||
| 	ActionManager::destroyInstance(); | ||||
| 	InputManager::destroyInstance(); | ||||
| 	CollisionManager::destroyInstance(); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -44,7 +44,6 @@ void e2d::Game::start(bool cleanup) | |||
| 	auto timer = Timer::getInstance(); | ||||
| 	auto sceneManager = SceneManager::getInstance(); | ||||
| 	auto actionManager = ActionManager::getInstance(); | ||||
| 	auto inputManager = InputManager::getInstance(); | ||||
| 
 | ||||
| 	// 显示窗口
 | ||||
| 	::ShowWindow(window->getHWnd(), SW_SHOWNORMAL); | ||||
|  | @ -75,7 +74,6 @@ void e2d::Game::start(bool cleanup) | |||
| 			input->update();			// 获取用户输入
 | ||||
| 			timer->update();			// 更新定时器
 | ||||
| 			actionManager->update();	// 更新动作管理器
 | ||||
| 			inputManager->update();		// 更新输入监听器
 | ||||
| 			sceneManager->update();		// 更新场景内容
 | ||||
| 			renderer->render();			// 渲染游戏画面
 | ||||
| 			GC::flush();				// 刷新内存池
 | ||||
|  | @ -146,10 +144,6 @@ void e2d::Game::cleanup() | |||
| 	Timer::getInstance()->clearAllTasks(); | ||||
| 	// 清除所有动作
 | ||||
| 	ActionManager::getInstance()->clearAll(); | ||||
| 	// 删除碰撞监听器
 | ||||
| 	CollisionManager::getInstance()->clearAllListeners(); | ||||
| 	// 删除输入监听器
 | ||||
| 	InputManager::getInstance()->clearAllListeners(); | ||||
| 	// 清空图片缓存
 | ||||
| 	Image::clearCache(); | ||||
| 	// 清空音乐缓存
 | ||||
|  |  | |||
|  | @ -151,14 +151,14 @@ void e2d::Input::update() | |||
| 	ScreenToClient(Window::getInstance()->getHWnd(), &_mousePos); | ||||
| } | ||||
| 
 | ||||
| bool e2d::Input::isDown(Key key) | ||||
| bool e2d::Input::isDown(KeyCode key) | ||||
| { | ||||
| 	if (s_KeyBuffer[static_cast<int>(key)] & 0x80) | ||||
| 		return true; | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| bool e2d::Input::isPress(Key key) | ||||
| bool e2d::Input::isPress(KeyCode key) | ||||
| { | ||||
| 	if ((s_KeyBuffer[static_cast<int>(key)] & 0x80) &&  | ||||
| 		!(s_KeyRecordBuffer[static_cast<int>(key)] & 0x80)) | ||||
|  | @ -166,7 +166,7 @@ bool e2d::Input::isPress(Key key) | |||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| bool e2d::Input::isRelease(Key key) | ||||
| bool e2d::Input::isRelease(KeyCode key) | ||||
| { | ||||
| 	if (!(s_KeyBuffer[static_cast<int>(key)] & 0x80) &&  | ||||
| 		(s_KeyRecordBuffer[static_cast<int>(key)] & 0x80)) | ||||
|  | @ -174,14 +174,14 @@ bool e2d::Input::isRelease(Key key) | |||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| bool e2d::Input::isDown(Mouse code) | ||||
| bool e2d::Input::isDown(MouseCode code) | ||||
| { | ||||
| 	if (_mouseState.rgbButtons[static_cast<int>(code)] & 0x80) | ||||
| 		return true; | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| bool e2d::Input::isPress(Mouse code) | ||||
| bool e2d::Input::isPress(MouseCode code) | ||||
| { | ||||
| 	if ((_mouseState.rgbButtons[static_cast<int>(code)] & 0x80) &&  | ||||
| 		!(_mouseStateRecord.rgbButtons[static_cast<int>(code)] & 0x80)) | ||||
|  | @ -189,7 +189,7 @@ bool e2d::Input::isPress(Mouse code) | |||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| bool e2d::Input::isRelease(Mouse code) | ||||
| bool e2d::Input::isRelease(MouseCode code) | ||||
| { | ||||
| 	if (!(_mouseState.rgbButtons[static_cast<int>(code)] & 0x80) &&  | ||||
| 		(_mouseStateRecord.rgbButtons[static_cast<int>(code)] & 0x80)) | ||||
|  |  | |||
|  | @ -90,7 +90,7 @@ HWND e2d::Window::__create() | |||
| 	WNDCLASSEX wcex = { 0 }; | ||||
| 	wcex.cbSize = sizeof(WNDCLASSEX); | ||||
| 	wcex.lpszClassName = L"Easy2DApp"; | ||||
| 	wcex.style = CS_HREDRAW | CS_VREDRAW; | ||||
| 	wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; | ||||
| 	wcex.lpfnWndProc = Window::WndProc; | ||||
| 	wcex.cbClsExtra = 0; | ||||
| 	wcex.cbWndExtra = sizeof(LONG_PTR); | ||||
|  | @ -385,6 +385,35 @@ LRESULT e2d::Window::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar | |||
| 	switch (message) | ||||
| 	{ | ||||
| 
 | ||||
| 	// 处理鼠标消息
 | ||||
| 	case WM_LBUTTONUP: | ||||
| 	case WM_LBUTTONDOWN: | ||||
| 	case WM_LBUTTONDBLCLK: | ||||
| 	case WM_MBUTTONUP: | ||||
| 	case WM_MBUTTONDOWN: | ||||
| 	case WM_MBUTTONDBLCLK: | ||||
| 	case WM_RBUTTONUP: | ||||
| 	case WM_RBUTTONDOWN: | ||||
| 	case WM_RBUTTONDBLCLK: | ||||
| 	case WM_MOUSEMOVE: | ||||
| 	case WM_MOUSEWHEEL: | ||||
| 	{ | ||||
| 		SceneManager::getInstance()->dispatch(MouseEvent(message, wParam, lParam)); | ||||
| 	} | ||||
| 	result = 0; | ||||
| 	hasHandled = true; | ||||
| 	break; | ||||
| 
 | ||||
| 	// 处理按键消息
 | ||||
| 	case WM_KEYDOWN: | ||||
| 	case WM_KEYUP: | ||||
| 	{ | ||||
| 		SceneManager::getInstance()->dispatch(KeyEvent(message, wParam, lParam)); | ||||
| 	} | ||||
| 	result = 0; | ||||
| 	hasHandled = true; | ||||
| 	break; | ||||
| 
 | ||||
| 	// 处理窗口大小变化消息
 | ||||
| 	case WM_SIZE: | ||||
| 	{ | ||||
|  |  | |||
|  | @ -1,34 +0,0 @@ | |||
| #include "..\e2dcommon.h" | ||||
| 
 | ||||
| e2d::Collision::Collision() | ||||
| 	: _active(nullptr) | ||||
| 	, _passive(nullptr) | ||||
| 	, _relation(Collider::Relation::Unknown) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| e2d::Collision::Collision(Node* active, Node* passive, Collider::Relation relation) | ||||
| 	: _active(active) | ||||
| 	, _passive(passive) | ||||
| 	, _relation(relation) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| e2d::Collision::~Collision() | ||||
| { | ||||
| } | ||||
| 
 | ||||
| e2d::Node * e2d::Collision::getActive() const | ||||
| { | ||||
| 	return _active; | ||||
| } | ||||
| 
 | ||||
| e2d::Node * e2d::Collision::getPassive() const | ||||
| { | ||||
| 	return _passive; | ||||
| } | ||||
| 
 | ||||
| e2d::Collider::Relation e2d::Collision::getRelation() const | ||||
| { | ||||
| 	return _relation; | ||||
| } | ||||
|  | @ -8,7 +8,7 @@ e2d::Resource::Resource(const String & fileName) | |||
| { | ||||
| } | ||||
| 
 | ||||
| e2d::Resource::Resource(int resNameId, const String & resType) | ||||
| e2d::Resource::Resource(size_t resNameId, const String & resType) | ||||
| 	: _isResource(true) | ||||
| 	, _fileName() | ||||
| 	, _resNameId(resNameId) | ||||
|  | @ -26,7 +26,7 @@ const e2d::String & e2d::Resource::getFileName() const | |||
| 	return _fileName; | ||||
| } | ||||
| 
 | ||||
| int e2d::Resource::getResNameId() const | ||||
| size_t e2d::Resource::getResNameId() const | ||||
| { | ||||
| 	return _resNameId; | ||||
| } | ||||
|  | @ -36,16 +36,9 @@ const e2d::String & e2d::Resource::getResType() const | |||
| 	return _resType; | ||||
| } | ||||
| 
 | ||||
| int e2d::Resource::getKey() const | ||||
| size_t e2d::Resource::getKey() const | ||||
| { | ||||
| 	if (_isResource) | ||||
| 	{ | ||||
| 		return _resNameId; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		return _fileName.getHashCode(); | ||||
| 	} | ||||
| 	return _isResource ? _resNameId : _fileName.getHashCode(); | ||||
| } | ||||
| 
 | ||||
| bool e2d::Resource::operator>(const Resource &res) const | ||||
|  |  | |||
|  | @ -44,6 +44,22 @@ void e2d::Scene::update() | |||
| 	_root->_update(); | ||||
| } | ||||
| 
 | ||||
| void e2d::Scene::dispatch(const MouseEvent & e) | ||||
| { | ||||
| 	if (this->onMouseEvent(e)) | ||||
| 	{ | ||||
| 		_root->dispatch(e); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::Scene::dispatch(const KeyEvent & e) | ||||
| { | ||||
| 	if (this->onKeyEvent(e)) | ||||
| 	{ | ||||
| 		_root->dispatch(e); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::Scene::setAutoUpdate(bool bAutoUpdate) | ||||
| { | ||||
| 	_autoUpdate = bAutoUpdate; | ||||
|  |  | |||
|  | @ -357,7 +357,7 @@ int e2d::String::getLength() const | |||
| 	return static_cast<int>(_str.size()); | ||||
| } | ||||
| 
 | ||||
| unsigned int e2d::String::getHashCode() const | ||||
| size_t e2d::String::getHashCode() const | ||||
| { | ||||
| 	std::hash<std::wstring> hash; | ||||
| 	return hash(_str); | ||||
|  |  | |||
|  | @ -0,0 +1,27 @@ | |||
| #include "..\e2dcommon.h" | ||||
| 
 | ||||
| e2d::Collision::Collision() | ||||
| 	: _node(nullptr) | ||||
| 	, _relation(Collider::Relation::Unknown) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| e2d::Collision::Collision(Node* node, Collider::Relation relation) | ||||
| 	: _node(node) | ||||
| 	, _relation(relation) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| e2d::Collision::~Collision() | ||||
| { | ||||
| } | ||||
| 
 | ||||
| e2d::Node * e2d::Collision::getNode() const | ||||
| { | ||||
| 	return _node; | ||||
| } | ||||
| 
 | ||||
| e2d::Collider::Relation e2d::Collision::getRelation() const | ||||
| { | ||||
| 	return _relation; | ||||
| } | ||||
|  | @ -0,0 +1,85 @@ | |||
| #include "..\e2dcommon.h" | ||||
| 
 | ||||
| 
 | ||||
| e2d::KeyEvent::KeyEvent(UINT message, WPARAM wParam, LPARAM lParam) | ||||
| 	: _code(KeyCode(wParam)) | ||||
| 	, _type(Type(message)) | ||||
| 	, _count(static_cast<int>((DWORD)lParam & 0x0000FFFF)) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| e2d::KeyCode e2d::KeyEvent::getCode() const | ||||
| { | ||||
| 	return _code; | ||||
| } | ||||
| 
 | ||||
| int e2d::KeyEvent::getCount() const | ||||
| { | ||||
| 	return _count; | ||||
| } | ||||
| 
 | ||||
| e2d::KeyEvent::Type e2d::KeyEvent::getType() const | ||||
| { | ||||
| 	return _type; | ||||
| } | ||||
| 
 | ||||
| e2d::KeyCode e2d::KeyEvent::convertKeyCode(WPARAM wParam) | ||||
| { | ||||
| 	switch (wParam) | ||||
| 	{ | ||||
| 	case 'A': return KeyCode::A; | ||||
| 	case 'B': return KeyCode::B; | ||||
| 	case 'C': return KeyCode::C; | ||||
| 	case 'D': return KeyCode::D; | ||||
| 	case 'E': return KeyCode::E; | ||||
| 	case 'F': return KeyCode::F; | ||||
| 	case 'G': return KeyCode::G; | ||||
| 	case 'H': return KeyCode::H; | ||||
| 	case 'I': return KeyCode::I; | ||||
| 	case 'J': return KeyCode::J; | ||||
| 	case 'K': return KeyCode::K; | ||||
| 	case 'L': return KeyCode::L; | ||||
| 	case 'M': return KeyCode::M; | ||||
| 	case 'N': return KeyCode::N; | ||||
| 	case 'O': return KeyCode::O; | ||||
| 	case 'P': return KeyCode::P; | ||||
| 	case 'Q': return KeyCode::Q; | ||||
| 	case 'R': return KeyCode::R; | ||||
| 	case 'S': return KeyCode::S; | ||||
| 	case 'T': return KeyCode::T; | ||||
| 	case 'U': return KeyCode::U; | ||||
| 	case 'V': return KeyCode::V; | ||||
| 	case 'W': return KeyCode::W; | ||||
| 	case 'X': return KeyCode::X; | ||||
| 	case 'Y': return KeyCode::Y; | ||||
| 	case 'Z': return KeyCode::Z; | ||||
| 	case '0': return KeyCode::Num0; | ||||
| 	case '1': return KeyCode::Num1; | ||||
| 	case '2': return KeyCode::Num2; | ||||
| 	case '3': return KeyCode::Num3; | ||||
| 	case '4': return KeyCode::Num4; | ||||
| 	case '5': return KeyCode::Num5; | ||||
| 	case '6': return KeyCode::Num6; | ||||
| 	case '7': return KeyCode::Num7; | ||||
| 	case '8': return KeyCode::Num8; | ||||
| 	case '9': return KeyCode::Num9; | ||||
| 	case VK_NUMPAD0: return KeyCode::Numpad0; | ||||
| 	case VK_NUMPAD1: return KeyCode::Numpad1; | ||||
| 	case VK_NUMPAD2: return KeyCode::Numpad2; | ||||
| 	case VK_NUMPAD3: return KeyCode::Numpad3; | ||||
| 	case VK_NUMPAD4: return KeyCode::Numpad4; | ||||
| 	case VK_NUMPAD5: return KeyCode::Numpad5; | ||||
| 	case VK_NUMPAD6: return KeyCode::Numpad6; | ||||
| 	case VK_NUMPAD7: return KeyCode::Numpad7; | ||||
| 	case VK_NUMPAD8: return KeyCode::Numpad8; | ||||
| 	case VK_NUMPAD9: return KeyCode::Numpad9; | ||||
| 	case VK_UP: return KeyCode::Up; | ||||
| 	case VK_DOWN: return KeyCode::Down; | ||||
| 	case VK_LEFT: return KeyCode::Left; | ||||
| 	case VK_RIGHT: return KeyCode::Right; | ||||
| 	case VK_RETURN: return KeyCode::Enter; | ||||
| 	case VK_SPACE: return KeyCode::Space; | ||||
| 	case VK_ESCAPE: return KeyCode::Esc; | ||||
| 	default: return KeyCode::Unknown; | ||||
| 	} | ||||
| } | ||||
|  | @ -0,0 +1,46 @@ | |||
| #include "..\e2dcommon.h" | ||||
| 
 | ||||
| 
 | ||||
| e2d::MouseEvent::MouseEvent(UINT message, WPARAM wParam, LPARAM lParam) | ||||
| 	: _pos(LOWORD(lParam), HIWORD(lParam)) | ||||
| 	, _shiftDown(GET_KEYSTATE_WPARAM(wParam) == MK_SHIFT) | ||||
| 	, _ctrlDown(GET_KEYSTATE_WPARAM(wParam) == MK_CONTROL) | ||||
| 	, _wheelDelta(GET_WHEEL_DELTA_WPARAM(wParam)) | ||||
| 	, _type(Type(message)) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| double e2d::MouseEvent::getX() const | ||||
| { | ||||
| 	return _pos.x; | ||||
| } | ||||
| 
 | ||||
| double e2d::MouseEvent::getY() const | ||||
| { | ||||
| 	return _pos.y; | ||||
| } | ||||
| 
 | ||||
| e2d::Point e2d::MouseEvent::getPos() const | ||||
| { | ||||
| 	return _pos; | ||||
| } | ||||
| 
 | ||||
| bool e2d::MouseEvent::isShiftDown() const | ||||
| { | ||||
| 	return _shiftDown; | ||||
| } | ||||
| 
 | ||||
| bool e2d::MouseEvent::isCtrlDown() const | ||||
| { | ||||
| 	return _ctrlDown; | ||||
| } | ||||
| 
 | ||||
| double e2d::MouseEvent::getWheelDelta() const | ||||
| { | ||||
| 	return _wheelDelta; | ||||
| } | ||||
| 
 | ||||
| e2d::MouseEvent::Type e2d::MouseEvent::getType() const | ||||
| { | ||||
| 	return _type; | ||||
| } | ||||
|  | @ -70,13 +70,11 @@ void e2d::CollisionManager::__updateCollider(Collider* collider) | |||
| 		if (relation != Collider::Relation::Unknown && | ||||
| 			relation != Collider::Relation::Disjoin) | ||||
| 		{ | ||||
| 			_collision = Collision(active, passive, relation); | ||||
| 			active->onCollision(_collision); | ||||
| 			// 更新碰撞监听器
 | ||||
| 			CollisionManager::__updateListeners(); | ||||
| 			Collision collision(passive, relation); | ||||
| 			SceneManager::getInstance()->getCurrentScene()->onCollision(collision); | ||||
| 			active->onCollision(collision); | ||||
| 		} | ||||
| 	} | ||||
| 	_collision = Collision(); | ||||
| } | ||||
| 
 | ||||
| void e2d::CollisionManager::addName(const String & name1, const String & name2) | ||||
|  | @ -105,7 +103,7 @@ bool e2d::CollisionManager::isCollidable(Node * node1, Node * node2) | |||
| 
 | ||||
| bool e2d::CollisionManager::isCollidable(const String & name1, const String & name2) | ||||
| { | ||||
| 	UINT hashName1 = name1.getHashCode(),  | ||||
| 	size_t hashName1 = name1.getHashCode(),  | ||||
| 		hashName2 = name2.getHashCode(); | ||||
| 	auto pair1 = std::make_pair(hashName1, hashName2),  | ||||
| 		pair2 = std::make_pair(hashName2, hashName1); | ||||
|  | @ -118,140 +116,3 @@ bool e2d::CollisionManager::isCollidable(const String & name1, const String & na | |||
| 	} | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| e2d::Collision e2d::CollisionManager::getCollision() const | ||||
| { | ||||
| 	return _collision; | ||||
| } | ||||
| 
 | ||||
| void e2d::CollisionManager::__updateListeners() | ||||
| { | ||||
| 	if (_listeners.empty() || Game::getInstance()->isPaused()) | ||||
| 		return; | ||||
| 
 | ||||
| 	for (size_t i = 0; i < _listeners.size(); ++i) | ||||
| 	{ | ||||
| 		auto listener = _listeners[i]; | ||||
| 		// 清除已停止的监听器
 | ||||
| 		if (listener->_stopped) | ||||
| 		{ | ||||
| 			GC::safeRelease(listener); | ||||
| 			_listeners.erase(_listeners.begin() + i); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			// 更新监听器
 | ||||
| 			listener->_update(); | ||||
| 			++i; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| e2d::Listener * e2d::CollisionManager::addListener(const Function& func, const String& name, bool paused) | ||||
| { | ||||
| 	auto listener = new (e2d::autorelease) Listener(func, name, paused); | ||||
| 	GC::retain(listener); | ||||
| 	_listeners.push_back(listener); | ||||
| 	return listener; | ||||
| } | ||||
| 
 | ||||
| void e2d::CollisionManager::addListener(Listener * listener) | ||||
| { | ||||
| 	if (listener) | ||||
| 	{ | ||||
| 		auto iter = std::find(_listeners.begin(), _listeners.end(), listener); | ||||
| 		if (iter == _listeners.end()) | ||||
| 		{ | ||||
| 			GC::retain(listener); | ||||
| 			_listeners.push_back(listener); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::CollisionManager::removeListener(Listener * listener) | ||||
| { | ||||
| 	if (listener) | ||||
| 	{ | ||||
| 		auto iter = std::find(_listeners.begin(), _listeners.end(), listener); | ||||
| 		if (iter != _listeners.end()) | ||||
| 		{ | ||||
| 			GC::safeRelease(listener); | ||||
| 			_listeners.erase(iter); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::CollisionManager::stopListener(const String& name) | ||||
| { | ||||
| 	if (_listeners.empty() || name.isEmpty()) | ||||
| 		return; | ||||
| 
 | ||||
| 	for (auto listener : _listeners) | ||||
| 	{ | ||||
| 		if (listener->_name == name) | ||||
| 		{ | ||||
| 			listener->stop(); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::CollisionManager::startListener(const String& name) | ||||
| { | ||||
| 	if (_listeners.empty() || name.isEmpty()) | ||||
| 		return; | ||||
| 
 | ||||
| 	for (auto listener : _listeners) | ||||
| 	{ | ||||
| 		if (listener->_name == name) | ||||
| 		{ | ||||
| 			listener->start(); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::CollisionManager::removeListener(const String& name) | ||||
| { | ||||
| 	if (_listeners.empty() || name.isEmpty()) | ||||
| 		return; | ||||
| 
 | ||||
| 	for (auto listener : _listeners) | ||||
| 	{ | ||||
| 		if (listener->_name == name) | ||||
| 		{ | ||||
| 			listener->_stopped = true; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::CollisionManager::stopAllListeners() | ||||
| { | ||||
| 	for (auto listener : _listeners) | ||||
| 	{ | ||||
| 		listener->stop(); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::CollisionManager::startAllListeners() | ||||
| { | ||||
| 	for (auto listener : _listeners) | ||||
| 	{ | ||||
| 		listener->start(); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::CollisionManager::removeAllListeners() | ||||
| { | ||||
| 	for (auto listener : _listeners) | ||||
| 	{ | ||||
| 		listener->_stopped = true; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::CollisionManager::clearAllListeners() | ||||
| { | ||||
| 	for (auto listener : _listeners) | ||||
| 	{ | ||||
| 		GC::release(listener); | ||||
| 	} | ||||
| 	_listeners.clear(); | ||||
| } | ||||
|  |  | |||
|  | @ -1,162 +0,0 @@ | |||
| #include "..\e2dbase.h" | ||||
| #include "..\e2dmanager.h" | ||||
| #include "..\e2dtool.h" | ||||
| 
 | ||||
| 
 | ||||
| e2d::InputManager * e2d::InputManager::_instance = nullptr; | ||||
| 
 | ||||
| e2d::InputManager * e2d::InputManager::getInstance() | ||||
| { | ||||
| 	if (!_instance) | ||||
| 		_instance = new (std::nothrow) InputManager; | ||||
| 	return _instance; | ||||
| } | ||||
| 
 | ||||
| void e2d::InputManager::destroyInstance() | ||||
| { | ||||
| 	if (_instance) | ||||
| 	{ | ||||
| 		delete _instance; | ||||
| 		_instance = nullptr; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| e2d::InputManager::InputManager() | ||||
| { | ||||
| } | ||||
| 
 | ||||
| e2d::InputManager::~InputManager() | ||||
| { | ||||
| } | ||||
| 
 | ||||
| e2d::Listener * e2d::InputManager::addListener(const Function& func, const String& name, bool paused) | ||||
| { | ||||
| 	auto listener = new (e2d::autorelease) Listener(func, name, paused); | ||||
| 	GC::retain(listener); | ||||
| 	_listeners.push_back(listener); | ||||
| 	return listener; | ||||
| } | ||||
| 
 | ||||
| void e2d::InputManager::addListener(Listener * listener) | ||||
| { | ||||
| 	if (listener) | ||||
| 	{ | ||||
| 		auto iter = std::find(_listeners.begin(), _listeners.end(), listener); | ||||
| 		if (iter == _listeners.end()) | ||||
| 		{ | ||||
| 			GC::retain(listener); | ||||
| 			_listeners.push_back(listener); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::InputManager::removeListener(Listener * listener) | ||||
| { | ||||
| 	if (listener) | ||||
| 	{ | ||||
| 		auto iter = std::find(_listeners.begin(), _listeners.end(), listener); | ||||
| 		if (iter != _listeners.end()) | ||||
| 		{ | ||||
| 			GC::safeRelease(listener); | ||||
| 			_listeners.erase(iter); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::InputManager::stopListener(const String& name) | ||||
| { | ||||
| 	if (_listeners.empty() || name.isEmpty()) | ||||
| 		return; | ||||
| 
 | ||||
| 	for (auto listener : _listeners) | ||||
| 	{ | ||||
| 		if (listener->_name == name) | ||||
| 		{ | ||||
| 			listener->stop(); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::InputManager::startListener(const String& name) | ||||
| { | ||||
| 	if (_listeners.empty() || name.isEmpty()) | ||||
| 		return; | ||||
| 
 | ||||
| 	for (auto listener : _listeners) | ||||
| 	{ | ||||
| 		if (listener->_name == name) | ||||
| 		{ | ||||
| 			listener->start(); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::InputManager::removeListener(const String& name) | ||||
| { | ||||
| 	if (_listeners.empty() || name.isEmpty()) | ||||
| 		return; | ||||
| 
 | ||||
| 	for (auto listener : _listeners) | ||||
| 	{ | ||||
| 		if (listener->_name == name) | ||||
| 		{ | ||||
| 			listener->_stopped = true; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::InputManager::stopAllListeners() | ||||
| { | ||||
| 	for (auto listener : _listeners) | ||||
| 	{ | ||||
| 		listener->stop(); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::InputManager::startAllListeners() | ||||
| { | ||||
| 	for (auto listener : _listeners) | ||||
| 	{ | ||||
| 		listener->start(); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::InputManager::removeAllListeners() | ||||
| { | ||||
| 	for (auto listener : _listeners) | ||||
| 	{ | ||||
| 		listener->_stopped = true; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::InputManager::clearAllListeners() | ||||
| { | ||||
| 	for (auto listener : _listeners) | ||||
| 	{ | ||||
| 		GC::release(listener); | ||||
| 	} | ||||
| 	_listeners.clear(); | ||||
| } | ||||
| 
 | ||||
| void e2d::InputManager::update() | ||||
| { | ||||
| 	if (_listeners.empty() || Game::getInstance()->isPaused()) | ||||
| 		return; | ||||
| 
 | ||||
| 	for (size_t i = 0; i < _listeners.size(); ++i) | ||||
| 	{ | ||||
| 		auto listener = _listeners[i]; | ||||
| 		// 清除已停止的监听器
 | ||||
| 		if (listener->_stopped) | ||||
| 		{ | ||||
| 			GC::safeRelease(listener); | ||||
| 			_listeners.erase(_listeners.begin() + i); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			// 更新监听器
 | ||||
| 			listener->_update(); | ||||
| 			++i; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | @ -183,3 +183,25 @@ void e2d::SceneManager::render() | |||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::SceneManager::dispatch(const MouseEvent & e) | ||||
| { | ||||
| 	if (_transition != nullptr) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (_currScene) | ||||
| 	{ | ||||
| 		_currScene->dispatch(e); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::SceneManager::dispatch(const KeyEvent & e) | ||||
| { | ||||
| 	if (_transition != nullptr) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (_currScene) | ||||
| 	{ | ||||
| 		_currScene->dispatch(e); | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -185,7 +185,7 @@ void e2d::Button::_fixedUpdate() | |||
| 
 | ||||
| 	if (_enabled && _visible && _normal) | ||||
| 	{ | ||||
| 		if (input->isRelease(Input::Mouse::Left)) | ||||
| 		if (input->isRelease(MouseCode::Left)) | ||||
| 		{ | ||||
| 			// 鼠标左键抬起时,判断鼠标坐标是否在按钮内部
 | ||||
| 			if (_isSelected && | ||||
|  | @ -197,7 +197,7 @@ void e2d::Button::_fixedUpdate() | |||
| 			_isSelected = false; | ||||
| 		} | ||||
| 
 | ||||
| 		if (input->isPress(Input::Mouse::Left)) | ||||
| 		if (input->isPress(MouseCode::Left)) | ||||
| 		{ | ||||
| 			if (_normal->containsPoint(input->getMousePos())) | ||||
| 			{ | ||||
|  | @ -207,7 +207,7 @@ void e2d::Button::_fixedUpdate() | |||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if (_isSelected && input->isDown(Input::Mouse::Left)) | ||||
| 		if (_isSelected && input->isDown(MouseCode::Left)) | ||||
| 		{ | ||||
| 			if (_normal->containsPoint(input->getMousePos())) | ||||
| 			{ | ||||
|  |  | |||
|  | @ -94,9 +94,6 @@ void e2d::Node::_update() | |||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		// 子节点排序
 | ||||
| 		_sortChildren(); | ||||
| 
 | ||||
| 		// 遍历子节点
 | ||||
| 		size_t i; | ||||
| 		for (i = 0; i < _children.size(); ++i) | ||||
|  | @ -286,6 +283,82 @@ void e2d::Node::updateTransform() | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| bool e2d::Node::dispatch(const MouseEvent & e) | ||||
| { | ||||
| 	if (_children.empty()) | ||||
| 	{ | ||||
| 		return onMouseEvent(e); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		size_t i; | ||||
| 		for (i = 0; i < _children.size(); ++i) | ||||
| 		{ | ||||
| 			auto child = _children[i]; | ||||
| 			if (child->getOrder() < 0) | ||||
| 			{ | ||||
| 				if (!child->dispatch(e)) | ||||
| 				{ | ||||
| 					return false; | ||||
| 				} | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if (!onMouseEvent(e)) | ||||
| 		{ | ||||
| 			return false; | ||||
| 		} | ||||
| 
 | ||||
| 		for (; i < _children.size(); ++i) | ||||
| 			if (!_children[i]->dispatch(e)) | ||||
| 				return false; | ||||
| 
 | ||||
| 		return true; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| bool e2d::Node::dispatch(const KeyEvent & e) | ||||
| { | ||||
| 	if (_children.empty()) | ||||
| 	{ | ||||
| 		return onKeyEvent(e); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		size_t i; | ||||
| 		for (i = 0; i < _children.size(); ++i) | ||||
| 		{ | ||||
| 			auto child = _children[i]; | ||||
| 			if (child->getOrder() < 0) | ||||
| 			{ | ||||
| 				if (!child->dispatch(e)) | ||||
| 				{ | ||||
| 					return false; | ||||
| 				} | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if (!onKeyEvent(e)) | ||||
| 		{ | ||||
| 			return false; | ||||
| 		} | ||||
| 
 | ||||
| 		for (; i < _children.size(); ++i) | ||||
| 			if (!_children[i]->dispatch(e)) | ||||
| 				return false; | ||||
| 
 | ||||
| 		return true; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::Node::_sortChildren() | ||||
| { | ||||
| 	if (_needSort) | ||||
|  | @ -322,7 +395,7 @@ e2d::String e2d::Node::getName() const | |||
| 	return _name; | ||||
| } | ||||
| 
 | ||||
| unsigned int e2d::Node::getHashName() const | ||||
| size_t e2d::Node::getHashName() const | ||||
| { | ||||
| 	return _hashName; | ||||
| } | ||||
|  | @ -680,7 +753,7 @@ e2d::Scene * e2d::Node::getParentScene() const | |||
| std::vector<e2d::Node*> e2d::Node::getChildren(const String& name) const | ||||
| { | ||||
| 	std::vector<Node*> vChildren; | ||||
| 	unsigned int hash = name.getHashCode(); | ||||
| 	size_t hash = name.getHashCode(); | ||||
| 
 | ||||
| 	for (auto child : _children) | ||||
| 	{ | ||||
|  | @ -695,7 +768,7 @@ std::vector<e2d::Node*> e2d::Node::getChildren(const String& name) const | |||
| 
 | ||||
| e2d::Node * e2d::Node::getChild(const String& name) const | ||||
| { | ||||
| 	unsigned int hash = name.getHashCode(); | ||||
| 	size_t hash = name.getHashCode(); | ||||
| 
 | ||||
| 	for (auto child : _children) | ||||
| 	{ | ||||
|  | @ -765,7 +838,7 @@ void e2d::Node::removeChildren(const String& childName) | |||
| 	} | ||||
| 
 | ||||
| 	// 计算名称 Hash 值
 | ||||
| 	unsigned int hash = childName.getHashCode(); | ||||
| 	size_t hash = childName.getHashCode(); | ||||
| 
 | ||||
| 	size_t size = _children.size(); | ||||
| 	for (size_t i = 0; i < size; ++i) | ||||
|  |  | |||
|  | @ -1,57 +0,0 @@ | |||
| #include "..\e2dcommon.h" | ||||
| #include "..\e2dtool.h" | ||||
| 
 | ||||
| 
 | ||||
| e2d::Listener::Listener() | ||||
| 	: _name() | ||||
| 	, _callback() | ||||
| 	, _running(true) | ||||
| 	, _stopped(false) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| e2d::Listener::Listener(const Function & func, const String & name, bool paused) | ||||
| 	: _name(name) | ||||
| 	, _callback(func) | ||||
| 	, _running(!paused) | ||||
| 	, _stopped(false) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| void e2d::Listener::_update() | ||||
| { | ||||
| 	if (_callback) | ||||
| 	{ | ||||
| 		_callback(); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| bool e2d::Listener::isRunning() const | ||||
| { | ||||
| 	return _running; | ||||
| } | ||||
| 
 | ||||
| e2d::String e2d::Listener::getName() const | ||||
| { | ||||
| 	return _name; | ||||
| } | ||||
| 
 | ||||
| void e2d::Listener::setName(const String & name) | ||||
| { | ||||
| 	_name = name; | ||||
| } | ||||
| 
 | ||||
| void e2d::Listener::setFunc(const Function & func) | ||||
| { | ||||
| 	_callback = func; | ||||
| } | ||||
| 
 | ||||
| void e2d::Listener::start() | ||||
| { | ||||
| 	_running = true; | ||||
| } | ||||
| 
 | ||||
| void e2d::Listener::stop() | ||||
| { | ||||
| 	_running = false; | ||||
| } | ||||
|  | @ -229,73 +229,6 @@ private: | |||
| // 输入设备
 | ||||
| class Input | ||||
| { | ||||
| public: | ||||
| 	// 報炎囚峙
 | ||||
| 	enum class Mouse : int | ||||
| 	{ | ||||
| 		Left,		/* 報炎恣囚 */ | ||||
| 		Right,		/* 報炎嘔囚 */ | ||||
| 		Middle		/* 報炎嶄囚 */ | ||||
| 	}; | ||||
| 
 | ||||
| 	// 囚徒囚峙
 | ||||
| 	enum class Key : int | ||||
| 	{ | ||||
| 		Up = 0xC8, | ||||
| 		Left = 0xCB, | ||||
| 		Right = 0xCD, | ||||
| 		Down = 0xD0, | ||||
| 		Enter = 0x1C, | ||||
| 		Space = 0x39, | ||||
| 		Esc = 0x01, | ||||
| 		Q = 0x10, | ||||
| 		W = 0x11, | ||||
| 		E = 0x12, | ||||
| 		R = 0x13, | ||||
| 		T = 0x14, | ||||
| 		Y = 0x15, | ||||
| 		U = 0x16, | ||||
| 		I = 0x17, | ||||
| 		O = 0x18, | ||||
| 		P = 0x19, | ||||
| 		A = 0x1E, | ||||
| 		S = 0x1F, | ||||
| 		D = 0x20, | ||||
| 		F = 0x21, | ||||
| 		G = 0x22, | ||||
| 		H = 0x23, | ||||
| 		J = 0x24, | ||||
| 		K = 0x25, | ||||
| 		L = 0x26, | ||||
| 		Z = 0x2C, | ||||
| 		X = 0x2D, | ||||
| 		C = 0x2E, | ||||
| 		V = 0x2F, | ||||
| 		B = 0x30, | ||||
| 		N = 0x31, | ||||
| 		M = 0x32, | ||||
| 		Num1 = 0x02, | ||||
| 		Num2 = 0x03, | ||||
| 		Num3 = 0x04, | ||||
| 		Num4 = 0x05, | ||||
| 		Num5 = 0x06, | ||||
| 		Num6 = 0x07, | ||||
| 		Num7 = 0x08, | ||||
| 		Num8 = 0x09, | ||||
| 		Num9 = 0x0A, | ||||
| 		Num0 = 0x0B, | ||||
| 		Numpad7 = 0x47, | ||||
| 		Numpad8 = 0x48, | ||||
| 		Numpad9 = 0x49, | ||||
| 		Numpad4 = 0x4B, | ||||
| 		Numpad5 = 0x4C, | ||||
| 		Numpad6 = 0x4D, | ||||
| 		Numpad1 = 0x4F, | ||||
| 		Numpad2 = 0x50, | ||||
| 		Numpad3 = 0x51, | ||||
| 		Numpad0 = 0x52 | ||||
| 	}; | ||||
| 
 | ||||
| public: | ||||
| 	// 获取输入设备实例
 | ||||
| 	static Input * getInstance(); | ||||
|  | @ -305,32 +238,32 @@ public: | |||
| 
 | ||||
| 	// 检测键盘某按键是否正被按下
 | ||||
| 	bool isDown( | ||||
| 		Key key | ||||
| 		KeyCode key | ||||
| 	); | ||||
| 
 | ||||
| 	// 检测键盘某按键是否被点击
 | ||||
| 	bool isPress( | ||||
| 		Key key | ||||
| 		KeyCode key | ||||
| 	); | ||||
| 
 | ||||
| 	// 检测键盘某按键是否正在松开
 | ||||
| 	bool isRelease( | ||||
| 		Key key | ||||
| 		KeyCode key | ||||
| 	); | ||||
| 
 | ||||
| 	// 检测鼠标按键是否正被按下
 | ||||
| 	bool isDown( | ||||
| 		Mouse code | ||||
| 		MouseCode code | ||||
| 	); | ||||
| 
 | ||||
| 	// 检测鼠标按键是否被点击
 | ||||
| 	bool isPress( | ||||
| 		Mouse code | ||||
| 		MouseCode code | ||||
| 	); | ||||
| 
 | ||||
| 	// 检测鼠标按键是否正在松开
 | ||||
| 	bool isRelease( | ||||
| 		Mouse code | ||||
| 		MouseCode code | ||||
| 	); | ||||
| 
 | ||||
| 	// 获得鼠标X轴坐标值
 | ||||
|  |  | |||
							
								
								
									
										216
									
								
								core/e2dcommon.h
								
								
								
								
							
							
						
						
									
										216
									
								
								core/e2dcommon.h
								
								
								
								
							|  | @ -142,7 +142,7 @@ public: | |||
| 	int getLength() const; | ||||
| 
 | ||||
| 	// 获取该字符串的散列值
 | ||||
| 	unsigned int getHashCode() const; | ||||
| 	size_t getHashCode() const; | ||||
| 
 | ||||
| 	// 获取 Unicode 字符串
 | ||||
| 	std::wstring getWString() const; | ||||
|  | @ -440,6 +440,167 @@ public: | |||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // 鼠标键值
 | ||||
| enum class MouseCode : int | ||||
| { | ||||
| 	Left,		/* 鼠标左键 */ | ||||
| 	Right,		/* 鼠标右键 */ | ||||
| 	Middle		/* 鼠标中键 */ | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // 键盘键值
 | ||||
| enum class KeyCode : int | ||||
| { | ||||
| 	Unknown = 0, | ||||
| 	Up = 0xC8, | ||||
| 	Left = 0xCB, | ||||
| 	Right = 0xCD, | ||||
| 	Down = 0xD0, | ||||
| 	Enter = 0x1C, | ||||
| 	Space = 0x39, | ||||
| 	Esc = 0x01, | ||||
| 	Q = 0x10, | ||||
| 	W = 0x11, | ||||
| 	E = 0x12, | ||||
| 	R = 0x13, | ||||
| 	T = 0x14, | ||||
| 	Y = 0x15, | ||||
| 	U = 0x16, | ||||
| 	I = 0x17, | ||||
| 	O = 0x18, | ||||
| 	P = 0x19, | ||||
| 	A = 0x1E, | ||||
| 	S = 0x1F, | ||||
| 	D = 0x20, | ||||
| 	F = 0x21, | ||||
| 	G = 0x22, | ||||
| 	H = 0x23, | ||||
| 	J = 0x24, | ||||
| 	K = 0x25, | ||||
| 	L = 0x26, | ||||
| 	Z = 0x2C, | ||||
| 	X = 0x2D, | ||||
| 	C = 0x2E, | ||||
| 	V = 0x2F, | ||||
| 	B = 0x30, | ||||
| 	N = 0x31, | ||||
| 	M = 0x32, | ||||
| 	Num1 = 0x02, | ||||
| 	Num2 = 0x03, | ||||
| 	Num3 = 0x04, | ||||
| 	Num4 = 0x05, | ||||
| 	Num5 = 0x06, | ||||
| 	Num6 = 0x07, | ||||
| 	Num7 = 0x08, | ||||
| 	Num8 = 0x09, | ||||
| 	Num9 = 0x0A, | ||||
| 	Num0 = 0x0B, | ||||
| 	Numpad7 = 0x47, | ||||
| 	Numpad8 = 0x48, | ||||
| 	Numpad9 = 0x49, | ||||
| 	Numpad4 = 0x4B, | ||||
| 	Numpad5 = 0x4C, | ||||
| 	Numpad6 = 0x4D, | ||||
| 	Numpad1 = 0x4F, | ||||
| 	Numpad2 = 0x50, | ||||
| 	Numpad3 = 0x51, | ||||
| 	Numpad0 = 0x52, | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // 按键消息
 | ||||
| class KeyEvent | ||||
| { | ||||
| public: | ||||
| 	// 按键消息类型
 | ||||
| 	enum class Type : int | ||||
| 	{ | ||||
| 		Down = 0x0100,	// 按下
 | ||||
| 		Up				// 抬起
 | ||||
| 	}; | ||||
| 
 | ||||
| public: | ||||
| 	explicit KeyEvent( | ||||
| 		UINT message, | ||||
| 		WPARAM wParam, | ||||
| 		LPARAM lParam | ||||
| 	); | ||||
| 
 | ||||
| 	// 获取按键键值
 | ||||
| 	KeyCode getCode() const; | ||||
| 
 | ||||
| 	// 获取按键次数
 | ||||
| 	int getCount() const; | ||||
| 
 | ||||
| 	// 获取事件类型
 | ||||
| 	KeyEvent::Type getType() const; | ||||
| 
 | ||||
| 	// VK 键值转换
 | ||||
| 	static KeyCode convertKeyCode( | ||||
| 		WPARAM wParam | ||||
| 	); | ||||
| 
 | ||||
| protected: | ||||
| 	int _count; | ||||
| 	KeyCode _code; | ||||
| 	KeyEvent::Type _type; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // 鼠标消息
 | ||||
| class MouseEvent | ||||
| { | ||||
| public: | ||||
| 	// 鼠标消息类型
 | ||||
| 	enum class Type : int | ||||
| 	{ | ||||
| 		Move = 0x0200,		// 鼠标移动
 | ||||
| 		LeftDown,			// 鼠标左键按下
 | ||||
| 		LeftUp,				// 鼠标左键抬起
 | ||||
| 		LeftDoubleClick,	// 鼠标左键双击
 | ||||
| 		RightDown,			// 鼠标右键按下
 | ||||
| 		RightUp,			// 鼠标右键抬起
 | ||||
| 		RightDoubleClick,	// 鼠标右键双击
 | ||||
| 		MiddleDown,			// 鼠标中键按下
 | ||||
| 		MiddleUp,			// 鼠标中键抬起
 | ||||
| 		MiddleDoubleClick,	// 鼠标中键双击
 | ||||
| 		Wheel				// 滑动滚轮
 | ||||
| 	}; | ||||
| 
 | ||||
| public: | ||||
| 	explicit MouseEvent( | ||||
| 		UINT message, | ||||
| 		WPARAM wParam, | ||||
| 		LPARAM lParam | ||||
| 	); | ||||
| 
 | ||||
| 	double getX() const; | ||||
| 
 | ||||
| 	double getY() const; | ||||
| 
 | ||||
| 	Point getPos() const; | ||||
| 
 | ||||
| 	// 获取事件类型
 | ||||
| 	MouseEvent::Type getType() const; | ||||
| 
 | ||||
| 	double getWheelDelta() const; | ||||
| 
 | ||||
| 	// Shift 键是否按下
 | ||||
| 	bool isShiftDown() const; | ||||
| 
 | ||||
| 	// Ctrl 键是否按下
 | ||||
| 	bool isCtrlDown() const; | ||||
| 
 | ||||
| protected: | ||||
| 	bool _shiftDown; | ||||
| 	bool _ctrlDown; | ||||
| 	double _wheelDelta; | ||||
| 	Point _pos; | ||||
| 	MouseEvent::Type _type; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| class Node; | ||||
| 
 | ||||
| // 碰撞体
 | ||||
|  | @ -466,7 +627,7 @@ public: | |||
| 	}; | ||||
| 
 | ||||
| public: | ||||
| 	Collider( | ||||
| 	explicit Collider( | ||||
| 		Node * parent | ||||
| 	); | ||||
| 
 | ||||
|  | @ -549,26 +710,21 @@ class Collision | |||
| public: | ||||
| 	Collision(); | ||||
| 
 | ||||
| 	Collision( | ||||
| 		Node* active, | ||||
| 		Node* passive, | ||||
| 	explicit Collision( | ||||
| 		Node* node, | ||||
| 		Collider::Relation relation | ||||
| 	); | ||||
| 
 | ||||
| 	~Collision(); | ||||
| 
 | ||||
| 	// 获取发生碰撞的主动方
 | ||||
| 	Node* getActive() const; | ||||
| 
 | ||||
| 	// 获取发生碰撞的被动方
 | ||||
| 	Node* getPassive() const; | ||||
| 	// 获取发生碰撞节点
 | ||||
| 	Node* getNode() const; | ||||
| 
 | ||||
| 	// 获取交集关系
 | ||||
| 	Collider::Relation getRelation() const; | ||||
| 
 | ||||
| protected: | ||||
| 	Node * _active; | ||||
| 	Node* _passive; | ||||
| 	Node* _node; | ||||
| 	Collider::Relation _relation; | ||||
| }; | ||||
| 
 | ||||
|  | @ -582,7 +738,7 @@ public: | |||
| 	); | ||||
| 
 | ||||
| 	Resource( | ||||
| 		int resNameId,				/* 资源名称 */ | ||||
| 		size_t resNameId,			/* 资源名称 */ | ||||
| 		const String& resType		/* 资源类型 */ | ||||
| 	); | ||||
| 
 | ||||
|  | @ -591,11 +747,11 @@ public: | |||
| 
 | ||||
| 	const String& getFileName() const; | ||||
| 
 | ||||
| 	int getResNameId() const; | ||||
| 	size_t getResNameId() const; | ||||
| 
 | ||||
| 	const String& getResType() const; | ||||
| 
 | ||||
| 	int getKey() const; | ||||
| 	size_t getKey() const; | ||||
| 
 | ||||
| 	// 比较运算符
 | ||||
| 	bool operator> (const Resource &) const; | ||||
|  | @ -605,7 +761,7 @@ public: | |||
| 
 | ||||
| protected: | ||||
| 	bool	_isResource; | ||||
| 	int		_resNameId; | ||||
| 	size_t	_resNameId; | ||||
| 	String	_resType; | ||||
| 	String	_fileName; | ||||
| }; | ||||
|  | @ -741,13 +897,25 @@ public: | |||
| 
 | ||||
| 	virtual ~Scene(); | ||||
| 
 | ||||
| 	// 重写这个函数,它将在进入这个场景时自动执行
 | ||||
| 	// 进入场景
 | ||||
| 	virtual void onEnter() {} | ||||
| 
 | ||||
| 	// 重写这个函数,它将在离开这个场景时自动执行
 | ||||
| 	// 退出场景
 | ||||
| 	virtual void onExit() {} | ||||
| 
 | ||||
| 	// 重写这个函数,它将在关闭窗口时执行(返回 false 将阻止窗口关闭)
 | ||||
| 	// 按键消息
 | ||||
| 	// 说明:返回 false 将阻止消息继续传递
 | ||||
| 	virtual bool onKeyEvent(KeyEvent e) { return true; } | ||||
| 
 | ||||
| 	// 鼠标消息
 | ||||
| 	// 说明:返回 false 将阻止消息继续传递
 | ||||
| 	virtual bool onMouseEvent(MouseEvent e) { return true; } | ||||
| 
 | ||||
| 	// 碰撞消息
 | ||||
| 	virtual void onCollision(Collision collision) { } | ||||
| 
 | ||||
| 	// 关闭窗口
 | ||||
| 	// 说明:返回 false 将阻止窗口关闭
 | ||||
| 	virtual bool onCloseWindow() { return true; } | ||||
| 
 | ||||
| 	// 重写这个函数,它将在每一帧画面刷新时执行
 | ||||
|  | @ -797,6 +965,16 @@ public: | |||
| 	// 更新场景内容
 | ||||
| 	void update(); | ||||
| 
 | ||||
| 	// 分发鼠标消息
 | ||||
| 	void dispatch( | ||||
| 		const MouseEvent& e | ||||
| 	); | ||||
| 
 | ||||
| 	// 分发按键消息
 | ||||
| 	void dispatch( | ||||
| 		const KeyEvent& e | ||||
| 	); | ||||
| 
 | ||||
| protected: | ||||
| 	E2D_DISABLE_COPY(Scene); | ||||
| 
 | ||||
|  |  | |||
|  | @ -52,6 +52,16 @@ public: | |||
| 	// 渲染场景画面
 | ||||
| 	void render(); | ||||
| 
 | ||||
| 	// 分发鼠标消息
 | ||||
| 	void dispatch( | ||||
| 		const MouseEvent& e | ||||
| 	); | ||||
| 
 | ||||
| 	// 分发按键消息
 | ||||
| 	void dispatch( | ||||
| 		const KeyEvent& e | ||||
| 	); | ||||
| 
 | ||||
| private: | ||||
| 	SceneManager(); | ||||
| 
 | ||||
|  | @ -166,81 +176,6 @@ private: | |||
| }; | ||||
| 
 | ||||
| 
 | ||||
| class Listener; | ||||
| 
 | ||||
| // 用户输入管理器
 | ||||
| class InputManager | ||||
| { | ||||
| 	friend class Node; | ||||
| 
 | ||||
| public: | ||||
| 	// 获取碰撞体管理器实例
 | ||||
| 	static InputManager * getInstance(); | ||||
| 
 | ||||
| 	// 销毁实例
 | ||||
| 	static void destroyInstance(); | ||||
| 
 | ||||
| 	// 添加输入监听
 | ||||
| 	Listener * addListener( | ||||
| 		const Function& func,		/* 监听到用户输入时的执行函数 */ | ||||
| 		const String& name = L"",	/* 监听器名称 */ | ||||
| 		bool paused = false			/* 是否暂停 */ | ||||
| 	); | ||||
| 
 | ||||
| 	// 添加碰撞监听
 | ||||
| 	void addListener( | ||||
| 		Listener * listener			/* 监听器 */ | ||||
| 	); | ||||
| 
 | ||||
| 	// 移除监听器
 | ||||
| 	void removeListener( | ||||
| 		Listener * listener			/* 监听器 */ | ||||
| 	); | ||||
| 
 | ||||
| 	// 启动输入监听
 | ||||
| 	void startListener( | ||||
| 		const String& name | ||||
| 	); | ||||
| 
 | ||||
| 	// 停止输入监听
 | ||||
| 	void stopListener( | ||||
| 		const String& name | ||||
| 	); | ||||
| 
 | ||||
| 	// 移除输入监听
 | ||||
| 	void removeListener( | ||||
| 		const String& name | ||||
| 	); | ||||
| 
 | ||||
| 	// 启动所有监听器
 | ||||
| 	void startAllListeners(); | ||||
| 
 | ||||
| 	// 停止所有监听器
 | ||||
| 	void stopAllListeners(); | ||||
| 
 | ||||
| 	// 移除所有监听器
 | ||||
| 	void removeAllListeners(); | ||||
| 
 | ||||
| 	// 强制清空所有监听器
 | ||||
| 	void clearAllListeners(); | ||||
| 
 | ||||
| 	// 更新监听器
 | ||||
| 	void update(); | ||||
| 
 | ||||
| private: | ||||
| 	InputManager(); | ||||
| 
 | ||||
| 	~InputManager(); | ||||
| 
 | ||||
| 	E2D_DISABLE_COPY(InputManager); | ||||
| 
 | ||||
| private: | ||||
| 	std::vector<Listener*> _listeners; | ||||
| 
 | ||||
| 	static InputManager * _instance; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // 碰撞体管理器
 | ||||
| class CollisionManager | ||||
| { | ||||
|  | @ -277,53 +212,6 @@ public: | |||
| 		const String& name2 | ||||
| 	); | ||||
| 
 | ||||
| 	// 获取碰撞事件
 | ||||
| 	Collision getCollision() const; | ||||
| 
 | ||||
| 	// 添加碰撞监听
 | ||||
| 	Listener * addListener( | ||||
| 		const Function& func,		/* 监听到碰撞时的执行函数 */ | ||||
| 		const String& name = L"",	/* 监听器名称 */ | ||||
| 		bool paused = false			/* 是否暂停 */ | ||||
| 	); | ||||
| 
 | ||||
| 	// 添加碰撞监听
 | ||||
| 	void addListener( | ||||
| 		Listener * listener			/* 监听器 */ | ||||
| 	); | ||||
| 
 | ||||
| 	// 移除监听器
 | ||||
| 	void removeListener( | ||||
| 		Listener * listener			/* 监听器 */ | ||||
| 	); | ||||
| 
 | ||||
| 	// 启动碰撞监听
 | ||||
| 	void startListener( | ||||
| 		const String& name | ||||
| 	); | ||||
| 
 | ||||
| 	// 停止碰撞监听
 | ||||
| 	void stopListener( | ||||
| 		const String& name | ||||
| 	); | ||||
| 
 | ||||
| 	// 移除碰撞监听
 | ||||
| 	void removeListener( | ||||
| 		const String& name | ||||
| 	); | ||||
| 
 | ||||
| 	// 启动所有监听器
 | ||||
| 	void startAllListeners(); | ||||
| 
 | ||||
| 	// 停止所有监听器
 | ||||
| 	void stopAllListeners(); | ||||
| 
 | ||||
| 	// 移除所有监听器
 | ||||
| 	void removeAllListeners(); | ||||
| 
 | ||||
| 	// 强制清除所有监听器
 | ||||
| 	void clearAllListeners(); | ||||
| 
 | ||||
| private: | ||||
| 	CollisionManager(); | ||||
| 
 | ||||
|  | @ -346,14 +234,9 @@ private: | |||
| 		Collider* collider | ||||
| 	); | ||||
| 
 | ||||
| 	// 更新监听器
 | ||||
| 	void __updateListeners(); | ||||
| 
 | ||||
| private: | ||||
| 	Collision _collision; | ||||
| 	std::vector<Collider*> _colliders; | ||||
| 	std::vector<Listener*> _listeners; | ||||
| 	std::set<std::pair<UINT, UINT>> _collisionList; | ||||
| 	std::set<std::pair<size_t, size_t>> _collisionList; | ||||
| 
 | ||||
| 	static CollisionManager * _instance; | ||||
| }; | ||||
|  |  | |||
|  | @ -50,10 +50,16 @@ public: | |||
| 	// 渲染节点
 | ||||
| 	virtual void onRender() {} | ||||
| 
 | ||||
| 	// 节点发生碰撞
 | ||||
| 	virtual void onCollision( | ||||
| 		Collision other | ||||
| 	) {} | ||||
| 	// 按键消息
 | ||||
| 	// 说明:返回 false 将阻止消息继续传递
 | ||||
| 	virtual bool onKeyEvent(KeyEvent e) { return true; } | ||||
| 
 | ||||
| 	// 鼠标消息
 | ||||
| 	// 说明:返回 false 将阻止消息继续传递
 | ||||
| 	virtual bool onMouseEvent(MouseEvent e) { return true; } | ||||
| 
 | ||||
| 	// 碰撞消息
 | ||||
| 	virtual void onCollision(Collision collision) { } | ||||
| 
 | ||||
| 	// 获取节点显示状态
 | ||||
| 	virtual bool isVisible() const; | ||||
|  | @ -72,7 +78,7 @@ public: | |||
| 	virtual String getName() const; | ||||
| 
 | ||||
| 	// 获取节点名称的 Hash 值
 | ||||
| 	virtual unsigned int getHashName() const; | ||||
| 	virtual size_t getHashName() const; | ||||
| 
 | ||||
| 	// 获取节点绘图顺序
 | ||||
| 	virtual int getOrder() const; | ||||
|  | @ -388,6 +394,16 @@ public: | |||
| 	// 更新转换矩阵
 | ||||
| 	void updateTransform(); | ||||
| 
 | ||||
| 	// 分发鼠标消息
 | ||||
| 	bool dispatch( | ||||
| 		const MouseEvent& e | ||||
| 	); | ||||
| 
 | ||||
| 	// 分发按键消息
 | ||||
| 	bool dispatch( | ||||
| 		const KeyEvent& e | ||||
| 	); | ||||
| 
 | ||||
| protected: | ||||
| 	E2D_DISABLE_COPY(Node); | ||||
| 
 | ||||
|  | @ -422,7 +438,7 @@ protected: | |||
| 
 | ||||
| protected: | ||||
| 	String		_name; | ||||
| 	unsigned	_hashName; | ||||
| 	size_t		_hashName; | ||||
| 	float		_posX; | ||||
| 	float		_posY; | ||||
| 	float		_width; | ||||
|  |  | |||
|  | @ -377,59 +377,6 @@ private: | |||
| }; | ||||
| 
 | ||||
| 
 | ||||
| class InputManager; | ||||
| class CollisionManager; | ||||
| 
 | ||||
| // 监听器
 | ||||
| class Listener : | ||||
| 	public Ref | ||||
| { | ||||
| 	friend class InputManager; | ||||
| 	friend class CollisionManager; | ||||
| 
 | ||||
| public: | ||||
| 	Listener(); | ||||
| 
 | ||||
| 	explicit Listener( | ||||
| 		const Function& func, | ||||
| 		const String& name, | ||||
| 		bool paused | ||||
| 	); | ||||
| 
 | ||||
| 	// 启动监听
 | ||||
| 	void start(); | ||||
| 
 | ||||
| 	// 停止监听
 | ||||
| 	void stop(); | ||||
| 
 | ||||
| 	// 获取监听器运行状态
 | ||||
| 	bool isRunning() const; | ||||
| 
 | ||||
| 	// 获取名称
 | ||||
| 	String getName() const; | ||||
| 
 | ||||
| 	// 设置名称
 | ||||
| 	void setName( | ||||
| 		const String& name | ||||
| 	); | ||||
| 
 | ||||
| 	// 设置监听回调函数
 | ||||
| 	void setFunc( | ||||
| 		const Function& func | ||||
| 	); | ||||
| 
 | ||||
| protected: | ||||
| 	// 更新监听器状态
 | ||||
| 	virtual void _update(); | ||||
| 
 | ||||
| protected: | ||||
| 	bool _running; | ||||
| 	bool _stopped; | ||||
| 	String _name; | ||||
| 	Function _callback; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // 数据管理工具
 | ||||
| class Data | ||||
| { | ||||
|  |  | |||
|  | @ -93,7 +93,6 @@ | |||
|     <ClCompile Include="..\..\core\Node\ToggleButton.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Tool\Data.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Tool\File.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Tool\Listener.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Tool\Music.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Tool\Path.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Tool\Player.cpp" /> | ||||
|  |  | |||
|  | @ -212,9 +212,6 @@ | |||
|     <ClCompile Include="..\..\core\Tool\Data.cpp"> | ||||
|       <Filter>Tool</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\core\Tool\Listener.cpp"> | ||||
|       <Filter>Tool</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\core\Tool\Music.cpp"> | ||||
|       <Filter>Tool</Filter> | ||||
|     </ClCompile> | ||||
|  |  | |||
|  | @ -237,7 +237,6 @@ | |||
|     <ClCompile Include="..\..\core\Node\ToggleButton.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Tool\Data.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Tool\File.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Tool\Listener.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Tool\Music.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Tool\Path.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Tool\Player.cpp" /> | ||||
|  |  | |||
|  | @ -212,9 +212,6 @@ | |||
|     <ClCompile Include="..\..\core\Tool\Data.cpp"> | ||||
|       <Filter>Tool</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\core\Tool\Listener.cpp"> | ||||
|       <Filter>Tool</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\core\Tool\Music.cpp"> | ||||
|       <Filter>Tool</Filter> | ||||
|     </ClCompile> | ||||
|  |  | |||
|  | @ -222,7 +222,6 @@ | |||
|     <ClCompile Include="..\..\core\Base\Time.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Base\Window.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Common\Collider.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Common\Collision.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Common\Color.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Common\Config.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Common\Font.cpp" /> | ||||
|  | @ -239,9 +238,11 @@ | |||
|     <ClCompile Include="..\..\core\Custom\SystemException.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Custom\TextRenderer.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Custom\VoiceCallback.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Event\Collision.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Event\KeyEvent.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Event\MouseEvent.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Manager\ActionManager.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Manager\CollisionManager.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Manager\InputManager.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Manager\SceneManager.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Node\Button.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Node\ToggleButton.cpp" /> | ||||
|  | @ -256,7 +257,6 @@ | |||
|     <ClCompile Include="..\..\core\Node\Text.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Tool\Data.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Tool\File.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Tool\Listener.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Tool\Music.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Tool\Path.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Tool\Player.cpp" /> | ||||
|  |  | |||
|  | @ -28,6 +28,9 @@ | |||
|     <Filter Include="Custom"> | ||||
|       <UniqueIdentifier>{3475b59d-d50c-43b1-8334-bcb9e1703ed2}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="Event"> | ||||
|       <UniqueIdentifier>{6c9657de-02d5-4d3b-9e1d-bc921eb5aea3}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClCompile Include="..\..\core\Base\Input.cpp"> | ||||
|  | @ -174,9 +177,6 @@ | |||
|     <ClCompile Include="..\..\core\Custom\TextRenderer.cpp"> | ||||
|       <Filter>Custom</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\core\Tool\Listener.cpp"> | ||||
|       <Filter>Tool</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\core\Common\Font.cpp"> | ||||
|       <Filter>Common</Filter> | ||||
|     </ClCompile> | ||||
|  | @ -240,11 +240,14 @@ | |||
|     <ClCompile Include="..\..\core\Manager\CollisionManager.cpp"> | ||||
|       <Filter>Manager</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\core\Manager\InputManager.cpp"> | ||||
|       <Filter>Manager</Filter> | ||||
|     <ClCompile Include="..\..\core\Event\MouseEvent.cpp"> | ||||
|       <Filter>Event</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\core\Common\Collision.cpp"> | ||||
|       <Filter>Common</Filter> | ||||
|     <ClCompile Include="..\..\core\Event\KeyEvent.cpp"> | ||||
|       <Filter>Event</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\core\Event\Collision.cpp"> | ||||
|       <Filter>Event</Filter> | ||||
|     </ClCompile> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue