[cocos2dx笔记007]一个自定义场景切换的实例

[cocos2dx笔记007]一个自定义场景切换的实例
cocos2dx框架已经提供了很多场景切换的类,但是一些自定义的场景切换,只有自己实现了。下面是实现的类。这里设计的分辨率是750*500.请根据实际的要求调整。
头文件
#ifndef _TRANSITION_GAME_H_
#define _TRANSITION_GAME_H_
#include <cocos2d.h>
namespace cocos2d 
{
     class CCTransitionGame :  public CCTransitionScene
    {
     public:
        CCTransitionGame();
         virtual ~CCTransitionGame();
         void onEnter();
         static CCTransitionGame * create( float t, CCScene *scene);
     private:
         void LRFinish( void);
         void OnFirstActionFinish( void);
     private:
         int m_FinishCnt;
    };
}
#endif
源文件
#include "TransitionGame.h"
#include "xlog.h"
#include <xstring.h>
namespace cocos2d
{
     using  namespace zdh;
    CCTransitionGame * CCTransitionGame::create( float t, CCScene *scene)
    {
        CCTransitionGame * pScene =  new CCTransitionGame();
         if (pScene && pScene->initWithDuration(t, scene))
        {
            pScene->autorelease();
             return pScene;
        }
        CC_SAFE_DELETE(pScene);
         return NULL;
    }

    CCTransitionGame::CCTransitionGame()
    {
        m_FinishCnt = 0;
    }

    CCTransitionGame::~CCTransitionGame()
    {
    }

     void CCTransitionGame::onEnter()
    {
        CCTransitionScene::onEnter();
        CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();


        CCPoint stLeftBegin, stLeftEnd, stRightBegin, stRightEnd;
         // 设置左边的起点和终点
        stLeftBegin.setPoint(-436.0f, -60);
        stLeftEnd.setPoint(visibleSize.width / 2.0f + stLeftBegin.x, -60.0f);
         // 设置右边的起点和终点
        stRightBegin.setPoint(visibleSize.width, -60.0f);
        stRightEnd.setPoint(visibleSize.width / 2.0f, -60.0f);
         // 加载动画序列
        CCSpriteFrameCache* pCache = CCSpriteFrameCache::sharedSpriteFrameCache();
        pCache->addSpriteFramesWithFile("middle_ani_1.plist");
        pCache->addSpriteFramesWithFile("middle_ani_2.plist");
         // 生成画动图片列表和动画对象
        CCArray* pAnimFrames = CCArray::createWithCapacity(69);
        XAnsiString strAniName;
         for ( int i = 1; i < 70; i++)
        {
            strAniName.printf("light%04d.png", i);
            pAnimFrames->addObject(pCache->spriteFrameByName(strAniName.c_str()));
        }
        CCAnimation* animation = CCAnimation::createWithSpriteFrames(pAnimFrames,  this->m_fDuration * 2.0f/3.0f/69.0f );
        

        CCNode * pNode = CCNode::create();  // 这个有两个子节点,一个是左边交换图片,一个是中间的动画,用于一起做移动的Action
        CCSprite* pLeft = CCSprite::createWithSpriteFrameName("swap_left.png");
        pLeft->setAnchorPoint(CCPointZero);
        pNode->addChild(pLeft);

        CCSprite * pMiddle = CCSprite::create();   // 显示动画
        pMiddle->setAnchorPoint(CCPointZero);
        pMiddle->setPosition(ccp(436.0f - 69.0f, 250.0f + 60.0f - 72.0f));
        pMiddle->runAction(CCAnimate::create(animation));
        pNode->addChild(pMiddle);

        pNode->setAnchorPoint(ccp(0,0));
        pNode->setPosition(stLeftBegin);
         this->addChild(pNode,1);

         // 右边的交换图片
        CCSprite* pRight = CCSprite::createWithSpriteFrameName("swap_right.png");
        pRight->setPosition(stRightBegin);
        pRight->setAnchorPoint(CCPointZero);
         this->addChild(pRight, 0);

         // 定义动作
        
// 左边的向右移动活动
        CCMoveTo* pActionLeft = CCMoveTo::create(m_fDuration / 3, stLeftEnd);
         // 右边的向左移动活动
        CCMoveTo * pActionRight = CCMoveTo::create(m_fDuration / 3, stRightEnd);
         // 原地不动
        CCMoveTo* pActionLeft1 = CCMoveTo::create(m_fDuration / 3, stLeftEnd);
        CCMoveTo * pActionRight1 = CCMoveTo::create(m_fDuration / 3, stRightEnd);
        
        CCMoveTo* pActionLeft2 = CCMoveTo::create(m_fDuration / 3, stLeftBegin);
        CCMoveTo * pActionRight2 = CCMoveTo::create(m_fDuration / 3, stRightBegin);

        m_FinishCnt = 0;
        pNode->runAction(CCSequence::create(pActionLeft, CCCallFunc::create( this, callfunc_selector(CCTransitionGame::OnFirstActionFinish)), pActionLeft1, pActionLeft2, CCCallFunc::create( this, callfunc_selector(CCTransitionGame::LRFinish)), NULL));
        pRight->runAction(CCSequence::create(pActionRight, pActionRight1,pActionRight2, CCCallFunc::create( this, callfunc_selector(CCTransitionGame::LRFinish)), NULL));
    }

     void CCTransitionGame::LRFinish( void)
    {
         // 所以的活动完成后,要执行场行的Finish
        m_FinishCnt++;
         if (m_FinishCnt >= 2)
        {
            CCTransitionScene::finish();
        }
    }

     void CCTransitionGame::OnFirstActionFinish( void)
    {
         // 打开门之前,关闭显示第一个场景,显示第二个场景
        m_pInScene->setVisible( true);
        m_pOutScene->setVisible( false);
    }

}
用到的资源
/Files/zdhsoft/plist.zip 效果图:

你可能感兴趣的:([cocos2dx笔记007]一个自定义场景切换的实例)