cocos2dx 错误笔记01

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判断  我好菜呀
[cpp]  view plain  copy
 print ?
  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小时的时间终于把这个 “判断数据有无执行与否”的问题给弄懂了  后来在
[cpp]  view plain  copy
 print ?
  1. 代码 附下  
[cpp]  view plain  copy
 print ?
  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 * 全部去掉。。


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判断  我好菜呀
[cpp]  view plain  copy
 print ?
  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小时的时间终于把这个 “判断数据有无执行与否”的问题给弄懂了  后来在
[cpp]  view plain  copy
 print ?
  1. 代码 附下  
[cpp]  view plain  copy
 print ?
  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 * 全部去掉。。


猜你喜欢

转载自blog.csdn.net/qq_28180261/article/details/61194167