『jsb』ui动画的回调崩溃,而且也无法知道是否已经播放完毕

我使用的是JSB进行开发。版本是2.2.2

发现
var cb = cc.CallFunc.create(this.callback, this);
cb->retain();//如果没有,会发现cb在调用时已经被释放掉
ccs.ActionManager.getInstance().getActionByName(“xx.UI.json”, “Animation0”, cb);

会导致崩溃

好吧,那么我就用scheduleUpdate来判断吧

结果发现 actionObject的getCurrentTime方法完全就是摆设,还有isPlaying也是永远false

而且也没有办法获得actionObject的帧数

这也太坑了吧?

对了补充一下,action的回调在c++下也是有问题的,也需要cb->retain();

感谢反馈,但是根据这个内容貌似播放方式不对。UI动画是不支持回调的,
在C++版本里,UI动画播放如下所示:
ActionManager::shareManager()->playActionByName(“UIAnimation.json” , “Animation1” );

明明有回调的方法啊!
/**
* Play an Action with a name.
*
* @param jsonName UI file name
*
* @param actionName action name in teh UIfile.
/
ActionObject
playActionByName(const char* jsonName,const char* actionName);

/**
* Play an Action with a name.
*
* @param jsonName  UI file name
*
* @param actionName  action name in teh UIfile.
*
* @param func ui action call back
*/
ActionObject* playActionByName(const char* jsonName,const char* actionName, CCCallFunc* func);

而且C++的是可以用的

明明有回调的方法啊!
/**
* Play an Action with a name.
*
* @param jsonName UI file name
*
* @param actionName action name in teh UIfile.
/
ActionObject
playActionByName(const char* jsonName,const char* actionName);

/** 
* Play an Action with a name. 
* 
* @param jsonName  UI file name 
* 
* @param actionName  action name in teh UIfile. 
* 
* @param func ui action call back 
*/ 
ActionObject* playActionByName(const char* jsonName,const char* actionName, CCCallFunc* func); 

而且C++的是可以用的

今天也碰到了该问题,跟踪了一下源代码。

出现此问题的原因在于,cc.CallFunc.create在JSB中是由CCCallFuncN来实现的,参考CCCallFuncN的execute实现可知,它内部会将m_pTarget作为唯一参数代入到callback函数中,当cc.CallFunc作为一个Action存在时,m_pTarget是一定存在的,但由于UI动画的ActionObject中,这个CallFunc并没有被当作一个行为被执行,而是由ActionObject直接调用,所以m_pTarget此时为空。

另外,所有cc.CallFunc中的selector和selectortarget,在JSB中都会别封装成JSCallFuncWrapper。参考JSCallFuncWrapper的callbackFunc接口的调用可知,函数内部并没有判断参数node是否为空。

两个原因共同导致下面该条语句崩溃:

js_proxy_t *proxy = js_get_or_create_proxycocos2d::CCNode(cx, node);

如果官方希望在js层只保留一个cc.CallFunc,那么建议修改一下JSCallFuncWrapper中的实现,使其能支持非action环境下的使用;或者为ActionObject提供一个单独的回调接口形式。

另外:

  1. 保存在ActionObject的CCCallback对象指针是一个weak ref,不知是何考虑。
  2. 当前ccs.ActionManager的实现,无法支持由一个json文件创建的多个ui实例的动画播放,不知后续是否有改进计划。

多谢。

楼上高手 膜拜