8 cocos2dx添加场景切换效果,控制场景切换彻底完成之后再执行动画-阿里云开发者社区

开发者社区> 涂作权> 正文

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

}

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Cocos2d-x多场景切换生命周期
<p><span style="font-size:14px;">在多个场景切换时候,场景的生命周期会更加复杂。这一节我们介绍一下场景切换生命周期。</span></p> <p><span style="font-size:14px;">多个场景切换时候分为几种情况:</span></p> <p><span style="font-size:14px;">情况1,使用pushScene函数从实
1147 0
给自定义控件(Web Control)添加事件的几种方法。前两种方法可以不实现IPostBackEventHandler
    写自定义控件已经好久了,也有几个用得时间比较长的,但是对于“事件”一直是比较模糊,没有很详细的理解。          最近升级分页控件,由于原来使用的是VB.net(在VB.net里面添加一个事件是比较容易的),现在想改用C#,而原来的方法又写得比较笨拙,想换一个更简洁一点的方法,所以不得不重新认识一下事件。
693 0
3.cocos2dx之Menu,通过menu来实现场景的切换
 1 头文件 TMenu.h #ifndef __TMENU_H__ #define __TMENU_H__   #include "cocos2d.h" USING_NS_CC;   class TMenu :public CCLayer { public:
880 0
Learning Cocos2d-x for WP8(6)——场景切换和场景过渡效果
原文:Learning Cocos2d-x for WP8(6)——场景切换和场景过渡效果 C#(wp7)兄弟篇 Learning Cocos2d-x for XNA(6)——场景切换和场景过渡效果 工程文件:SceneTransitionTest.
882 0
Flutter的AnimatedDefaultTextStyle实现文本样式的动画过渡切换效果
AnimatedDefaultTextStyle通过动画过渡的方式来切换文本的显示样式
594 0
jQuery 写的插件图片上下切换幻灯效果
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.
588 0
为数据库添加控制文件
      此文承接上一篇文章,由于对单个控制文件恢复后,数据库里只有一个控制文件,所以要为数据库添加控制文件。 1)在nomount状态修改spfile文件。由于数据库里只有一个控制文件control03.
554 0
iOS 应用添加启动画面以及App应用图标的方法
在ios开发中经常要为项目添加启动画面,目的主要有两个:一、更加美观,二、在启动画面呈现的同时加载初始化内部的项目数据。 注意在ios开发中,需要的是png格式的图片,仅仅良好的支持这一种格式,有钱就是任性。
560 0
+关注
涂作权
java,架构,编程语言相关专家
1234
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载