自己用creator一个月的心得,特贡献代码来了

以后有啥特殊的功能需求,不好实现的,多多讨论哈,这个demo主要是实现回调的功能,不多说看图:


我做了两个预制体.想要这两个预制体进行数据通信,所以,就采用了回调的方式,具体实现,感兴趣的看代码吧,我感觉这个功能在游戏中挺常用的就拿出来分享了
demo.zip (1.4 MB)

4赞

:kissing_heart:

赞一个,非常棒

顶(手动斜眼,三千预算进卡巴)

手工赞。
我是很希望cocos论坛回到几年前的样子,大家心态平和地讨论技术,没有那么多伸手党,会激烈争论游戏设计问题,不是有人放出代码炫技一把。

现在论坛,放眼望去基本就是FAQ的样子了……

可以参考白鹭论坛,有专门的FAQ,有专门的BUG专区,有专门的教程专区,就是简单的归类,我感觉这个算是白鹭论坛的优点之处,可以参考下:slightly_smiling:

我是从cocos一路过来的,后来了解了有半年的白鹭,也看着白鹭慢慢走向成熟,creater现在我感觉还是算个baby,加油吧,有啥好的想法我会及时在论坛发帖,可以作为参考:sweat_smile:

恕我直言看不懂你这样做的意义, 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(),这个真的不知道,这下好了,又学到了一个简单的解决方案,谢谢:joy:

Function.prototype.bind 在IE8及以下的版本中不被支持,所以如果你没有一个备用方案的话,可能在运行时会出现问题。:fearful:

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);
}
};

1赞

最简单的写法。请勿纠结。

又是闭包,好累呀:sweat_smile:

都是高手!!!

习惯就好。JavaScript不就是这样嘛、