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 条评论
登录 后参与评论

相关文章

来自专栏安恒网络空间安全讲武堂

从零基础到解题之 Python is the best language

-目录- 前言 环境搭建 源码结构 题目分析 Python is the best language1 Python is the best langua...

2684
来自专栏码神联盟

珍藏 | Java 岗位 【数据库】 面试题及答案详解

1522
来自专栏人工智能LeadAI

用Python使用C语言程序(Windows平台)

前言 在机器学习中,很多时候我们需要Python和C的混合编程,最重要的原因是为了性能效率的提升: 解释型语言一般比编译型语言慢,一般提高性能的有效做法是,先做...

3754
来自专栏Pythonista

Golang之Mysql事务

1362
来自专栏xingoo, 一个梦想做发明家的程序员

Java程序员的日常——经验贴(纯干货)二

继昨天的经验贴,今天的工作又收获不少。 windows下编辑器会给文件添加BOM 在windows的编辑器中,为了区分编码,通常会添加一个BOM标记。比如...

1999
来自专栏Golang语言社区

Golang 持久化

持久化 程序可以定义为算法+数据。算法是我们的代码逻辑,代码逻辑处理数据。数据的存在形式并不单一,可以存在数据库,文件。无论存在什么地方,处理数据的时候都需要把...

4019
来自专栏老马说编程

(56) 文件概述 / 计算机程序的思维逻辑

我们在日常电脑操作中,接触和处理最多的,除了上网,大概就是各种各样的文件了,从本节开始,我们就来探讨文件处理,本节主要介绍文件有关的一些基本概念和常识,Java...

1845
来自专栏tkokof 的技术,小趣及杂念

小话游戏脚本(三)

在此就heSript实现过程中的一些解决方案和自己的想法陈列一番,由于自己编程水平实在拙劣,又没什么实际经验,所以导致相关的代码非常糟糕,所以竭诚欢迎大家批评...

391
来自专栏数据和云

【错综复杂】一个执行计划异常变更的案例(中)

前文回顾: 一个执行计划异常变更的案例(上) 上篇文章我们说了,绑定变量实际是一些占位符,可以让仅查询条件不同的SQL语句可以重用解析树和执行计划,避免硬解析。...

2965
来自专栏大内老A

如何证明Application Domain的隔离性

Application Domain可以看作是一个Assembly的逻辑容器。在程序执行过程中,如果遇到需要的Type并没有定义在已经加载的Assemblies...

1777

扫码关注云+社区