zoukankan      html  css  js  c++  java
  • 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);

    }

    执行效果:

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

    }

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

  • 相关阅读:
    NewtonSoft.Json
    属性
    csv文件
    C#和递归算法实现删除,清空,拷贝目录
    朴素贝叶斯应用:垃圾邮件分类
    压缩图片
    numpy分布图
    鸢尾花
    numpy数组及处理:效率对比
    完整的中英文词频统计
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4260610.html
Copyright © 2011-2022 走看看