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

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

2014-04-09 15:33 507 查看
转载请表明出处: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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐