newlist

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
#ifndef __TRANSITIONSCENE_H__
#define __TRANSITIONSCENE_H__

#include "GameFrameHead.h"

class CGameScene;

class GAMEFRAME_API CSplashScene : public CCScene
{
public:
    enum TargetScenes
    { 
        TargetSceneINVALID        = 0, 
        TargetSceneFirstScene    = 1, 
        TargetSceneOtherScene    = 2, 
        TargetSceneMAX            = 3,
    }; 
public:
    CSplashScene(); 
    virtual    ~CSplashScene();

    static CSplashScene*    create(CGameScene* pScene); 
    bool                    init();
    bool                    init(CGameScene* pScene); 
    
    void                    retainPrevResource();
protected:
    virtual void            onEnter();
    virtual void            onEnterTransitionDidFinish();
    void                    loadingCallBack(CCObject *obj);

    void                    onDelayLoading();
    void                    replaceScene();

    virtual    void            loadingPercent();
    float                    getPercent();
private: 
    //virtual void update(float dt); 

private:
    static CSplashScene*    g_pSplashScene;


    CGameScene*                m_pCurScene;
    int                        m_nCurTag;
    CGameScene*                m_pNextScene;

    int                        m_nNumberOfSprites;
    int                        m_nNumberOfLoadedSprites;
    
    float                    m_fPercent;

    CCLabelTTF*                m_pLabelLoading;

    bool                    m_bRetainResource;

};


#endif //__TRANSITIONSCENE_H__
#include "SplashScene.h"
#include "Config.h"
#include "XSprite.h"
#include "GameScene.h"

CSplashScene* CSplashScene::g_pSplashScene = NULL;

CSplashScene::CSplashScene()
{
    m_pCurScene = NULL;
    m_pNextScene = NULL;
    m_nNumberOfSprites = 0;
    m_nNumberOfLoadedSprites = 0;
    m_fPercent = 0;
    m_bRetainResource = false;
}

CSplashScene::~CSplashScene()
{
    CCLog("CSplashScene::~CSplashScene");
}

CSplashScene* CSplashScene::create(CGameScene* pScene )
{

    CSplashScene* pSplashScene = new CSplashScene();
    if (pSplashScene && pSplashScene->init(pScene))
    {
        pSplashScene->autorelease();
        return pSplashScene;
    }

    CCLog("error: CTransitScene::create");
    SAFE_DELETE(pSplashScene);
    return NULL;

}

bool CSplashScene::init( CGameScene* pScene )
{
    m_pCurScene =(CGameScene*) CCDirector::sharedDirector()->getRunningScene();
    if (m_pCurScene)
    {
        m_nCurTag = m_pCurScene->getSceneTag();
    }

    m_pNextScene = pScene;

    return true;
}

void CSplashScene::onEnter()
{
    CCScene::onEnter();

}

void CSplashScene::loadingCallBack( CCObject *obj )
{
    ++m_nNumberOfLoadedSprites;//每调用一次就+1  
    m_fPercent = (float) m_nNumberOfLoadedSprites / (float)m_nNumberOfSprites;
    this->loadingPercent();

    //全部加载完成后,就执行  
    if (m_nNumberOfLoadedSprites == m_nNumberOfSprites)  
    {  
        //加载完 延迟一下切换场景  
        CCDelayTime* pActDelay = CCDelayTime::create(0.5f);
        CCFiniteTimeAction* pAction = CCSequence::create(pActDelay, 
            CCCallFunc::create(this, callfunc_selector(CSplashScene::replaceScene)),
            NULL);
        this->runAction(pAction);
    }  

}

void CSplashScene::onEnterTransitionDidFinish()
{
    CCScene::onEnterTransitionDidFinish();

    if (!m_bRetainResource)
    {
        //CCTextureCache::sharedTextureCache()->removeAllTextures();
        //释放当前一个场景
        if (CConfig::getInstance()->getElementInfoByItem(m_nCurTag))
        {
            vector<PlistInfo>& vecCurPlist = *(CConfig::getInstance()->getElementInfoByItem(m_nCurTag));
            for (vector<PlistInfo>::iterator it = vecCurPlist.begin(); it != vecCurPlist.end(); it++)
            {
                CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFramesFromFile(it->strPlist.c_str());
            }
        }
    }

    CCDelayTime *delayAction = CCDelayTime::create(0.2f);
    CCCallFunc *callSelectorAction = CCCallFunc::create(this,callfunc_selector(CSplashScene::onDelayLoading));
    this->runAction(CCSequence::create(delayAction, callSelectorAction,NULL));

}


void CSplashScene::onDelayLoading()
{
    //加载下一个场景
    //初始化元素  把plist形式的图片资源加载到内存
    vector<PlistInfo>& vecNextPlist = *(CConfig::getInstance()->getElementInfoByItem(m_pNextScene->getSceneTag()));
    m_nNumberOfSprites = vecNextPlist.size();
    for (vector<PlistInfo>::iterator it = vecNextPlist.begin(); it != vecNextPlist.end(); it++)
    {
        //加载图片到内存
        CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(it->strPlist.c_str(),it->strImage.c_str());
    }

    CCDelayTime *delayAction = CCDelayTime::create(0.2f);
    CCCallFunc *callSelectorAction = CCCallFunc::create(this,callfunc_selector(CSplashScene::replaceScene));
    this->runAction(CCSequence::create(delayAction, callSelectorAction,NULL));
}

void CSplashScene::replaceScene()
{
    CCDirector::sharedDirector()->replaceScene(CCTransitionFade::create(1.2f, (CCScene*)m_pNextScene));
}

void CSplashScene::loadingPercent()
{

}

float CSplashScene::getPercent()
{
    return m_fPercent;
}

void CSplashScene::retainPrevResource()
{
    m_bRetainResource = true;
}

 

posted on 2013-07-05 06:04  一枚程序  阅读(374)  评论(0编辑  收藏  举报