文章撰寫日期︰2013/03/18 15:00 cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1
一、問題
使用cocos2d::extension::CCBMemberVariableAssigner的callback:virtual bool onAssignCCBMemberVariable(cocos2d::CCObject * pTarget, cocos2d::CCString * pMemberVariableName, cocos2d::CCNode * pNode);來將CocosBuilder和Cocos2d-X源碼綁定時,
取出來的CCLabelTTF*無法setString,
產生EXC_BAD_ACCESS的問題。
我的原始碼是這樣子寫的︰
bool GameScene::onAssignCCBMemberVariable(cocos2d::CCObject * pTarget, cocos2d::CCString * pMemberVariableName, cocos2d::CCNode * pNode){ //Bind variables CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "label_question", CCLabelTTF *,GameScene::label_question); CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "label_choice1", CCLabelTTF *,GameScene::label_choice1); CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "label_choice2", CCLabelTTF *,GameScene::label_choice2); CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "label_choice3", CCLabelTTF *,GameScene::label_choice3); label_question->setString("六隻眼睛、八條腿、四隻手、一條尾巴,請問這是什麼?"); label_choice1->setString("兩個人騎在馬上"); label_choice2->setString("妖怪"); label_choice3->setString("不知道"); return false; }label_choice3發生crash,報EXC_BAD_ACCESS錯誤。
二、解決方法
經爬文後得知,label_choice3還未完成初始化,
就使用setString產生了EXC_BAD_ACCESS。
解決方案建議再使用CocosBuilder的另一個callback回調函式︰
CCNodeLoaderListener的
virtual void onNodeLoaded(cocos2d::CCNode * pNode, cocos2d::extension::CCNodeLoader * pNodeLoader);
setString的方法,
也等到onNodeLoaded的callback回來了才攢寫
void GameScene::onNodeLoaded(cocos2d::CCNode * pNode, cocos2d::extension::CCNodeLoader * pNodeLoader){ CCLog("into onNodeLoaded"); //如果在onAssignCCBMemberVariable()就setString可能會遇到物件還沒創立完成的BAD_ACCESS label_question->setString(GameScene::question.c_str()); label_choice1->setString(GameScene::choice1.c_str()); label_choice2->setString(GameScene::choice2.c_str()); label_choice3->setString(GameScene::choice3.c_str()); }問題解決。
原來是太快使用這個綁定的變數了。
沒有留言 :
張貼留言