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

转载请表明出处: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);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值