/* *1 逻辑代码中都使用 do {} while(0) 样式, 主要是代码中 CC_BREAK_IF(!XX); 中使用了 if() break, 如果没有for while if 等条件语句,会报错 */ void fun() { do { ....... CC_BREAK_IF(! XX); }while(0); } /* *2 场景可由 CCLayer 继承,在层中定义一个创建scene 的静态成员函数,也可以直接由CCScene 继承 */ CCScene* TitleScene::scene() { CCScene * scene = NULL; do { // 'scene' is an autorelease object scene = CCScene::node(); CC_BREAK_IF(! scene); // 'layer' is an autorelease object TitleScene *layer = TitleScene::node(); CC_BREAK_IF(! layer); // add layer as a child to scene scene->addChild(layer); } while (0); // return the scene return scene; } /* *3 cocos2d-x 在win32 平台支持中文, 在其它平台可支持,win32 平台汉字为gb2312编码,但在 cocos2d-x 中使用的是utf-8编码,所以需要转换 */ #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) #include "iconv.h" //此文件在 cocos2d-x 里面 //字符转换,使cocos2d-x在win32平台支持中文显示 int GBKToUTF8(std::string &gbkStr,const char* toCode,const char* formCode) { iconv_t iconvH; iconvH = iconv_open(formCode,toCode); if(iconvH == 0) { return -1; } const char* strChar = gbkStr.c_str(); const char** pin = &strChar; size_t strLength = gbkStr.length(); char* outbuf = (char*)malloc(strLength*4); char* pBuff = outbuf; memset(outbuf,0,strLength*4); size_t outLength = strLength*4; if(-1 == iconv(iconvH,pin,&strLength,&outbuf,&outLength)) { iconv_close(iconvH); return -1; } gbkStr = pBuff; iconv_close(iconvH); return 0; } #endif /* *4 创建文字列表菜单,在 CCLayer 的子类中的init初使化过程中 */ bool TitleScene::init() { do { //..... std::string menuItemStr = "新游戏"; #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) GBKToUTF8(menuItemStr,"gb2312","utf-8"); #endif CCMenuItem *newGame = CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,menu_selector(TitleScene::menuNewCallback)); menuItemStr = "设置"; #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) GBKToUTF8(menuItemStr,"gb2312","utf-8"); #endif CCMenuItem *optionGame=CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,menu_selector(TitleScene::menuOptionCallback)); menuItemStr = "退出"; #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) GBKToUTF8(menuItemStr,"gb2312","utf-8"); #endif CCMenuItem *quitGame=CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,menu_selector(TitleScene::menuQuitCallback)); CCMenu *menu=CCMenu::menuWithItems(newGame,optionGame,quitGame,NULL); menu->alignItemsVertically();//竖直排列 //menu->alignItemsInColumns(2, 2, 2, 2, 1, NULL);//菜单排列方式每行 几个 this->addChild(menu,1); }while(0); } /* *5 菜单点击回调函数, 菜单点击事件 */ //头文件中定义 void menuNewCallback(CCObject* pSender); //实现文件中使用 menu_selector(XXXXX) CCMenuItem *newGame = CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,menu_selector(TitleScene::menuNewCallback)); void TitleScene::menuNewCallback( CCObject* pSender ) { CCScene *scene=FlyScene::scene(); CCDirector::sharedDirector()->replaceScene(scene); } /* *6 菜单字体颜色,大小,字体设置 */ void fun() { CCMenuItemFont *quitGame=CCMenuItemFont::itemFromString(menuItemStr.c_str(),this,menu_selector(TitleScene::menuQuitCallback)); quitGame->setColor() quitGame->setFontSize() quitGame->setFontName() ..... CCMenu *menu=CCMenu::menuWithItems(newGame,optionGame,quitGame,NULL); menu->setColor(ccc3(255,0,0));//注意 ccc3 ccc4 //全局设置 CCMenuItemFont::setFontName("Thonburi"); CCMenuItemFont::setFontSize(25); //指定特殊字体文件 CCLabelBMFont* label = CCLabelBMFont::labelWithString("configuration", "fonts/bitmapFontTest3.fnt"); } /* *7 场景切换,场景切换动画,场景结束退出 */ void TitleScene::menuClickCallback(CCObject* pSender) { //结束 CCDirector::sharedDirector()->end(); //切换 CCScene *scene = XXXX; CCDirector::sharedDirector()->replaceScene(scene); //切换动画 //CCTransitionCrossFade::transitionWithDuration() //CCTransitionFlipX::transitionWithDuration() CCDirector::sharedDirector()->replaceScene(CCTransitionCrossFade::transitionWithDuration(1.2f,scene)); CCTransitionJumpZoom::transitionWithDuration(t, s);//跳跃式,本场景先会缩小,然后跳跃进来 CCTransitionFade::transitionWithDuration(t, s);//淡出淡入,原场景淡出,新场景淡入 CCTransitionFade::transitionWithDuration(t, s, ccWHITE);//如果上一个的函数,带3个参数,则第三个参数就是淡出淡入的颜色 CCTransitionFlipX::transitionWithDuration(t, s, kOrientationLeftOver);//x轴左翻 CCTransitionFlipX::transitionWithDuration(t, s, kOrientationRightOver);//x轴右翻 CCTransitionFlipY::transitionWithDuration(t, s, kOrientationUpOver);//y轴上翻 CCTransitionFlipY::transitionWithDuration(t, s, kOrientationDownOver);//y轴下翻 CCTransitionFlipAngular::transitionWithDuration(t, s, kOrientationLeftOver);//有角度转的左翻 CCTransitionFlipAngular::transitionWithDuration(t, s, kOrientationRightOver);//有角度转的右翻 CCTransitionZoomFlipX::transitionWithDuration(t, s, kOrientationLeftOver);//带缩放效果x轴左翻 CCTransitionZoomFlipX::transitionWithDuration(t, s, kOrientationRightOver);//带缩放效果x轴右翻 CCTransitionZoomFlipY::transitionWithDuration(t, s, kOrientationUpOver);//带缩放效果y轴上翻 CCTransitionZoomFlipY::transitionWithDuration(t, s, kOrientationDownOver);//带缩放效果y轴下翻 CCTransitionZoomFlipAngular::transitionWithDuration(t, s, kOrientationLeftOver);//带缩放效果/有角度转的左翻 CCTransitionZoomFlipAngular::transitionWithDuration(t, s, kOrientationRightOver);//带缩放效果有角度转的右翻 CCTransitionShrinkGrow::transitionWithDuration(t, s);//交错换 CCTransitionRotoZoom::transitionWithDuration(t, s);//转角换 CCTransitionMoveInL::transitionWithDuration(t, s);//新场景从左移入覆盖 CCTransitionMoveInR::transitionWithDuration(t, s);//新场景从右移入覆盖 CCTransitionMoveInT::transitionWithDuration(t, s);//新场景从上移入覆盖 CCTransitionMoveInB::transitionWithDuration(t, s);//新场景从下移入覆盖 CCTransitionSlideInL::transitionWithDuration(t, s);//场景从左移入推出原场景 CCTransitionSlideInR::transitionWithDuration(t, s);//场景从右移入推出原场景 CCTransitionSlideInT::transitionWithDuration(t, s);//场景从上移入推出原场景 CCTransitionSlideInB::transitionWithDuration(t, s);//场景从下移入推出原场景 以下三个需要检测opengl版本是否支持CCConfiguration::sharedConfiguration()->getGlesVersion() <= GLES_VER_1_0如果为真则为不支持 CCTransitionCrossFade::transitionWithDuration(t,s);//淡出淡入交叉,同时进行 CCTransitionRadialCCW::transitionWithDuration(t,s);//顺时针切入 CCTransitionRadialCW::transitionWithDuration(t,s);//逆时针切入 以下两个需要先设置摄像机,使用CCDirector::sharedDirector()->setDepthTest(true); CCTransitionPageTurn::transitionWithDuration(t, s, false);//翻页,前翻 CCTransitionPageTurn::transitionWithDuration(t, s, true);//翻页,后翻 CCTransitionFadeTR::transitionWithDuration(t, s);//向右上波浪 CCTransitionFadeBL::transitionWithDuration(t, s);//向左下波浪 CCTransitionFadeUp::transitionWithDuration(t, s);//向上百叶窗 CCTransitionFadeDown::transitionWithDuration(t, s);//向下百叶窗 CCTransitionTurnOffTiles::transitionWithDuration(t, s);//随机小方块 CCTransitionSplitRows::transitionWithDuration(t, s);//按行切 CCTransitionSplitCols::transitionWithDuration(t, s);//按列切 } /* *8 背景音乐 */ void fun() { CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic("background-music-aac.wav", true); SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic(); } /* *9 计划任务,定时器的使用 */ //头文件类中定义,最多两参数,可以一个参数,第一个参数为调用的方法,第二个参数为间隔时间 ccTime, ccTime 即 float ,此参数可选,如果没有设定时间,则即时刷新 void HelloWorld::gameLogic(ccTime dt);//参数为ccTime void fun() { this->schedule( schedule_selector(HelloWorld::gameLogic), 1.0 ); this->schedule( schedule_selector(HelloWorld::updateGame) ); this->unschedule(schedule_selector(HelloWorld::updateGame));//取消定时器 } /* *10 设置背景图片 */ void fun() { CCSize size = CCDirector::sharedDirector()->getWinSize(); //添加背景 CCSprite* pSprite = CCSprite::spriteWithFile("background.png"); CC_BREAK_IF(! pSprite); // Place the sprite on the center of the screen pSprite->setPosition(ccp(size.width/2, size.height/2)); // Add the sprite to TitleScene layer as a child layer. this->addChild(pSprite, 0);//背景设置为0层,即底层 } /* *11 Label 使用, CCLabelTTF */ void fun() { std::string titleStr = "hello world";//注意中文在win32 中需要转换编码 utf-8 CCLabelTTF* pLabel = CCLabelTTF::labelWithString(titleStr.c_str(), "Thonburi", 30); CC_BREAK_IF(! pLabel); pLabel->setColor(ccRED); CCSize size = CCDirector::sharedDirector()->getWinSize(); pLabel->setPosition(ccp(size.width / 2, size.height*0.8f)); this->addChild(pLabel, 1); } /* *12 启动触屏点击事件 Touch */ //头文件定义 virtual void ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent); virtual void ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent); virtual void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent); bool init() { do { .... this->setIsTouchEnabled(true); ..... }while(0); } void ccTouchesBegan( CCSet *pTouches, CCEvent *pEvent ) { CCTouch *touch = (CCTouch*)pTouches->anyObject(); CCPoint location = touch->locationInView(touch->view()); //得到点击的点的坐标, OPENGL 坐标 CCPoint convertedLocation = CCDirector::sharedDirector()->convertToGL(location); //得到人物角色的区域 rect CCRect rect=sprite->boundingBox(); //判断点击坐标是否在人物角色区域内 if (CCRect::CCRectContainsPoint(rect,convertedLocation)) { ......... } } void ccTouchesMoved( CCSet *pTouches, CCEvent *pEvent ) { CCTouch *touch = (CCTouch*)pTouches->anyObject(); CCPoint location = touch->locationInView(touch->view()); CCPoint convertedLocation = CCDirector::sharedDirector()->convertToGL(location); ....... } void ccTouchesEnded( CCSet *pTouches, CCEvent *pEvent ) { ........ } //允许触屏 CCTouchDispatcher::sharedDispatcher()->setPriority(kCCMenuTouchPriority+1, this); //不允许触屏 CCTouchDispatcher::sharedDispatcher()->setPriority(kCCMenuTouchPriority-1, this); /* *13 多层的使用 CCLayer CCLayerMultiplex,层的切换 */ void fun() //CCScene 继承的子类的方法 { CCLayer* pLayer1 = new MenuLayer1(); CCLayer* pLayer2 = new MenuLayer2(); CCLayer* pLayer3 = new MenuLayer3(); CCLayer* pLayer4 = new MenuLayer4(); CCLayerMultiplex* layer = CCLayerMultiplex::layerWithLayers(pLayer1, pLayer2, pLayer3, pLayer4, NULL); addChild(layer, 0); pLayer1->release(); pLayer2->release(); pLayer3->release(); pLayer4->release(); CCDirector::sharedDirector()->replaceScene(this); } //层的切换, m_pParent 为系统内置变量 void fun() { ((CCLayerMultiplex*)m_pParent)->switchTo(1); } /* *14 动作,角色移动 action, */ void fun() { CCSize winSize = CCDirector::sharedDirector()->getWinSize(); CCSprite *projectile = CCSprite::spriteWithFile("Projectile.png", CCRectMake(0, 0, 20, 20)); projectile->setPosition( ccp(20, winSize.height/2) );//起点 ...... //CCPoint realDest 终点, realMoveDuration 持续时间 projectile->runAction( CCSequence::actions( CCMoveTo::actionWithDuration(realMoveDuration, realDest), CCCallFuncN::actionWithTarget(this, callfuncN_selector(HelloWorld::spriteMoveFinished)), NULL) ); //循环跳跃 CCJumpBy* jump = CCJumpBy::actionWithDuration(3, CCPointMake(400,0), 50, 4); item2->runAction( CCRepeatForever::actionWithAction( (CCActionInterval*)(CCSequence::actions( jump, jump->reverse(), NULL)) ) ); //循环旋转 CCActionInterval* spin1 = CCRotateBy::actionWithDuration(3, 360); CCActionInterval* spin2 = (CCActionInterval*)(spin1->copy()->autorelease()); CCActionInterval* spin3 = (CCActionInterval*)(spin1->copy()->autorelease()); item1->runAction( CCRepeatForever::actionWithAction(spin1) ); item2->runAction( CCRepeatForever::actionWithAction(spin2) ); item3->runAction( CCRepeatForever::actionWithAction(spin3) ); } /* *15 闪动字体动画特效 */ void fun() { CCMenuItemFont* item6 = CCMenuItemFont::itemFromString("Quit", this, menu_selector(MenuLayer1::onQuit)); CCActionInterval* color_action = CCTintBy::actionWithDuration(0.5f, 0, -255, -255); CCActionInterval* color_back = color_action->reverse(); CCFiniteTimeAction* seq = CCSequence::actions(color_action, color_back, NULL); item6->runAction(CCRepeatForever::actionWithAction((CCActionInterval*)seq)); CCMenu* menu = CCMenu::menuWithItems( item6, NULL); menu->alignItemsVertically(); this->addChild(menu); } /* *16 特殊字体设置,比如图片字体, 图片字体库由一个 .fnt 文件和一个 .png 图片文件组成, fnt文件中定义了字体属性,这种方式可以实现系统字库中不存在的字体,以图片来代替文字 */ void fun() { CCLabelAtlas* labelAtlas = CCLabelAtlas::labelWithString("0123456789", "fonts/fps_images.png", 16, 24, '.'); CCMenuItemLabel* item3 = CCMenuItemLabel::itemWithLabel(labelAtlas, this, NULL ); item3->setDisabledColor( ccc3(255,32,64) ); item3->setColor( ccc3(125,147,255) ); CCLabelBMFont* label = CCLabelBMFont::labelWithString("configuration", "fonts/bitmapFontTest3.fnt"); CCMenuItemLabel* item5 = CCMenuItemLabel::itemWithLabel(label, this, NULL); //放大倍数 item5->setScale( 2.8f ); CCMenu *menu = CCMenu::menuWithItems(item3,item5,NULL); menu->alignItemsVertically(); this->addChild(menu); } /* *17 菜单的遍历,动态特效 */ void fun() { int i=0; CCNode* child; CCArray * pArray = menu->getChildren(); CCObject* pObject = NULL; CCARRAY_FOREACH(pArray, pObject) { if(pObject == NULL) break; child = (CCNode*)pObject; CCPoint dstPoint = child->getPosition(); int offset = (int) (s.width/2 + 50); if( i % 2 == 0) offset = -offset; child->setPosition( CCPointMake( dstPoint.x + offset, dstPoint.y) ); child->runAction( CCEaseElasticOut::actionWithAction( CCMoveBy::actionWithDuration(2, CCPointMake(dstPoint.x - offset,0)), 0.35f ) ); i++; } } /* *18 菜单触发器,菜单子项 */ void fun() { CCMenuItemToggle *item4 = CCMenuItemToggle::itemWithTarget( this, menu_selector(MenuLayer4::menuCallback), CCMenuItemFont::itemFromString( "Off" ), NULL ); item4->getSubItems()->addObject( CCMenuItemFont::itemFromString( "33%" ) ); item4->getSubItems()->addObject( CCMenuItemFont::itemFromString( "66%" ) ); item4->getSubItems()->addObject( CCMenuItemFont::itemFromString( "100%" ) ); item4->setSelectedIndex( 2 ); //item4->getSelectedIndex(); } //在点击事件中可以进行处理 void menuCallBack(CCObject *sender) { dynamic_cast<CCMenuItemToggle*>(sender)->selectedItem(); dynamic_cast<CCMenuItemToggle*>(sender)->selectedIndex(); } /* *19 精灵的各种应用 */ 1,锚点 锚点就是所有旋转,移动,缩放的参考点。cocos2-x中默认的锚点是中心点。锚点用比例来表示范围为0-1,(0,0)点代表左下点,(1,1)代表右上点。设置的函数为setAnchorPoint(ccp(0.5, 0.5)); 2,旋转 setRotation(angle) 其中angle为角度不是弧度。正数为顺时针旋转,负数为逆时针旋转。 3,位置 setPosition(ccp(xPos, yPos)) xPos和yPos为相对于父节点锚点的位置。 4,缩放 setScale(s); // 整体缩放 setScaleX(s); // 原图片坐标X轴缩放 setScaleY(s); // 原图片坐标Y轴缩放 s为比例,s = 1表示原尺寸。 5,倾斜 setSkewX(s); // 原图片坐标X轴倾斜 setSkewY(s); // 原图片坐标Y轴倾斜 X轴向右为正,Y轴向上为正。 6,透明度 setOpacity(s); s范围0-255,0完全透明,255完全不透明。 7,可见 setIsVisible(bVisible) bVisible为bool值true代表可见false代表不可见 8,翻转 setFlipX(bFlip); // 水平翻转 setFlipY(bFlip); // 竖直翻转 bFlip为true,则图片翻转,false不翻转。注意,翻转是针对原图片的操作,水平翻转相当于在图片编辑软件里水平翻转一样。不根据锚点进行翻转。翻转以后,设置的以前设置的锚点不会随着图片的翻转而改变。比如设置右下角为锚点,则翻转以后,锚点为翻转后的图片的右下角(是不是有点绕?) 最后,初始化完成后,不要忘了使用addChild加入到父节点,否则是不会显示的。 /* *20 进度条,进度条由两张图片组成。一张作背景,另一张则在背景上以动画形式显示出来,此处可以作为竞技血条或时间条 */ void fun() { CCSprite *bg = CCSprite::spriteWithFile("images/button_moregame1.png"); bg->setPosition(CCPointMake(100,size.height/2)); this->addChild(bg,1); CCProgressTo *to1 = CCProgressTo::actionWithDuration(6, 100); CCProgressTo *to2 = CCProgressTo::actionWithDuration(2, 100); CCProgressTimer *left = CCProgressTimer::progressWithFile("images/button_moregame2.png"); left->setType( kCCProgressTimerTypeHorizontalBarRL ); addChild(left,2); //left->setPercentage(55.0f); left->setPosition(CCPointMake(100, size.height/2+3)); left->runAction( CCRepeatForever::actionWithAction(to1)); } void fun1() { //进度条加载满时 触发一个事件 void progressCallback(CCNode *pSender); CCSprite *bg = CCSprite::spriteWithFile("images/button_moregame1.png"); bg->setPosition(CCPointMake(100,size.height/2)); this->addChild(bg,1); CCProgressTo *to1 = CCProgressTo::actionWithDuration(6, 100); CCProgressTo *to2 = CCProgressTo::actionWithDuration(2, 100); CCProgressTimer *left = CCProgressTimer::progressWithFile("images/button_moregame2.png"); left->setType( kCCProgressTimerTypeHorizontalBarRL ); addChild(left,2); //left->setPercentage(55.0f); left->setPosition(CCPointMake(100, size.height/2+3)); //left->runAction( CCRepeatForever::actionWithAction(to1)); //CCCallFuncN* action_call_back = CCCallFuncN::actionWithTarget(this,callfuncN_selector(DegreeScene::progressCallback)); left->runAction(CCSequence::actions(to1,CCCallFuncN::actionWithTarget(this, callfuncN_selector(DegreeScene::progressCallback)),NULL)); } /* *21 设置加速 */ void fun { setIsTouchEnabled( true );//可触屏 setIsAccelerometerEnabled( true );//加速计 } /* *22 多张图片动画 */ void fun() { CCAnimation* animation = CCAnimation::animation(); char frameName[100] = {0}; for( int i=1;i<34;i++){ sprintf(frameName, "demo%04d.png", i); animation->addFrameWithFileName(frameName); } CCActionInterval* action = CCAnimate::actionWithDuration(1.0f, animation, false); } CCSprite *p2 = CCSprite::spriteWithFile("name1.png");//首先还是要创建一个精灵对象 p2->setPosition(CCPointMake(240,160)); this->addChild (p2,1); CCAnimation* animation = CCAnimation::animation(); char frameName[100] = {0}; for( int i=1;i<=4;i++) //图片的张数 { sprintf(frameName, "name%d.png", i); //循环 animation->addFrameWithFileName(frameName); } CCActionInterval* action = CCAnimate::actionWithDuration(0.5f, animation, false); //0.5f 是切换图片的时间 CCActionInterval* action_back = action->reverse();//返回到原先的状态 sp2->runAction(action); 这样就实现了简单的连帧动画了! 同时可以定义其他的动作: CCMoveTo CCMoveBy CCJumpTo 。。。 sp2->runAction(CCSequence::actions(action1,action2,action3,NULL));//不要忘了加NULL哦 sp2->runAction(CCSequence::actions(action1,CCDelayTime:;actionWithDuration(3),action2,NULL));//actionWithDuration()里面的参数是时间