cocos2d-js 自定义事件监听派发

熟悉js的dom事件或者flash事件的,基本都能立马明白cc.eventManager的用法。

cc.eventManager有两种注册监听器的方式,一种是原生事件,例如

cc.eventManager.addListener({ 
                event: cc.EventListener.KEYBOARD, 
                onKeyReleased: function(keyCode, event) { 
                    if (keyCode == cc.KEY.back) { 
                        cc.director.end(); 
                    } 
                }}, this);

addListener接受的是一个object。键盘事件、触摸事件等都是这样的。往往这个object的结构比较麻烦,每个事件都不一样。

另外是customEvent,例如已经接触过的进入后台和恢复事件:

    //进入后台 
    cc.eventManager.addCustomListener(cc.game.EVENT_HIDE, function(event){ 
        cc.log("cc.game.EVENT_HIDE!"); 
    }); 
    //恢复显示 
    cc.eventManager.addCustomListener(cc.game.EVENT_SHOW, function(event){ 
        cc.log("cc.game.EVENT_SHOW"); 
    });

这两个事件就比较简单,类似js和flash事件,只需要一个简单字符串+一个函数即可。

参数event是这样的结构:

其中userData是dispatch的时候附带的。

触发自定义事件的方式,也跟js和flash一致:

cc.eventManager.dispatchCustomEvent("xxxxxevent", {a:1,b:2});

通过这个dispatch就能得到上边图片所示的内容。

但removeListener就多少有点不方便了。对自定义事件,只支持全部移除

removeCustomListeners: function (customEventName)

不能单独移除某一个。

看官方的例子,貌似基本都不移除listener,可能js几个object内存并不显著吧。如果内存管理非常敏感的话,可能就需要自己写一个了。

/**
* Created by kenkozheng on 2014/8/20.
*/
var EventDispatcher = function() {
    this.init();
};
var p = EventDispatcher.prototype;

p._listenerMap = null;

p.init = function(){
    this._listenerMap = new Object();
};

/**
*
* @param event String
* @param callback function
*/
p.addListener = function(event, callback){
    if(!callback || !event)
        return;
    var listenerList = this._listenerMap[event];
    if(!listenerList)
        listenerList = this._listenerMap[event] = new Array();

    for (var i = 0; i < listenerList.length; i++) {
        if(listenerList[i] == callback)
            return;
    }
    listenerList.push(callback);
};

p.removeListener = function(event, callback){
    if(!callback || !event)
        return;
    var listenerList = this._listenerMap[event];
    if(listenerList)
    {
        for (var i = 0; i < listenerList.length; i++) {
            if(listenerList[i] == callback)
            {
                listenerList.splice(i, 1);
                return;
            }
        }
    }
};

/**
*
* @param event String
*/
p.dispatchEvent = function(event){
    if(this._listenerMap[event])
    {
        var listeners = this._listenerMap[event].slice();
        for (var i = 0; i < listeners.length; i++) {
            listeners[i]();
        }
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏超然的博客

高效开发之SASS篇

作为通往前端大神之路的普通的一只学鸟,最近接触了一样稍微高逼格一点的神器,特与大家分享~

791
来自专栏阮一峰的网络日志

Bookmarklet编写指南

前一段日子,我写了两个Bookmarklet----"短网址生成"和"短网址还原"。 它们用起来很方便,除了我本人之外,其他朋友也在用。第一次发布Bookmar...

4639
来自专栏葡萄城控件技术团队

.Net WinForm 控件键盘消息处理剖析

在WinForm控件上我们可以看到很多关于键盘消息处理的方法,比如OnKeyDown, OnKeyPress, ProcessCmdKey, ProcessDi...

20810
来自专栏SpringBoot

Jquery 常见案例

版权声明:本文为博主原创文章,未经博主允许不得转载。

1801
来自专栏前端儿

简单的文本框输入自动提示

简单的文本框输入自动提示--输入的时候可以直接异步加载数据库中匹配的项,然后显示出来。

1501
来自专栏小狼的世界

封装内容和功能 – YUI TabView使用小记

本文主要内容取自 Caridy Patino 在2008年发布的文章,原文中使用的是YUI2,笔者对例子做了一些更新,均使用了YUI3.1.1,文章中讨论的这个...

942
来自专栏web开发

JavaScript实现段落文本高亮

代码: <!doctype html> <html lang="en"> <head> <meta http-equiv="Content-Type" ...

2067
来自专栏君赏技术博客

一键替换Key Mac软件的制作教程第一篇

我们要选择macOS的平台选择Cocoa Application的工程模板,点击Next.

1331
来自专栏Android机动车

高效开发 MVVM 和 databinding 你需要使用的工具

有不少同学已经开始使用MVVM作为自己 Android 开发架构了,但实际上,网上有关 MVVM 的资料并不是很多,这主要是因为 MVVM 还是有一定使用门槛...

782
来自专栏一枝花算不算浪漫

ajax图片上传及FastDFS入门案例.

48111

扫码关注云+社区

领取腾讯云代金券