UIWidget 和Action之间的兼容性。

widget 调用runAction是使用下面的代码。
CCAction* UIWidget::runAction(CCAction *action)
{
return m_pRenderer->runAction(action);
}

那么,使用widget调用runAction后,回调函数里面的pSender其实是widget对应的render,而不是这个widget自身。
因为这个原因,我就遇到了这样的问题。

直接上代码:

UILoadingBar* lbBoss = xxx.getWidgetByName("");
int* test = new int(1);
CCCallFuncND * funcallLb =
CCCallFuncND::create(this, callfuncN_selector(SingleFight::callbackShowXuePercent),test );

void SingleFight::callbackShowXuePercent( CCNode* sender, void* data )
{
UILoadingBar* xueLb= (UILoadingBar*) sender;
//问题就出在这里,看起来是一个UILoadingBar在调用action,实际上是这个loadingBar封装的node在调用,这样执行后面的代码就会出问题。我们现在只能把loadingBar通过void* data传过去,这样太难看了。请问有什么好的解决方法没?

int* hurtPercent = (int*)data;

xueLb->setPercent(*hurtPercent );

}

如果通过Renderer能得到封装他的widget这个问题就能很轻松的解决了。

button->runAction(CCSequence::create(CCMoveTo::create(2, CCPointZero),
CCCallFuncO::create(this, callfuncO_selector(UIButtonTest::selector), button),
NULL));
void UIButtonTest::selector(CCObject pObejct)
{
UIButton
button = static_cast<UIButton*>(pObejct);
if (button)
{
CCLOG(“can cast to UIButton”);
}
}
楼主你好,你看下这个方案吧,使用 callfuncO_selector这个宏函数能够传一个任意对象。不知能否帮你解决问题。

恩,比以前的方案好多了。用CCAarray把所有东西封装好丢进去。
谢谢了。

这个方法不错 但是在现在的lua中没有CallfuncO 这个问题在lua中该怎么解决呢

现在lua需要自己加吧,3.0会有lua扩展