遇到問題集錦(無c++基礎 零起點小小小菜鳥親身經歷) 轉自http://blog.csdn.net/qq592116366

我的筆記若對你有幫助希望評論或者支持下。比較亂,以後再開始分類整理把(*^__^*) 嘻嘻……

1在添加新的層在原背景上面時候(模態窗口),在cocosbuilder中 應該新建爲node格式 而不是layer 否則 會彈出

 CCNodeLoaderMap::iterator ccNodeLoadersIterator =this->mCCNodeLoaders.find(pClassName);

 assert(ccNodeLoadersIterator !=this->mCCNodeLoaders.end());

 return ccNodeLoadersIterator->second;

2期待下一個問題出現,哈哈

a,問題出現了,要彈出一個新層,此層有大小以及位置。在cocosbuilder中可以設置node的錨點位置,例如設置到中間位置的錨點爲anchor point -0.5,-0.5.但是經過操作發現這樣設置的話 在代碼中設置層的位置變得難於理解,例如 偏左上角node->setPosition(ccp(-50, -30));
所以默認0,0 最好,將精靈都放在這個node中 在代碼中設置 node位置(想要將node放在哪就放哪)。

b,對node縮放 同理 於sprite :pClickItem->setScaleX(0.1),pClickItem->setScaleY(0.1); -》 node->setScaleX(0.5),node->setScaleY(0.5);

3移除所在父類窗口(層/node)

this->removeFromParentAndCleanup(true);

4執行觸摸事件及優先級

void 類名::onEnter(){

    CCLog("CCAlert::onEnter()");

    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -128true);

   CCLayer::onEnter();

}

void 類名::onExit(){

    CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);    

   CCLayer::onExit();

}

boolXXX::ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent){

    return true;

}

void XXX::ccTouchEnded(CCTouch *pTouch,CCEvent *pEvent){    

}


實驗發現,同等優先級下,後添加的Layer先響應事件。
右側點擊菜單 彈出左側,這時候左邊的優先級默認爲與右邊相同,那麼右側就無法再執行觸摸事件。
解決辦法:左側窗口優先級數值調高 

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -100true);

此時效果->左右均可觸摸
5記錄存儲數據 

     CCUserDefault::sharedUserDefault()->setStringForKey("name","nishihou");

     CCUserDefault::sharedUserDefault()->flush();//這裏一定要提交寫入哦,否則不會記錄到xml中,下次啓動遊戲就獲取不到value了。

     //這裏隨便定義一個string爲了驗證我們的存儲

    std::string str="select";

     //取出我們剛存儲的nishihou,然後賦值給str驗證下;

     str= CCUserDefault::sharedUserDefault()->getStringForKey("name");

    CCLog("打印str=%s",str.c_str());

     

//   CCLog("打印str=%s",CCUserDefault::sharedUserDefault()->getStringForKey("key").c_str());

文件存儲的地址可以使用CCUserDefault::sharedUserDefault()->getXMLFilePath().c_str()獲得。

刪除數據 ,設爲空即可

CCUserDefault::sharedUserDefault()->setStringForKey("key","");

    CCUserDefault::sharedUserDefault()->flush();

6報錯

Apple Mach-O Linker (id) Error   : linker command failed with exit code 1 (use -v to see invocation)

原因:1頭文件的添加是否多餘2是因爲有個變量重命名了
我這次犯的錯誤就是引用頭文件時候,誤把.h弄成.cpp了 找了半天 我太馬虎了 呵呵
7看來真是我a原理不明確b基礎不紮實
判斷存儲字符串的 應該用string類型 而不是寫成bool  if判斷  我好菜呀
  1.  void SpriteSelectScene::xuannishihou(CCObject *sender)  
  2. {    
  3.     CCLog("點擊泥石猴菜單");  
  4.       
  5.      userDefault();  
  6.       
  7.     std::string a = CCUserDefault::sharedUserDefault()->getStringForKey("key1");   
  8.   
  9.       //如果 取到值 則 true 不添加左側窗口 不執行菜單方法    
  10.      if (a=="nishihou")  
  11.      {   
  12.          CCLog("有數據,此方法不執行");  
  13.            
  14.          CCLog("打印str=:%s",CCUserDefault::sharedUserDefault()->getStringForKey("key1").c_str());  
  15.          return;  
  16.       
  17.      }  
  18.    //如果取到值爲空(無數據)則添加寵物到左側窗口  
  19.   
  20.      else   
  21.      {      //加載左側窗口  
  22.          CCNode * node = SceneManager::getLoadCcbiNode(ccbi_fileName_spritejia, ccbi_nodeName_spritejia, SpriteJiaLoader::loader());      
  23.          node->setPosition(ccp(80, 200));  
  24.          addChild(node,1);        
  25.           
  26.          CCLog("沒有數據,執行添加");  
  27.           
  28.      }  
  29. }  
8用了整整半天加1小時的時間終於把這個 “判斷數據有無執行與否”的問題給弄懂了  後來在
  1. 代碼 附下  
  1. void SpriteSelectScene::onNodeLoaded(CCNode * pNode, cocos2d::extension::CCNodeLoader * pNodeLoader)  
  2.   
  3. {  
  4.     CCLog("onNodeLoadedonNodeLoadedonNodeLoaded");  
  5.       
  6.     CCSize size = CCDirector::sharedDirector()->getWinSize();  
  7.       
  8. //進入遊戲判斷有無用戶選擇寵物的記錄,若有默認執行上次的選擇      
  9.     std::string a = userDefault->getStringForKey(key_chongwu);   
  10.     if(a=="selectnishihou")  
  11.     {  
  12.         //有數據直接加載界面  
  13.       
  14.     CCNode * node = SceneManager::getLoadCcbiNode(ccbi_fileName_spritejia, ccbi_nodeName_spritejia, SpriteJiaLoader::loader());  
  15.     node->setPosition(ccp(80, 200));  
  16.     addChild(node,1);   
  17.     }  
  18.     else {  
  19.         CCLog("無反映");  
  20.         return;  
  21.     }  
  22. }  
  23.   
  24. /** 
  25.  選擇寵物/添加寵物到左側 
  26.  @param sender <#sender description#> 
  27.  */  
  28. void SpriteSelectScene::xuannishihou(CCObject *sender)  
  29. {  
  30.    std::string b = userDefault->getStringForKey(key_chongwu);    
  31. //如果 取到值 則 true 不添加左側窗口 不執行菜單方法   
  32. if (b=="selectnishihou")  
  33. {  
  34.     CCLOG("有數據不執行");  
  35.     return;  
  36. }  
  37. //如果取到值爲空(無數據)則添加寵物到左側窗口      
  38. else  
  39. {   CCNode * node = SceneManager::getLoadCcbiNode(ccbi_fileName_spritejia, ccbi_nodeName_spritejia, SpriteJiaLoader::loader());      
  40.     node->setPosition(ccp(80, 200));  
  41.     addChild(node,1);  
  42.       
  43.     CCLOG("無數據,執行添加");  
  44.     userDefault->setStringForKey(key_chongwu, "selectnishihou");  
  45.   
  46.     userDefault->flush();  
  47.       
  48.     CCLog("打印str=:%s");  
  49.    
  50. }  
  51.   
  52. }  
9.2013年04月26日13:28:39
第九個問題 出現了。
XCODE 運行失敗 代碼提示
Couldn't register com.yourcompany.jingling with the bootstrap server. Error: unknown error code.
This generally means that another instance of this process was already running or is hung in the debugger.(lldb) 

回想出現問題的原因:退出 運行時的模擬器 。
解決辦法:重啓機器 (別人都說重啓xocde 和 模擬器最後不行 只能重啓機器 ) 
怎樣避免:養成良好習慣,執行完 項目程序 在xcode中 STOP 下。

10.知識沒學會,問題不斷 哇咔咔 wait 。。。see you later 
2013年05月03日15:44:01 在做東西過程中發現了一個容易忽視的環節,往往帶來麻煩。

在使用cocosbuilder時 其中Ignore anchor point  要勾選 那麼以後其他的例如添加精靈 等等都要保持一致 不然會出現在運行時精靈位置不對的問題
11.接着等。。。
觸摸遇到update() 碰撞檢測與遍歷數組 主要是數組有點蒙 

void場景::update(float dt)

{



   for(int i =0; i <數組名->count(); i++)

    {

       場景 * 精靈2 = (場景*)數組名->objectAtIndex(i);

        if((精靈1->boundingBox()).intersectsRect(精靈2->boundingBox()))  

        {  int diantag = dian->getTag();

           int yezitag = diantag+100;

           

           if (getChildByTag(yezitag)!=NULL)

            {

               CCSprite *yezi = (CCSprite *)getChildByTag(yezitag);//強轉

               this->removeChild(yezi,true);

            }else {

               CCLog("%d========%d",diantag,yezitag);

            }


           _dians->removeObject(dian);

            

           this->removeChild(dian,true);

        }

       else  

        {  

//            CCLog("沒碰撞");

        }  

    }

}




12 程序運行紊亂 初始化沒弄明白 放在

onNodeLoaded裏 例如

this->schedule(schedule_selector(YeZiScene::update));與

_yezis =  CCArray::create();

    

   for (int i=1;i<=9;i++)

    {

       int tag =100+i;

        

       if (getChildByTag(tag)!=NULL)

        {

           CCSprite *sprite = (CCSprite *)getChildByTag(tag);//強轉

           _yezis->addObject(sprite);

        }

        

    }等等 順序爲 先加載遊戲界面 然後加載數組 之後循環


13 通過tag獲取精靈 +移除

int diantag = dian->getTag();

           int yezitag = diantag+100;


           if (getChildByTag(yezitag)!=NULL)

            {

               CCSprite *yezi = (CCSprite *)getChildByTag(yezitag);//強轉

               this->removeChild(yezi,true);

            }else {

               CCLog("%d========%d",diantag,yezitag);

            }


14移動到觸摸點 並且設置速度

CCPoint location=pTouch->getLocation();    

    //設置執行動作需要移動到的位置,參數1代表時間 2位置

   float juli=ccpDistance(qiu->getPosition(),ccp(location.x,location.y));

   float sudu=100.0;

   CCActionInterval*  actionMove =CCMoveTo::create(juli*1.0/sudu,ccp(location.x,location.y));  

   CCFiniteTimeAction* actionMoveDone =CCCallFuncN::create(this

                                                            callfuncN_selector(YeZiScene::spriteMoveFinished));

   qiu->runAction(CCSequence::create(actionMove, actionMoveDone,NULL) );

    

    }


15注意 有變量的情況下 要聲明變量 例如

int diantag = dian->getTag();

 int yezitag = diantag+100;

float juli=ccpDistance(qiu->getPosition(),ccp(location.x,location.y));

。。。反正老多了要這樣做  要養成習慣 仔細看代碼裏面 大多數都是

16又是據說是 最基礎的東西
有關全局和臨時變量
我在頭文件中聲明

private:

   CCSprite* ciqiu;

在.cpp中初始化處寫:

CCSprite*ciqiu = (CCSprite*)getChildByTag(196);本想着 以後在用到精靈時候不需要寫了,可是結果是NO

終於明白:羣裏說的,“你再次聲明並定義了 雖然名字是一樣的  但是是2個完全不同的對象啊,一個是類成員  一個是臨時,臨時的那個隨着函數的消失就消失了,你在.h裏面聲明  是代表你這個類的類成員。 你在.cpp裏面寫的那個東西是 一個臨時的變量”

解決方法:初始化中
    把你前面的    CCsprite * 全部去掉。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章