cocos2dx EventListenerCustom类控制事件的分发 处理不同层之间的事件传递以及自定义用户数据

头文件

#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

cpp文件

#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");

也可以在添加同一个事件的时候传递不同的用户数据,可以是int*,char*(其余的类型没测试,应该也可以,其实就是传递一个地址过去)

示例:


发送用户数据

<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;
	});



你可能感兴趣的:(cocos2dx EventListenerCustom类控制事件的分发 处理不同层之间的事件传递以及自定义用户数据)