8 cocos2dx添加场景切换效果,控制场景切换彻底完成之后再执行动画

简介:  1 添加场景切换效果 供场景切换的类: CCTransitionJumpZoom CCTransitionProgressRadialCCW CCTransitionProgressRadialCW CCTransitionProgressHorizontal CCTransitionProgressVertical


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);

}

运行效果:

2 有时候我们想等场景切换彻底完成之后再让动画播放,这时候需要做重写以下代码:

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;

}

 

//在进入场景的时候做以下操作

void T14Animation::onEnter()

{

    TBack::onEnter();

    //以图片的方式创建一个精灵

    spr = CCSprite::create("animation/p_2_01.png");

    //设置精灵的显示位置

    spr->setPosition(ccp(winSize.width / 2, winSize.height / 2));

    addChild(spr);

}

 

//当场景切换彻底完成之后执行的动作。

void T14Animation::onEnterTransitionDidFinish()

{

    TBack::onEnterTransitionDidFinish();

    //plist中是图片信息

    CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("animation/plant.plist");

 

    //创建动画

    CCAnimation * animation = CCAnimation::create();

    //这个用于存储图片的名字

    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));

    }

    //设置每次动画执行的时候的延时

    animation->setDelayPerUnit(0.1f);

    //这只循环两次

    animation->setLoops(2);

 

    CCAnimate * animate = CCAnimate::create(animation);

    spr->runAction(animate);

}

上面案例在场景彻底切换完成之后新场景中的动画等效果才执行。

目录
相关文章
|
11月前
【Three.js入门】处理动画、尺寸自适应、双击进入/退出全屏(Clock跟踪时间,Gsap动画库,自适应画面,进入/退出全屏)
【Three.js入门】处理动画、尺寸自适应、双击进入/退出全屏(Clock跟踪时间,Gsap动画库,自适应画面,进入/退出全屏)
|
XML 图形学 数据格式
Animation组合动画踩坑-实现循环播放动画,可控制次数
Animation组合动画踩坑-实现循环播放动画,可控制次数
|
前端开发
妙啊!动画还可以这样控制?
妙啊!动画还可以这样控制?
252 0
妙啊!动画还可以这样控制?
实现场景切换的时候淡入淡出的效果(Unity3D)
在游戏中不可避免的要进行场景切换,如果切换的场景要加载的资源太多太大,那么就要耗时很长时间,这对于用户的体验来说很不舒服,也就是常说的游戏卡了。怎么解决这种尴尬呢。比较推荐的就是异步加载场景,然后中间加一个过渡场景,过渡场景做的美观一些,然后加一个进度条,看起来就不会那么尴尬了。然后在场景过渡的时候,加一个淡入淡出的效果,就很nice了今天就实现一个场景切换的时候淡入淡出的效果。剩下的场景异步加载还有中间过渡场景有时间再写。
UGUI系列-文字实现进度等待、进度加载、进程等待演示动画
今天分享一下UGUI 文字实现进度等待、进度加载、进程等待演示动画,实现思路比较简单,效果也比较简单,仅供大家参考,谢谢
|
Dart 开发者
【Flutter】Animation 动画 ( AnimatedBuilder 动画使用流程 | 创建动画控制器 | 创建动画 | 创建动画作用的组件 | 关联动画与组件 | 动画执行 )(三)
【Flutter】Animation 动画 ( AnimatedBuilder 动画使用流程 | 创建动画控制器 | 创建动画 | 创建动画作用的组件 | 关联动画与组件 | 动画执行 )(三)
148 0
【Flutter】Animation 动画 ( AnimatedBuilder 动画使用流程 | 创建动画控制器 | 创建动画 | 创建动画作用的组件 | 关联动画与组件 | 动画执行 )(三)
【Flutter】Animation 动画 ( AnimatedBuilder 动画使用流程 | 创建动画控制器 | 创建动画 | 创建动画作用的组件 | 关联动画与组件 | 动画执行 )(一)
【Flutter】Animation 动画 ( AnimatedBuilder 动画使用流程 | 创建动画控制器 | 创建动画 | 创建动画作用的组件 | 关联动画与组件 | 动画执行 )(一)
131 0
【Flutter】Animation 动画 ( AnimatedBuilder 动画使用流程 | 创建动画控制器 | 创建动画 | 创建动画作用的组件 | 关联动画与组件 | 动画执行 )(二)
【Flutter】Animation 动画 ( AnimatedBuilder 动画使用流程 | 创建动画控制器 | 创建动画 | 创建动画作用的组件 | 关联动画与组件 | 动画执行 )(二)
134 0
|
存储 图形学
动画系统中的基础动画
动画系统中的基础动画
131 0
动画系统中的基础动画