this.node.emit只能监听同一个节点的事件,请问怎么可以实现监听其它节点发出的事件,也就是全局事件?
var NOTIFICATION = (function (){
var eventList = {};
function on(type, callback, target) {
if (typeof type !== "string" || typeof callback !== "function" || typeof target === "undefined") {
cc.error("GLOBAL_DEF.js: NOTIFICATION method 'on' param error!");
return;
}
if (typeof eventList[type] === "undefined") {
eventList[type] = [];
}
eventList[type].push({callback: callback, target: target});
}
function once(type, callback, target) {
if (typeof type !== "string" || typeof callback !== "function" || typeof target === "undefined") {
cc.error("GLOBAL_DEF.js: NOTIFICATION method 'on' param error!");
return;
}
if (typeof eventList[type] === "undefined") {
eventList[type] = [];
}
eventList[type].push({callback: callback, target: target, once: true});
}
function emit(type, data) {
if (typeof type !== "string") {
cc.error("GLOBAL_DEF.js: NOTIFICATION method 'emit' param error!");
return;
}
var list = eventList[type];
if (typeof list !== "undefined") {
for (var i = 0; i < list.length; i++) {
var event = list[i];
if (event) {
event.callback.call(event.target, data);
if(event.once){
off(type, event.callback, event.target);
}
}
}
}
}
function off(type, callback, target) {
if (typeof type !== "string" || typeof callback !== "function" || typeof target === "undefined") {
cc.error("GLOBAL_DEF.js: NOTIFICATION method 'off' param error!");
return;
}
var list = eventList[type];
if (typeof list !== "undefined") {
for (var i = 0; i < list.length; i++) {
var event = list[i];
if (event && event.callback === callback && event.target === target) {
list.splice(i, 1);
break;
}
}
}
}
function offByType(type) {
if (typeof type !== "string") {
cc.error("GLOBAL_DEF.js: NOTIFICATION method 'offByType' param error!");
return;
}
while (eventList[type].length > 1) {
eventList[type].shift();
}
eventList[type] = undefined;
}
function offByTarget(target){
if (typeof target === "undefined") {
cc.error("GLOBAL_DEF.js: NOTIFICATION method 'offByTarget' param error!");
return;
}
for(var key in eventList){
for(var i = 0; i < eventList[key].length ; i++){
if(eventList[key][i].target === target){
eventList[key].splice(i, 1);
cc.log('off ' + key);
break;
}
}
}
}
return {on: on, once: once, emit: emit, off: off, offByType: offByType, offByTarget: offByTarget};
})();
修改自 @1111020
谢谢!
忘了说了,NOTIFICATION要放到插件脚本或者window上,这样才能全局监听和发射
所有节点统一在同一个全局对象上触发和监听事件即可
这个全局对象可以是全局节点,也可以是 window.globalEvent = new cc.EventTarget();
EventTarget 中 emit 函数的第二个参数无论传什么,在 on 监听的回调里,event.detail 都是undefined,难道数据不是这样传递的?
试试
event.getUserData()
event 对象不可持有,只能收到事件的当帧立刻获取里面的信息
厉害的我的哥,获取到数据了,文档上完全没有,完全猜不出来用法。。
event.getUserData(),原来是这样用
好像只有emit发射的事件才能用event.detail
我是用emit发射的,但是 event.detail 是undefined,event.getUserData()就可以获取
我不知道该说什么
EventCustom.prototype.getUserData = function () {
return this.detail;
};
为什么不用cc.systemEvent.on呢?这不就是全局事件吗?
这是 systemEvent,业务逻辑和系统逻辑混在一起不太好
能给一个完整 的范例吗?
a.js设置全局事件
b.js监听全局事件的
自定义的消息如何全局, 有没有监听和发射的例子?
可以用 eventproxy 功能强大
globalEvent.on(“shit”, function (event) { console.log(“eat”, event.detail); });
globalEvent.emit(“shit”, “see you tomorrow”);
输出
eat see you tomorrow
sendCardText : function(sp,node,CardText){
//传递事件
cc.find(‘ImageMyCard’).emit(“CardName”,
{CardText:CardText},
);
cc.testEvent= new cc.Event.EventCustom(“CardName”, false);
cc.testEvent.setUserData(CardText);
},
触摸精灵结束后触发,两个不同的节点,这是节点A,怎么发射。好迷茫。