CSceneExtension* CSceneManager::loadScene(const char* pSceneName) { CCAssert(pSceneName && strlen(pSceneName), "should not null"); map<string, CSceneExtension*>::iterator mitr = m_mSceneCachePool.find(pSceneName); if( mitr != m_mSceneCachePool.end() ) { return mitr->second; } #if USING_LUA map<string,int>::iterator itr = m_mFnSceneCreateScriptFunc.find(pSceneName); if(itr!=m_mFnSceneCreateScriptFunc.end()) { LuaEngine* pEngine = LuaEngine::getInstance(); LuaStack* pStack = pEngine->getLuaStack(); __Array pRetArray; pRetArray.initWithCapacity(1); int nRet = pStack->executeFunctionReturnArray(itr->second, 0, 1, pRetArray); CCAssert(pRetArray.count() > 0, "return num = 0"); Ref* pReturnObject = pRetArray.getObjectAtIndex(0); pStack->clean(); CSceneExtension* pSceneExt = dynamic_cast<CSceneExtension*>(pReturnObject); pSceneExt->setClassName(pSceneName); return pSceneExt; } #else map<string, Fn_CreateSceneExtension>::iterator itr = m_mFnSceneCreatePointers.find(pSceneName); if( itr != m_mFnSceneCreatePointers.end() ) { CSceneExtension* pScene = (*itr->second)(); pScene->setClassName(pSceneName); pScene->init(); pScene->autorelease(); return pScene; } #endif return NULL; }