cocos2dx CCTransitionScene框架分析

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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值