cocos2dx里Director类里有一个_eventDispatcher成员变量,_eventDisptacher的类型是EventDispatcher。
对于EventDispatcher,只要是这个类的对象发送(通过dispatchEvent发送)的事件(EventCustrom对象),该对象的监听器(EventListenerCustom)就可以监听(通过addEventListenerWithFixedPriority或者addEventListenerWithSceneGraphPriority监听)到该事件。
这样,对于项目中,不管什么地方,只要监听该事件;然后不管什么地方,只要发送该事件,就可以直接调用得到。
比如:有三个按钮,按第一个时,需要按钮二和三高亮。
此时,可以按钮二和三监听一个事件,按钮一发送该事件即可。
当然,也可以按钮一拥有按钮二和按钮三的成员变量。
但是如果需求发生改变时,按钮二没有了,这时会影响到按钮一,按钮一的代码就要改动,不符合程序设计的单一职责原则。
这种事件监听和发送的机制就是程序设计模式中的一种。目的就是为了减少程序间的耦合性。
要知道,高内聚低耦合是程序设计的基本思想。
下面是实例代码:
_listener = EventListenerCustom::create("game_custom_event", [=](EventCustom* event){
std::string str("Custom event received, ");
char* buf = static_cast<char*>(event->getUserData());
str += buf;
str += " times";
statusLabel->setString(str.c_str());
});
Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(_listener, 1);
auto sendItem = MenuItemFont::create("Send Custom Event", [=](Ref* sender){
static int count = 0;
++count;
char* buf = new char[10];
sprintf(buf, "%d", count);
EventCustom event("game_custom_event");
Director::getInstance()->getEventDispatcher()->dispatchEvent(&event);
event.setUserData(buf);
_eventDispatcher->dispatchEvent(&event);
CC_SAFE_DELETE_ARRAY(buf);
});
上面的代码是cocos2dx NewEventDispatcherTest中的代码。其中做了一些改动,把原代码中的_eventDispatcher改成了上面的Director::getInstance()->getEventDispatcher()。cocos2dx里的Node类有一个_eventDispatcher成员变量,所以Node的子类也有。原代码中的_eventDispatcher就是这样一个变量,其实_eventDispatcher根本上就是Director::getInstance()->getEventDispatcher(),大家可以跟着原代码查看一下。
但是我个人觉得Node里的会让人产生歧义,会让人觉得只有Node里才有事件管理器,而没有全局的事件管理器。