cocos2dx 自定义事件

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值