Ubuntu Cocos2dx 学习笔记——错误总结

来源:互联网 发布:matlab 关联矩阵 编辑:程序博客网 时间:2024/06/06 20:15

转载请表明出处:http://blog.csdn.net/tim_shadow/article/details/23272423

1.添加渐变背景时无任何背景效果

     遇到一个很傻的问题,今天在添加一个渐变背景的时候,添加了如下代码,发现运行后没有看到效果
CCLayerGradient*backGradient = CCLayerGradient::create(colorstart,colorend);backGradient->changeWidth(visibleSize.width);backGradient->changeHeight(visibleSize.height);backGradient->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));this->addChild(backGradient,0);
   结果后来无意中发现,在这段代码前面有一句话
return true;
    函数都已经返回了,怎么可能执行到,遂把ruturn语句拉到最后,运行成功,CDT与JDT的不同之处体现无疑,CDT这种情况IDE是不会提示错误的。

2.CCMenu::create()导致的不兼容

    遇到一个比较特殊的情况,网上搜遍了没有找到原因,状况是:在linux上面能够完整运行,但是导入到Android手机上面的时候确出现闪退,CCLayer的初始代码如下:
    
bool HelloWorld::init() {    if (!CCLayer::init()) {        return false;    }     CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();    CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();     CCLabelTTF *start = CCLabelTTF::create("Start", "arial", 50);    CCLabelTTF *pause = CCLabelTTF::create("Pause", "arial", 50);    CCLabelTTF *resume = CCLabelTTF::create("Resume", "arial", 50);     start->setColor(randccColor3B());    pause->setColor(randccColor3B());    resume->setColor(randccColor3B());     startMenuItem = CCMenuItemLabel::create(start, this,            menu_selector(HelloWorld::startGame));    pauseMenuItem = CCMenuItemLabel::create(pause, this,            menu_selector(HelloWorld::pauseGame));    resumeMenuItem = CCMenuItemLabel::create(resume, this,            menu_selector(HelloWorld::resumeGame));     startMenuItem->setPosition(ccp(0.0,40.0));    resumeMenuItem->setPosition(ccp(0.0,0.0));    pauseMenuItem->setPosition(ccp(0.0,0.0));     resumeMenuItem->setVisible(false);     CCMenu* menu = CCMenu::create(startMenuItem, pauseMenuItem, resumeMenuItem);    menu->setPosition(            ccp(origin.x + visibleSize.width / 2,origin.y + visibleSize.height / 2));    this->addChild(menu, 1); //  CCMenu *menu1 = CCMenu::create(startMenuItem, NULL);//  CCMenu *menu2 = CCMenu::create(pauseMenuItem, NULL);//  CCMenu *menu3 = CCMenu::create(resumeMenuItem, NULL);//  menu1->setPosition(//          ccp(origin.x + visibleSize.width / 2,origin.y + visibleSize.height / 2));//  this->addChild(menu1, 1);//  menu2->setPosition(//          ccp(origin.x + visibleSize.width / 2,origin.y + visibleSize.height / 2));//  this->addChild(menu2, 1);//  menu3->setPosition(//          ccp(origin.x + visibleSize.width / 2,origin.y + visibleSize.height / 2));//  this->addChild(menu3, 1);     ccColor4B colorstart = randccColor4B();    ccColor4B colorend = randccColor4B();    CCLayerGradient*backGradient = CCLayerGradient::create(colorstart, colorend,            ccp(50,100));    backGradient->changeWidth(visibleSize.width);    backGradient->changeHeight(visibleSize.height);    backGradient->setPosition(ccp(0,0));    this->addChild(backGradient, 0);    return true;}
    注意到30-33行代码,如果这样写,那么在linux能够运行,而在Android 上面不能运行;
    如果将30-33行的代码注释掉,并去掉35-46行的注释,那么在Linux 和Android 上面都能够运行了同时,如果将 35-37行代码改为:
CCMenu *menu1 = CCMenu::create(startMenuItem);CCMenu *menu2 = CCMenu::create(pauseMenuItem);CCMenu *menu3 = CCMenu::create(resumeMenuItem);
    那么在Linux上面会闪退,但是Android 上面能够正常运行

    猜想:

         出现此种情况,猜想可能是由于CCMenu::create()方法多参数的特殊性,Linux和Android的处理方式不一样。
         所以以后遇到这种类似的多参数方法一定要引起重视。

    正确方式:

         多个参数时需要在最后加上NULL表示结束,如:
    CCMenu *menu1 = CCMenu::create(startMenuItem, NULL);
    CCMenu *menu = CCMenu::create(startMenuItem0, startMenuItem1,startMenuItem2,  NULL);


0 0