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]();
}
}
}
cocos2d-js 自定义事件监听派发的更多相关文章
- [问题贴]mui.openWindow+自定义事件监听操作让alert()执行两次
仔细看,Alert函数执行了两次 共两个页面:index.html和detail.html, detail.html为按钮设置了自定义事件监听(newsId),触发alert. 在index.html ...
- js添加事件监听的方式与this
js添加事件监听与this js添加事件监听的方式与this 在标签中调用自定义函数 DOM0级事件处理程序 DOM2级事件处理程序 this 代表谁? js添加事件监听的方式与this <di ...
- JS通用事件监听函数
JS通用事件监听函数 版本一 //把它全部封装到一个对象中 var obj={ readyEvent:function (fn){ if(fn==null){ fn=document; } var o ...
- Java Spring 自定义事件监听
ApplicationContext 事件 定义一个context的起动监听事件 import org.springframework.context.ApplicationListener; imp ...
- JS的事件监听机制
很久以前有个叫Netscape的姑娘,她制订了Javascript的一套事件驱动机制(即事件捕获) 后来又有一个叫“IE”的小子,这孩子比较傲气,他认为“凭什么我要依照你的规则走”,于是他又创造了一套 ...
- JS之事件监听
一 如果事件监听类似于如下写法,则最终只会执行最后一个事件监听,其他监听都会被覆盖掉. window.onload=funtion(){console.log(1);}; window.onload= ...
- js实现事件监听与阻止监听传播
监听事件: 使用attachEvent(用于IE)和addEventListener(用于谷歌.火狐)时则可以实现多个事件处理函数的调用 1.下面都是dom对象的方法,可以实现一种事件绑定多个事件处理 ...
- Node.js之事件监听和发送
演示事件的发送和监听 const events = require("events"); function Account() { this.balance = 0; events ...
- cocos2d JS 自定义事件分发器(接收与传递数据) eventManager
简而言之,它不是由系统自动触发,而是人为的干涉 较多情况用于传递数据 var _listener1 = cc.EventListener.create({ event: cc.EventListene ...
随机推荐
- JUnit4单元测试入门教程
本文按以下顺序讲解JUnit4的使用 下载jar包 单元测试初体验 自动生成测试类 执行顺序 @Test的属性 下载jar包## 下载地址 在github上,把以下两个jar包都下载下来. 下 ...
- Django静态文件的加载以及STATIC_URL、 STATIC_ROOT 、STATICFILES_DIRS的区别
Djangon生产环境静态资源的处理 Django 关闭DEBUG模式后,就相当于是生产环境了. Django框架一旦作为生产环境,它的静态文件访问接口就不应该从Django框架中走,必须在Djang ...
- FinalizableReference, FinalizablePhantomReference, FinalizableReferenceQueue
FinalizableReference /* * Copyright (C) 2007 The Guava Authors * * Licensed under the Apache License ...
- tfjob的一篇文章,跟公司内使用方式类似
可以看一下这篇文章: https://yq.aliyun.com/articles/600601?spm=a2c4e.11153940.blogcont602109.12.2e241125zH1kNB
- 一些非常实用的JSON 教程
以下内容来自W3school. JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 ...
- JS里关于事件的常被考察的知识点:事件流、事件广播、原生JS实现事件代理
1.JS里面的事件流 DOM2级事件模型中规定了事件流的三个阶段:捕获阶段.目标阶段.冒泡阶段,低版本IE(IE8及以下版本)不支持捕获阶段 捕获事件流:Netscape提出的事件流,即事件由页面元素 ...
- 知乎:GAN 的发展对于研究通用人工智能有什么意义?
https://www.zhihu.com/question/57668112/answer/155367561 Lyken 愿以有涯随无涯 收录于 编辑推荐知乎圆桌 · 296 人赞同了该回答 资历 ...
- LDA(latent dirichlet allocation)的应用
http://www.52ml.net/1917.html 主题模型LDA(latent dirichlet allocation)的应用还是很广泛的,之前我自己在检索.图像分类.文本分类.用户评论的 ...
- PHP文件操作[总结]
1.前言 工作中涉及到数据处理,后台需要用到PHP处理数据,之前没有接触过PHP,借此机会了解了一下PHP,PHP很方便,很灵活,编码很舒服,很喜欢用PHP处理后台数据.今天总结一下php文件操作,主 ...
- FireDAC中的SQLite(一)
Windows client software,FireDAC supports two SQLite library linking modes: Static linking: the x86 s ...