1、base class : CCScene;
2、核心属性protected:
CCScene * m_pInScene; //新的场景 CCScene * m_pOutScene; //被替换的场景 float m_fDuration; //动画间隔
3、核心方法:
/** initializes a transition with duration and incoming scene */ virtual bool initWithDuration(float t,CCScene* scene); /** called after the transition finishes */ void finish(void); private: void setNewScene(float dt);4、如何使用(用它的一个子类CCTransitionRotoZoom来举例):一般是创建子类的实例,需要把新的场景和动画间隔通过构造方法传进来,如:static CCTransitionRotoZoom* create(float t, CCScene* scene);子类在onEnter()方法中实现具体动画效果,如:void CCTransitionRotoZoom:: onEnter() { CCTransitionScene::onEnter(); m_pInScene->setScale(0.001f); m_pOutScene->setScale(1.0f); m_pInScene->setAnchorPoint(ccp(0.5f, 0.5f)); m_pOutScene->setAnchorPoint(ccp(0.5f, 0.5f)); CCActionInterval *rotozoom = (CCActionInterval*)(CCSequence::create ( CCSpawn::create ( CCScaleBy::create(m_fDuration/2, 0.001f), CCRotateBy::create(m_fDuration/2, 360 * 2), NULL ), CCDelayTime::create(m_fDuration/2), NULL )); m_pOutScene->runAction(rotozoom); m_pInScene->runAction ( CCSequence::create ( rotozoom->reverse(), CCCallFunc::create(this, callfunc_selector(CCTransitionScene::finish)), //重点 NULL ) ); }//下面假设pScene为CCTransitionRotoZoom实例,在创建时通过m_pOutScene = CCDirector::sharedDirector()->getRunningScene();可以获取到被替换场景了,CCDirector::sharedDirector()->replaceScene(pScene);当CCTransitionRotoZoom::onEnter()播放切换动画后,调用CCTransitionScene:Finish()设置新旧场景的状态,比如可视状态等,接着调用CCTransitionScene:setNewScene()是导演设置新的场景为当前运行的场景,代码如下:void CCTransitionScene::setNewScene(float dt) { CC_UNUSED_PARAM(dt); this->unschedule(schedule_selector(CCTransitionScene::setNewScene)); // Before replacing, save the "send cleanup to scene" CCDirector *director = CCDirector::sharedDirector(); m_bIsSendCleanupToScene = director->isSendCleanupToScene(); director->replaceScene(m_pInScene); // issue #267 m_pOutScene->setVisible(true); }基本上整个流程就是这样。