您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d-x编程中CCRemoveSelf与CCCallFunc系列函数不能一起使用

2014-08-19 17:08 537 查看
可能是“头晕”了,我在编码中随意写出了如下代码:
CCLabelTTF* lbl=CCLabelTTF::create("Hi, you have succeeded in buying this Power-up!", "Arial", 32);
lbl->setColor(ccc3(255,0,0));
lbl->setPosition(VisibleRect::center());
ul2->addChild(lbl,99);
CCActionInterval*  scaleto = CCScaleTo::create(2.0f, 2.5f);
CCActionInterval*  fadeout = CCFadeOut::create(2.0f);
CCLog("********************************");
CCAction*  s = CCSequence::create(
CCDelayTime::create(1),
scaleto,
fadeout,
CCRemoveSelf::create(),
CCCallFunc::create(this, callfunc_selector(StoreScene::callbackForBuyOK)),
NULL);
lbl->runAction(s);
//...
void StoreScene::callbackForBuyOK( CCObject* pSender )
{
UIButton* btnBuy = dynamic_cast<UIButton*>(ul2->getWidgetByName("Button_Buy"));
btnBuy->setEnabled(false);
}
我的想法很简单,可能你也猜测出了,就是当玩家购买某道具结束后,出现一个动态文字提示。而且,借助于CCRemoveSelf实现添加到场景中文本标签的自动移除。并且,在移除结束后,执行一个简短代码。

但是,实际运行上述代码时出现如下运行时错误:




相信,上述错误你有所了解。搜索了一下网络,有朋友在
http://azykise.blog.163.com/blog/static/1730802442011616103252723/

处给出如下解释:
这可能是函数调用约定不一致或者参数传递出错。
函数调用约定主要约束了两件事:
1.参数传递顺序
2.调用堆栈由谁(调用函数或被调用函数)清理
常见的函数调用约定:stdcall cdecl fastcall thiscall naked call
__stdcall表示
1.参数从右向左压入堆栈
2.函数被调用者修改堆栈
3.函数名自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸
用depends就可以看到函数的导出名。

而我的代码运行时错误停留在了如下位置:




总之吧,根据上述错误,可以大致判断出,错误在函数调用格式出了问题。结合上述图片位置和前面的代码,我大致判断出了如本文题目所示的结论,即CCRemoveSelf与CCCallFunc系列函数不能一起使用!

其实,进一步想来,上述两种Action也没有必要一起使用。于是,前面的代码可以修改为如下即可解决问题:

CCAction*  s = CCSequence::create(
CCDelayTime::create(1),
scaleto,
fadeout,
CCRemoveSelf::create(),
NULL);
lbl->runAction(s);
UIButton* btnBuy = dynamic_cast<UIButton*>(ul2->getWidgetByName("Button_Buy"));
btnBuy->setEnabled(false);


本文出自 “青峰” 博客,请务必保留此出处http://zhuxianzhong.blog.51cto.com/157061/1542156
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: