首页 > 代码库 > 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添加场景切换效果,控制场景切换彻底完成之后再执行动画