首页 > 代码库 > 8 cocos2dx添加场景切换效果,控制场景切换彻底完成之后再执行动画
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;
classTMenu:publicCCLayer { public: staticCCScene *scene(); CREATE_FUNC(TMenu); boolinit();
CCMenu *menu;
voidmenuCallback(CCObject * sender); voidcloseCallback(CCObject * sender);
virtualboolccTouchBegan(CCTouch *pTouch,CCEvent *pEvent); virtualvoidccTouchMoved(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; } }
staticchar *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); returnscene; }
boolTMenu::init() { CCLayer::init();
menu =CCMenu::create(); for (inti = 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; inti = 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);
returntrue; }
voidTMenu::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); }
}
voidTMenu::closeCallback(CCObject * sender) { exit(0); }
boolTMenu::ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent) { returntrue; }
voidTMenu::ccTouchMoved(CCTouch *pTouch,CCEvent *pEvent) { CCRectrcWin =CCRect(0, 40,winSize.width,winSize.height-80); CCMenuItem *firstItem = (CCMenuItem *)menu->getChildren()->objectAtIndex(0); CCMenuItem *lastItem = (CCMenuItem *)menu->getChildren()->lastObject();
CCPointfirstInWorld =menu->convertToWorldSpace(firstItem->getPosition()); CCPointlastInWorld =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); } |
运行效果: |
2有时候我们想等场景切换彻底完成之后再让动画播放,这时候需要做重写以下代码:
voidonEnter(); voidonEnterTransitionDidFinish(); |
案例:
#include"T14Animation.h" #include"AppMacros.h"
CCScene *T14Animation::scene() { CCScene *scene =CCScene::create(); T14Animation *layer =T14Animation::create(); scene->addChild(layer); returnscene; }
boolT14Animation::init() { TBack::init(); returntrue; }
//在进入场景的时候做以下操作 voidT14Animation::onEnter() { TBack::onEnter(); //以图片的方式创建一个精灵 spr =CCSprite::create("animation/p_2_01.png"); //设置精灵的显示位置 spr->setPosition(ccp(winSize.width / 2, winSize.height / 2)); addChild(spr); }
//当场景切换彻底完成之后执行的动作。 voidT14Animation::onEnterTransitionDidFinish() { TBack::onEnterTransitionDidFinish(); //plist中是图片信息 CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("animation/plant.plist");
//创建动画 CCAnimation *animation =CCAnimation::create(); //这个用于存储图片的名字 char nameBuf[100]; for (inti = 0;i < 8;i++) { memset(nameBuf, 0, sizeof(nameBuf)); sprintf(nameBuf,"p_2_0%d.png",i + 1); animation->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(nameBuf)); } //设置每次动画执行的时候的延时 animation->setDelayPerUnit(0.1f); //这只循环两次 animation->setLoops(2);
CCAnimate *animate =CCAnimate::create(animation); spr->runAction(animate); } |
上面案例在场景彻底切换完成之后新场景中的动画等效果才执行。
8 cocos2dx添加场景切换效果,控制场景切换彻底完成之后再执行动画