CCDirector中的三个比较重要的成员方法:
void runWithScene(CCScene *pScene);// 运行pScene整个场景
/**Suspends the execution of the running scene, pushing it on the stack of suspended scenes.
* The new scene will be executed.
* Try to avoid big stacks of pushed scenes to reduce memory allocation.
* ONLY call it if there is a running scene.
*/
void pushScene(CCScene *pScene);// 将当前运行的场景进行压栈,用将要执行的场景来替换它
/**Pops out a scene from the queue.
* This scene will replace the running one.
* The running scene will be deleted. If there are no more scenes in the stack the execution is terminated.
* ONLY call it if there is a running scene.
*/
void popScene(void);//将栈中的第一个scene出栈,释放掉它
值的注意的是:以上三种切换场景的方法(replaceScene、pushScene、popScene)均是先将待切换的场景完全加载完毕后,才将当前运行的场景释放掉。所以,在新场景恰好完全加载完毕的瞬间,系统中同时存在着两个场景,这将是对内存的一个考验,若不注意的话,切换场景可能会造成内存不足。
我们继续看例子:
void MyChipmunkAccelScene::runMyScene() {
MyChipmunkAccelLayer *layer = new MyChipmunkAccelLayer;
layer->initLayer();
this->addChild(layer, 1);
CCScene *runscene = CCDirector::sharedDirector()->getRunningScene();
CCDirector::sharedDirector()->pushScene(runscene);//先将当前的runscene放入到堆栈中
CCDirector::sharedDirector()->popScene();//释放掉它
CCDirector::sharedDirector()->replaceScene(this);
layer->autorelease();
}
例子:
void MyChipmunkAccelScene::runMyScene() {
MyChipmunkAccelLayer *layer = new MyChipmunkAccelLayer;
layer->initLayer();
this->addChild(layer, 1);
// CCScene *runscene = CCDirector::sharedDirector()->getRunningScene();
CCDirector::sharedDirector()->pushScene(this);
this->retain();// 因为cocos2dx采用的是计数进行内存管理,
layer->autorelease();
}
MyChipmunkAccelScene::~MyChipmunkAccelScene() {
CCDirector::sharedDirector()->popScene();// 在使用完的时候直接pop掉
}
其实这里也可以不用这样写,看到了源码,在结束当前的scene的时候,会结束当前scene中的scene:
ccArrayRemoveAllObjects
通过:
m_pTargetedHandlers->removeAllObjects();