以后有啥特殊的功能需求,不好实现的,多多讨论哈,这个demo主要是实现回调的功能,不多说看图:
我做了两个预制体.想要这两个预制体进行数据通信,所以,就采用了回调的方式,具体实现,感兴趣的看代码吧,我感觉这个功能在游戏中挺常用的就拿出来分享了
![](https://forum.cocos.org/uploads/default/original/2X/3/38b95031238fe2812cd8b527c09f23daf81ca653.gif)
以后有啥特殊的功能需求,不好实现的,多多讨论哈,这个demo主要是实现回调的功能,不多说看图:
赞一个,非常棒
顶(手动斜眼,三千预算进卡巴)
手工赞。
我是很希望cocos论坛回到几年前的样子,大家心态平和地讨论技术,没有那么多伸手党,会激烈争论游戏设计问题,不是有人放出代码炫技一把。
现在论坛,放眼望去基本就是FAQ的样子了……
可以参考白鹭论坛,有专门的FAQ,有专门的BUG专区,有专门的教程专区,就是简单的归类,我感觉这个算是白鹭论坛的优点之处,可以参考下
我是从cocos一路过来的,后来了解了有半年的白鹭,也看着白鹭慢慢走向成熟,creater现在我感觉还是算个baby,加油吧,有啥好的想法我会及时在论坛发帖,可以作为参考
恕我直言看不懂你这样做的意义, javascript语言本身就可以实现你想要的功能, 你可以看看Function.prototype.bind函数的用法
Item.js的修改
onClickItem1: function(){
this._onClickHandler([this._data + "1"]);
},
onClickItem2: function(){
this._onClickHandler([this._data + "2"]);
},
setOnClickHandler: function(handler){
this._onClickHandler = handler;
}
Main.js的修改
// use this for initialization
onLoad: function () {
for(var i = 0; i < 15; i++){
var item = cc.instantiate(this.item);
if(item) {
var script = item.getComponent("Item");
script.setData(i);
// var cb = new CallFunc();
// script._cb = cb.handle(this.onClickBtn, this, null);
script.setOnClickHandler(this.onClickBtn.bind(this, "this is a binded data"));
this.scrollerView.content.addChild(item);
}
}
},
// dataBinded是通过bind增加的参数, data是调用回调的时候传入的参数
onClickBtn(dataBinded, data){
this.label.string = "点击了按钮: " + dataBinded.toString() + data.toString();
var item = cc.instantiate(this.msg);
this.node.addChild(item);
var script = item.getComponent("Msg");
script.setData(data);
}
其实我需要一个解决方案来解决如何在另一个函数中保持this上下文,我是用call, apply解决的, Function.prototype.bind(),这个真的不知道,这下好了,又学到了一个简单的解决方案,谢谢
Function.prototype.bind 在IE8及以下的版本中不被支持,所以如果你没有一个备用方案的话,可能在运行时会出现问题。
bind函数的效率不高,还没有bind函数之前一般是用闭包来解决这类问题
var self = this;
var dataBinded = "this is a binded data";
script.setOnClickHandler(function(data){
self.onClickBtn(dataBinded, data);
})
如果觉得这样的代码比较难看,可以像cocos2d-lua中提供的handler函数那样实现一个看起来比较优雅的接口,但是这样无法在设置回调的时候绑定参数(因为这种需求并不常见)
cc.handler = function(caller, callee){
return function(){
callee.apply(caller, arguments)
}
}
script.setOnClickHandler(cc.handler(this, this.onClickBtn));
如果一定要在生成handler时绑定参数的话可以参考下面的代码
cc.handler = function(caller, callee){
// 生成handler时传入的参数, 注意要移除前2个参数caller和callee
var binded = Array.prototype.slice.call(arguments).splice(2);
return function(){
// 将生成handler时传入的参数和调用handler时传入的参数合并成一组参数, 然后执行handler
callee.apply(caller, binded.concat(Array.prototype.slice.call(arguments)))
}
}
没有bind的时候可以自己手动写一个bind。
Function.prototype.bind = function(context){
var self = this;
return function(){
return self.apply(context,arguments);
}
};
最简单的写法。请勿纠结。
又是闭包,好累呀
都是高手!!!
习惯就好。JavaScript不就是这样嘛、