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