8 cocos2dx添加场景切换效果,控制场景切换彻底完成之后再执行动画
1 添加場景切換效果
供場景切換的類:
| CCTransitionJumpZoom CCTransitionProgressRadialCCW CCTransitionProgressRadialCW CCTransitionProgressHorizontal CCTransitionProgressVertical CCTransitionProgressInOut CCTransitionProgressOutIn CCTransitionCrossFade CCTransitionFadeTR CCTransitionFadeBL CCTransitionFadeUp CCTransitionFadeDown CCTransitionTurnOffTiles CCTransitionSplitRows CCTransitionSplitCols CCTransitionFade CCTransitionShrinkGrow CCTransitionRotoZoom CCTransitionMoveInL CCTransitionMoveInR CCTransitionMoveInT CCTransitionMoveInB CCTransitionSlideInL CCTransitionSlideInR CCTransitionSlideInT CCTransitionSlideInB |
場景切換案例:
| TMenu.h |
| #ifndef __TMenu_H__ #define __TMenu_H__ #include "cocos2d.h" USING_NS_CC; ? class TMenu:public CCLayer { public: ??? static CCScene * scene(); ??? CREATE_FUNC(TMenu); ??? bool init(); ? ??? CCMenu * menu; ? ??? void menuCallback(CCObject * sender); ??? void closeCallback(CCObject * sender); ? ??? virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); ??? virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); ? }; ? ? #endif |
| TMenu.cpp |
| #include "TMenu.h" #include "AppMacros.h" ? #include "T01LayerAnchorPoint.h" #include "T02LayerSprite.h" #include "T03LayerZorder.h" #include "T04ColorLayer.h" #include "T05Coordinate.h" #include "T06BatchNode.h" #include "T07Schedule.h" #include "T08Touch.h" #include "T09Memory.h" #include "T10Label.h" #include "T11CCMenu.h" #include "T12UI.h" #include "T13Action.h" #include "T14Animation.h" #include "T15Speed.h" #include "T16CCFollow.h" #include "T17CCProgressTo.h" #include "T18Grid3D.h" #include "T19Draw.h" #include "T20Music.h" #include "T21Particle.h" #include "T22UserDefault.h" ? //供場景切換用 static CCTransitionScene * switchSceneEffect(int index,float t,CCScene *s) { ??? switch (index) ??? { ??? case 0: ?????? return CCTransitionJumpZoom::create(t, s); ?????? break; ??? case 1: ?????? return CCTransitionProgressRadialCCW::create(t, s); ?????? break; ??? case 2: ?????? return CCTransitionProgressRadialCW::create(t, s); ?????? break; ??? case 3: ?????? return CCTransitionProgressHorizontal::create(t, s); ?????? break; ??? case 4: ?????? return CCTransitionProgressVertical::create(t, s); ?????? break; ??? case 5: ?????? return CCTransitionProgressInOut::create(t, s); ?????? break; ??? case 6: ?????? return CCTransitionProgressOutIn::create(t, s); ?????? break; ??? case 7: ?????? return CCTransitionCrossFade::create(t, s); ?????? break; ??? case 8: ?????? return CCTransitionCrossFade::create(t, s); ?????? break; ??? case 9: ?????? return CCTransitionFadeTR::create(t, s); ?????? break; ??? case 10: ?????? return CCTransitionFadeBL::create(t ,s); ?????? break; ??? case 11: ?????? return CCTransitionFadeUp::create(t, s); ?????? break; ??? case 12: ?????? return CCTransitionFadeDown::create(t, s); ?????? break; ??? case 13: ?????? return CCTransitionTurnOffTiles::create(t, s); ?????? break; ??? case 14: ?????? return CCTransitionSplitRows::create(t, s); ?????? break; ??? case 15: ?????? return CCTransitionSplitCols::create(t, s); ?????? break; ??? case 16: ?????? return CCTransitionFade::create(t, s); ?????? break; ??? case 17: ?????? return CCTransitionShrinkGrow::create(t, s); ?????? break; ??? case 18: ?????? return CCTransitionRotoZoom::create(t, s); ?????? break; ??? case 19: ?????? return CCTransitionMoveInL::create(t, s); ?????? break; ??? case 20: ?????? return CCTransitionMoveInR::create(t, s); ?????? break; ??? case 21: ?????? return CCTransitionMoveInT::create(t, s); ?????? break; ??? case 22: ?????? return CCTransitionMoveInB::create(t, s); ?????? break; ??? case 23: ?????? return CCTransitionSlideInL::create(t, s); ?????? break; ??? case 24: ?????? return CCTransitionSlideInR::create(t, s); ?????? break; ??? case 25: ?????? return CCTransitionSlideInT::create(t, s); ?????? break; ??? case 26: ?????? return CCTransitionSlideInB::create(t, s); ?????? break; ??? } } ? static char * menu_array[] { ??? "T01LayerAnchorPoint.h", ??? "T02LayerSprite.h", ??? "T03LayerZorder.h", ??? "T04ColorLayer.h", ??? "T05Coordinate.h", ??? "T06BatchNode.h", ??? "T07Schedule.h", ??? "T08Touch.h", ??? "T09Memory.h", ??? "T10Label.h", ??? "T11CCMenu.h", ??? "T12UI.h", ??? "T13Action.h", ??? "T14Animation.h", ??? "T15Speed.h", ??? "T16CCFollow.h", ??? "T17CCProgressTo.h", ??? "T18Grid3D.h", ??? "T19Draw.h", ??? "T20Music.h", ??? "T21Particle.h", ??? "T22UserDefault.h" }; ? ? CCScene * TMenu::scene() { ??? CCScene * scene = CCScene::create(); ??? TMenu * layer = TMenu::create(); ??? scene->addChild(layer); ??? return scene; } ? bool TMenu::init() { ??? CCLayer::init(); ? ??? menu = CCMenu::create(); ??? for (int i = 0; i < sizeof(menu_array) / sizeof(*menu_array); i++) ??? { ??????? CCMenuItem * item = CCMenuItemFont::create(menu_array[i], ??????????????????????????????????????????????? ?? this, ??????????????????????????????????????????????? ?? menu_selector(TMenu::menuCallback)); ??????? menu->addChild(item); ??? } ??? menu->alignItemsVertically(); ??? addChild(menu); ? ??? CCArray * array = menu->getChildren(); ??? CCObject * obj; ??? int i = 0; ??? CCARRAY_FOREACH(array,obj) ??? { ??????? CCMenuItem * item = (CCMenuItem*)obj; ??????? item->setTag(i + 1 + 10000); ??????? i++; ??? } ??? CCMenuItem * closeItem = CCMenuItemImage::create("CloseNormal.png", "CloseSelected.png"); ??? closeItem->setTarget(this, menu_selector(TMenu::closeCallback)); ??? CCMenu * menu2 = CCMenu::create(closeItem, NULL); ??? menu2->setPosition(CCPointZero); ??? closeItem->setPosition(ccp(winSize.width - closeItem->getContentSize().width / 2, ??????????????????????????? ?? winSize.height - closeItem->getContentSize().height / 2)); ??? addChild(menu2); ? ??? setTouchEnabled(true); ??? setTouchMode(kCCTouchesOneByOne); ? ??? return true; } ? void TMenu::menuCallback(CCObject * sender) { ??? CCMenuItem * item = (CCMenuItem *)sender; ??? CCScene * pScene = NULL; ??? switch (item->getTag()-10000) ??? { ??????? case 1: ??????????? pScene = T01LayerAnchorPoint::scene(); ??????????? break; ??????? case 2: ??????????? pScene = T02LayerSprite::scene(); ??????????? break; ??????? case 3: ??????????? pScene = T03LayerZorder::scene(); ??????????? break; ??????? case 4: ??????????? pScene = T04ColorLayer::scene(); ??????????? break; ??????? case 5: ??????????? pScene = T05Coordinate::scene(); ??????????? break; ??????? case 6: ??????????? pScene = T06BatchNode::scene(); ??????????? break; ??????? case 7: ??????????? pScene = T07Schedule::scene(); ??????????? break; ??????? case 8: ??????????? pScene = T08Touch::scene(); ??????????? break; ??????? case 9: ??????????? pScene = T09Memory::scene(); ??????????? break; ??????? case 10: ??????????? pScene = T10Label::scene(); ??????????? break; ??????? case 11: ??????????? pScene = T11CCMenu::scene(); ??????????? break; ??????? case 12: ??????????? pScene = T12UI::scene(); ??????????? break; ??????? case 13: ??????????? pScene = T13Action::scene(); ??????????? break; ??????? case 14: ??????????? pScene = T14Animation::scene(); ??????????? break; ??????? case 15: ??????????? pScene = T15Speed::scene(); ??????????? break; ??????? case 16: ??????????? pScene = T16CCFollow::scene(); ??????????? break; ??????? case 17: ??????????? pScene = T17CCProgressTo::scene(); ??????????? break; ??????? case 18: ??????????? pScene = T18Grid3D::scene(); ??????????? break; ??????? case 19: ??????????? pScene = T19Draw::scene(); ??????????? break; ??????? case 20: ??????????? pScene = T20Music::scene(); ??????????? break; ??????? case 21: ??????????? pScene = T21Particle::scene(); ??????????? break; ??????? case 22: ??????????? pScene = T22CCUserDefault::scene(); ??????????? break; ??? } ? ??? //下面的代碼用于做控制場景切換用 ??? if (pScene != NULL) ??? { ?????? static int idx = 0; ?????? CCTransitionScene * scene = switchSceneEffect(idx++, 2, pScene); ?????? if (idx == 27) ?????? { ?????????? idx = 0; ?????? } ?????? CCDirector::sharedDirector()->replaceScene(scene); ??? } ??? } ? void TMenu::closeCallback(CCObject * sender) { ??? exit(0); } ? bool TMenu::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { ??? return true; } ? void TMenu::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) { ??? CCRect rcWin = CCRect(0, 40, winSize.width, winSize.height-80); ??? CCMenuItem * firstItem = (CCMenuItem *)menu->getChildren()->objectAtIndex(0); ??? CCMenuItem * lastItem = (CCMenuItem *)menu->getChildren()->lastObject(); ? ??? CCPoint firstInWorld = menu->convertToWorldSpace(firstItem->getPosition()); ??? CCPoint lastInWorld = menu->convertToWorldSpace(lastItem->getPosition()); ? ??? if (rcWin.containsPoint(firstInWorld)&&pTouch->getDelta().y<0) ??????? return; ??? if (rcWin.containsPoint(lastInWorld) && pTouch->getDelta().y >0) ??????? return; ? ??? menu->setPositionY(menu->getPositionY() + pTouch->getDelta().y); } |
| 運(yùn)行效果:
|
2 有時(shí)候我們想等場景切換徹底完成之后再讓動(dòng)畫播放,這時(shí)候需要做重寫以下代碼:
| void onEnter(); void onEnterTransitionDidFinish(); |
?
案例:
| #include "T14Animation.h" #include "AppMacros.h" ? CCScene *T14Animation::scene() { ??? CCScene * scene = CCScene::create(); ??? T14Animation * layer = T14Animation::create(); ??? scene->addChild(layer); ??? return scene; } ? bool T14Animation::init() { ??? TBack::init(); ??? return true; } ? //在進(jìn)入場景的時(shí)候做以下操作 void T14Animation::onEnter() { ??? TBack::onEnter(); ??? //以圖片的方式創(chuàng)建一個(gè)精靈 ??? spr = CCSprite::create("animation/p_2_01.png"); ??? //設(shè)置精靈的顯示位置 ??? spr->setPosition(ccp(winSize.width / 2, winSize.height / 2)); ??? addChild(spr); } ? //當(dāng)場景切換徹底完成之后執(zhí)行的動(dòng)作。 void T14Animation::onEnterTransitionDidFinish() { ??? TBack::onEnterTransitionDidFinish(); ??? //plist中是圖片信息 ??? CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("animation/plant.plist"); ? ??? //創(chuàng)建動(dòng)畫 ??? CCAnimation * animation = CCAnimation::create(); ??? //這個(gè)用于存儲圖片的名字 ??? char? nameBuf[100]; ??? for (int i = 0; i < 8; i++) ??? { ??????? memset(nameBuf, 0, sizeof(nameBuf)); ??????? sprintf(nameBuf, "p_2_0%d.png", i + 1); ??? ??? animation->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(nameBuf)); ??? } ??? //設(shè)置每次動(dòng)畫執(zhí)行的時(shí)候的延時(shí) ??? animation->setDelayPerUnit(0.1f); ??? //這只循環(huán)兩次 ??? animation->setLoops(2); ? ??? CCAnimate * animate = CCAnimate::create(animation); ??? spr->runAction(animate); } |
上面案例在場景徹底切換完成之后新場景中的動(dòng)畫等效果才執(zhí)行。
總結(jié)
以上是生活随笔為你收集整理的8 cocos2dx添加场景切换效果,控制场景切换彻底完成之后再执行动画的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5.cocos2dx中关于draw绘图,
- 下一篇: 问道宝宝成长列表怎么找(问道宝宝成长列表