cocos2dx CCTransitionScene框架分析

来源:互联网 发布:linux如何查看登录情况 编辑:程序博客网 时间:2024/06/03 10:54

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(thiscallfunc_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);}
基本上整个流程就是这样。





0 0
原创粉丝点击