ccc1.1的runaction的问题

想要一个node runaction后, 另一个node开始run另一个action该如何做,
将后一个动作用回调的方式触发, 总是报错误

比如
self.node.runAction(cc.sequence(
cc.moveTo(duration, cc.p(dist.x, self.node.y)),
postProcessor));

postProcessor是另一个node的runAction的callFunc封装

报什么错?能把你的代码贴上来看一下吗?

Simulator : jsb ERROR: File /Users/nantas/fireball-x/cocos2d-x-prebuilt/cocos/scripting/js-bindings/auto/jsb_cocos2dx_auto.cpp: Line: 16261, Function: js_cocos2dx_MoveBy_create
Simulator : js_cocos2dx_MoveBy_create : Error processing arguments
Simulator : /Applications/CocosCreator.app/Contents/Resources/cocos2d-x/simulator/mac/Simulator.app/Contents/Resources/script/jsb_cocos2d.js:2482:Error: js_cocos2dx_MoveBy_create : Error processing arguments
Simulator : ScriptingCore::callFunctionName error:__errorHandler wasn’t found!

你的源码贴上来看看

简化后的代码:

调用处
this.entity.moveTo(cc.p(this.entity.anchorX, 0),
cc.callFunc(this.map.moveLeft, this.map, distance));

moveTo, 及 moveLeft
moveLeft: function (distance) {
var self = this;
var duration = distance / (Global.SPEED * self.speedFactor);
self.node.runAction(cc.moveTo(duration, cc.p(self.node.x - distance, self.node.y)));
},

moveTo: function (dist, postProcessor) {
    var self = this;
    var distance = Math.abs(dist.x - self.node.x);
    var duration = distance / (Global.SPEED * self.speedFactor);
    self.node.runAction(cc.sequence(
        cc.moveTo(duration, cc.p(dist.x, self.node.y)),
        postProcessor));

}

moveTo及moveLeft所持有的node不是同一个

有moveBy, 这里没有vec2类型, distance是转换后的一个数值。

刚仔细跟踪了下, 在调用cc.callFunc(this.map.moveLeft, this.map, distance));
这个distance传递的是一个数值, 但是在真正执行的时候这个distance变成了cc_Node类型
不知道为什么

额,刚刚看错了,如果有空的话可以做一个能够重现的简单工程传上来我帮你看看,当然我也不一定能找出来是哪里错了:joy:

呃, 好的。

test.zip (1.4 MB)上传中…

简化工程, 终于上传成功了

基本上可以认为是callFunc的data参数绑定有问题

文件CCActionInstant.js中CallFunc中的execute方法中的this.target是做什么的, 应该是误传的吧?

execute:function () {
if (this._function) {
this._function.call(this._selectorTarget, this.target, this._data);
}
},

如果是这个问题的话, 我该如何操作, 以便本地引擎可以生效?

不好意思啊,下午有事,现在还在外面,只有明天帮你看看

费了半个小时,终于找到问题了

cc.callFunc调用的函数,默认有一个node类型的参数

自定义传递的参数是第二个

所以你cc.callFunc调用的函数的参数列表应该有两个参数才正确

第一个就是node,经过我的测试,node就是执行cc.callFunc动作的node

第二个才是你要传递的参数,所以,应该像这样

这样就能正确执行了

还有,为啥一个简单的动作效果非要弄四个脚本组件继承来继承去的:joy:

自从我用creator后,就再也没碰过继承这个东西了(我才不会说是我不熟悉prototype,不会用继承,搞不清楚,觉得麻烦,思路不清楚),你的所有操作一个脚本组件就应该够了的:joy:

顺便 @nantas @panda @jare 关于这个cc.callFunc,希望有空的时候弄个文档,或者在API文档的示例里说明一下,谢谢各位大神:blush:

这里的第二个参数this.target应该就是回调函数里的第一个参,data应该就是回调函数的第二个参数,因为我没弄明白call,也不熟悉creator底层,所以浪费很多时间来测试:sweat_smile:

多谢atmy, 这个例子只是一个示意,实际程序比较复杂, 所以这里有个继承。
但是这个cc.callFunc感觉还是有点奇怪, 因为实际上并不需要node这个参数,放在这里挺多余。 不过还是多谢atmy

不客气,应该是考虑到可能开发者要获取到动作执行者,所以才加入target参数的,就像触摸回调或者其他回调一样,因为有时候要知道是谁在执行,所以会传个target,只是希望官方在API文档里说明一下:joy:

是的, api的文档中只给了两个例子, 一个是不带参数的, 一个是带参数boolean的。 我也是在调试时发现多了个target, 还以为是误传的。