#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; }