cocos2dx 自定义事件

来源:互联网 发布:网络市场营销师 编辑:程序博客网 时间:2024/06/05 15:58

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里才有事件管理器,而没有全局的事件管理器。