头文件
#ifndef _EVENT_CENTER_H_ #define _EVENT_CENTER_H_ #include "cocos2d.h" #include <string> USING_NS_CC; using namespace std; static const string TEST_EVENT_DISPATCH = "TEST_EVENT_DISPATCH";//测试时间分发 class EventCenter { public: typedef std::function<void(EventCustom*)> EventFun; virtual ~EventCenter(); public: static EventCenter *getInstance(); void release(); public: //发送事件,name:事件名字 void dispatchEvent(const std::string &eventName); void dispatchEvent(const std::string &eventName, void *object); EventListenerCustom* addListener(const std::string &eventName,const EventFun& callback); //删除侦听 void removeListener(EventListenerCustom* pListener); /* 移除侦听 */ void removeListener(const std::string& eventName); /* 移除所有侦听 */ void removeAllListeners(); private: void init(); EventCenter(); private: EventDispatcher* _eventDispatcher; std::map<std::string,EventListenerCustom*> m_hasAddEvtList;//已经侦听的事件 }; #endif
#include "EventCenter.h" #include <algorithm> EventCenter::~EventCenter() { removeAllListeners(); _eventDispatcher->release(); } EventCenter::EventCenter() { } void EventCenter::init() { Director *director = Director::getInstance(); _eventDispatcher = director->getEventDispatcher(); _eventDispatcher->retain(); } static EventCenter *s_pInstance = NULL; // pointer to singleton EventCenter* EventCenter::getInstance() { if (s_pInstance == NULL) { s_pInstance = new EventCenter(); if (s_pInstance) { s_pInstance->init(); } } return s_pInstance; } //发送事件,name:事件名字 void EventCenter::dispatchEvent(const std::string &eventName) { _eventDispatcher->dispatchCustomEvent(eventName); } void EventCenter::dispatchEvent(const std::string &eventName, void *object) { _eventDispatcher->dispatchCustomEvent(eventName,object); } EventListenerCustom* EventCenter::addListener(const std::string &eventName,const std::function<void(EventCustom*)>& callback) { removeListener(eventName); EventListenerCustom* evt = _eventDispatcher->addCustomEventListener(eventName,callback); m_hasAddEvtList[eventName] = evt; return evt; } //删除侦听 void EventCenter::removeListener(EventListenerCustom* pListener) { if(pListener == nullptr) { return; } for(std::map<std::string,EventListenerCustom*>::iterator iter = m_hasAddEvtList.begin();iter != m_hasAddEvtList.end();++iter) { if(iter->second == pListener) { m_hasAddEvtList.erase(iter); break; } } _eventDispatcher->removeEventListener(pListener); } void EventCenter::release() { s_pInstance = nullptr; delete this; } void EventCenter::removeListener(const std::string& eventName) { if(m_hasAddEvtList.find(eventName) != m_hasAddEvtList.end()) { removeListener(m_hasAddEvtList[eventName]); } } void EventCenter::removeAllListeners() { for(auto& iter:m_hasAddEvtList) { _eventDispatcher->removeEventListener(iter.second); } m_hasAddEvtList.clear(); }
首先在事件发生之前添加监听(例如onEnter() 中)
EventCenter::getInstance()->addListener("TEST_EVENT_DISPATCH", [&](EventCustom*evt){ //添加收到该事件的相关处理 });
EventCenter::getInstance()->removeListener("TEST_EVENT_DISPATCH");
示例:
发送用户数据
<span style="white-space:pre"> </span>//传递char*类型数据 //EventCenter::getInstance()->dispatchEvent("TEST_EVENT_DISPATCH", "123"); //传递int*类型数据 int pSendData = 423; EventCenter::getInstance()->dispatchEvent("TEST_EVENT_DISPATCH", &pSendData);
接收用户数据:
<span style="white-space:pre"> </span>EventCenter::getInstance()->addListener("TEST_EVENT_DISPATCH", [&](EventCustom*evt){ //接受char* 类型用户数据 //char* reciveint = static_cast<char*>(evt->getUserData()); //接受int* 类型用户数据 int *recieveInt = static_cast<int*>(evt->getUserData()); int datsfsf = *recieveInt; });