224 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			224 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | #include "..\easy2d.h"
 | |||
|  | #include "..\EasyX\easyx.h"
 | |||
|  | 
 | |||
|  | // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | static std::vector<MouseMsg*> s_vListeners; | |||
|  | 
 | |||
|  | // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
 | |||
|  | static MOUSEMSG s_mouseMsg; | |||
|  | 
 | |||
|  | void MouseMsg::__exec() | |||
|  | { | |||
|  | 	// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
 | |||
|  | 	while (MouseHit()) | |||
|  | 	{ | |||
|  | 		// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
 | |||
|  | 		s_mouseMsg = GetMouseMsg(); | |||
|  | 		// ִ<>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 		EApp::get()->getCurrentScene()->_exec(); | |||
|  | 		// ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 		for (auto l : s_vListeners)	// ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 		{ | |||
|  | 			if (!l->m_bWaiting && l->m_bRunning) | |||
|  | 			{ | |||
|  | 				l->onMouseMsg();	// ִ<>лص<D0BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 			} | |||
|  | 		} | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | MouseMsg::MouseMsg() : | |||
|  | 	m_callback([]() {}), | |||
|  | 	m_pParentScene(nullptr), | |||
|  | 	m_bRunning(true), | |||
|  | 	m_bWaiting(false) | |||
|  | { | |||
|  | } | |||
|  | 
 | |||
|  | MouseMsg::MouseMsg(TString name, const MOUSE_CALLBACK & callback) : | |||
|  | 	m_sName(name), | |||
|  | 	m_callback(callback), | |||
|  | 	m_pParentScene(nullptr), | |||
|  | 	m_bRunning(true), | |||
|  | 	m_bWaiting(false) | |||
|  | { | |||
|  | } | |||
|  | 
 | |||
|  | MouseMsg::~MouseMsg() | |||
|  | { | |||
|  | } | |||
|  | 
 | |||
|  | void MouseMsg::onMouseMsg() | |||
|  | { | |||
|  | 	m_callback(); | |||
|  | } | |||
|  | 
 | |||
|  | void MouseMsg::addListener(TString name, const MOUSE_CALLBACK & callback) | |||
|  | { | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD>µļ<C2B5><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 	auto listener = new MouseMsg(name, callback); | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 	listener->m_pParentScene = EApp::getLoadingScene(); | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD>µİ<C2B5><C4B0><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 	s_vListeners.push_back(listener); | |||
|  | } | |||
|  | 
 | |||
|  | void MouseMsg::startListener(TString name) | |||
|  | { | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 	for (auto l : s_vListeners) | |||
|  | 	{ | |||
|  | 		if (l->m_sName == name && l->m_pParentScene == EApp::getCurrentScene()) | |||
|  | 		{ | |||
|  | 			l->start(); | |||
|  | 		} | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | void MouseMsg::stopListener(TString name) | |||
|  | { | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 	for (auto l : s_vListeners) | |||
|  | 	{ | |||
|  | 		if (l->m_sName == name && l->m_pParentScene == EApp::getCurrentScene()) | |||
|  | 		{ | |||
|  | 			l->stop(); | |||
|  | 		} | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | void MouseMsg::delListener(TString name) | |||
|  | { | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 	std::vector<MouseMsg*>::iterator iter; | |||
|  | 	// ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 	for (iter = s_vListeners.begin(); iter != s_vListeners.end();) | |||
|  | 	{ | |||
|  | 		// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>Ƶļ<C6B5><C4BC><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 		if ((*iter)->m_sName == name && (*iter)->m_pParentScene == EApp::getCurrentScene()) | |||
|  | 		{ | |||
|  | 			// ɾ<><C9BE><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
 | |||
|  | 			delete (*iter); | |||
|  | 			iter = s_vListeners.erase(iter); | |||
|  | 		} | |||
|  | 		else | |||
|  | 		{ | |||
|  | 			iter++; | |||
|  | 		} | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | void MouseMsg::start() | |||
|  | { | |||
|  | 	m_bRunning = true; | |||
|  | } | |||
|  | 
 | |||
|  | void MouseMsg::stop() | |||
|  | { | |||
|  | 	m_bRunning = false; | |||
|  | } | |||
|  | 
 | |||
|  | void MouseMsg::wait() | |||
|  | { | |||
|  | 	m_bWaiting = true; | |||
|  | } | |||
|  | 
 | |||
|  | void MouseMsg::notify() | |||
|  | { | |||
|  | 	m_bWaiting = false; | |||
|  | } | |||
|  | 
 | |||
|  | void MouseMsg::clearAllListeners() | |||
|  | { | |||
|  | 	// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 	for (auto l : s_vListeners) | |||
|  | 	{ | |||
|  | 		delete l; | |||
|  | 	} | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 	s_vListeners.clear(); | |||
|  | } | |||
|  | 
 | |||
|  | void MouseMsg::notifyAllSceneListeners(EScene * scene) | |||
|  | { | |||
|  | 	for (auto l : s_vListeners) | |||
|  | 	{ | |||
|  | 		if (l->m_pParentScene == scene) | |||
|  | 		{ | |||
|  | 			l->notify(); | |||
|  | 		} | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | void MouseMsg::waitAllSceneListeners(EScene * scene) | |||
|  | { | |||
|  | 	for (auto l : s_vListeners) | |||
|  | 	{ | |||
|  | 		if (l->m_pParentScene == scene) | |||
|  | 		{ | |||
|  | 			l->wait(); | |||
|  | 		} | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | void MouseMsg::clearAllSceneListeners(EScene * scene) | |||
|  | { | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 	std::vector<MouseMsg*>::iterator iter; | |||
|  | 	// ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 	for (iter = s_vListeners.begin(); iter != s_vListeners.end();) | |||
|  | 	{ | |||
|  | 		// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>Ƶļ<C6B5><C4BC><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 		if ((*iter)->m_pParentScene == scene) | |||
|  | 		{ | |||
|  | 			// ɾ<><C9BE><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
 | |||
|  | 			delete (*iter); | |||
|  | 			iter = s_vListeners.erase(iter); | |||
|  | 		} | |||
|  | 		else | |||
|  | 		{ | |||
|  | 			iter++; | |||
|  | 		} | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | bool MouseMsg::isLButtonDown() | |||
|  | { | |||
|  | 	return s_mouseMsg.mkLButton; | |||
|  | } | |||
|  | 
 | |||
|  | bool MouseMsg::isRButtonDown() | |||
|  | { | |||
|  | 	return s_mouseMsg.mkRButton; | |||
|  | } | |||
|  | 
 | |||
|  | bool MouseMsg::isMButtonDown() | |||
|  | { | |||
|  | 	return s_mouseMsg.mkMButton; | |||
|  | } | |||
|  | 
 | |||
|  | int MouseMsg::getX() | |||
|  | { | |||
|  | 	return s_mouseMsg.x; | |||
|  | } | |||
|  | 
 | |||
|  | int MouseMsg::getY() | |||
|  | { | |||
|  | 	return s_mouseMsg.y; | |||
|  | } | |||
|  | 
 | |||
|  | CPoint MouseMsg::getPos() | |||
|  | { | |||
|  | 	return CPoint(s_mouseMsg.x, s_mouseMsg.y); | |||
|  | } | |||
|  | 
 | |||
|  | int MouseMsg::getWheel() | |||
|  | { | |||
|  | 	return s_mouseMsg.wheel; | |||
|  | } | |||
|  | 
 | |||
|  | MouseMsg::MESSAGE MouseMsg::getMsg() | |||
|  | { | |||
|  | 	return MESSAGE(s_mouseMsg.uMsg); | |||
|  | } |