假设从A场景切换到B场景,调用各场景方法的顺序为:
- 如果没有切换效果(transition),则先调用B的init(),再调用A的onExitTransitionStart(),接着调用A的onExit(),然后调用B的onEnter(),最后调用B的onEnterTransitionFinish;
- 如果有切换效果(transition),则为先调用B的init(),再调用A的onExitTransitionStart(),接着调用B的onEnter(),然后调用A的onExit(),最后调用B的onEnterTransitionFinish。
在这里我们可以明显的看到,有没有transition影响了两个场景切换时对应方法的调用顺序,如果在对应的方法中做了一些和调用顺序相关的事情,比如释放资源等操作,那么一定要注意这种区别。
例子
场景A切换到场景B,有切换特效
调用顺序如下:(AAABABABA)
A:构造函数
A:onEnter
A:onEnterTransitionDidFinish
B:构造函数
A:onExitTransitionDidStart
B:onEnter
A:onExit
B:onEnterTransitionDidFinish
A:析构函数
场景A切换到场景B,无切换特效
调用顺序如下:(AAABAABBA)
A:构造函数
A:onEnter
A:onEnterTransitionDidFinish
B:构造函数
A:onExitTransitionDidStart
A:onExit
B:onEnter
B:onEnterTransitionDidFinish
A:析构函数
场景A中pushScene B场景,有切换特效(AAABABAB)
调用顺序如下:
A:构造函数
A:onEnter
A:onEnterTransitionDidFinish
B:构造函数
A:onExitTransitionDidStart
B:onEnter
A:onExit
B:onEnterTransitionDidFinish
场景A中pushScene B场景,无切换特效(AAABAABB)
调用顺序如下:
A:构造函数
A:onEnter
A:onEnterTransitionDidFinish
B:构造函数
A:onExitTransitionDidStart
A:onExit
B:onEnter
B:onEnterTransitionDidFinish
场景B中popScene
调用顺序如下:
B:onExitTransitionDidStart
B:onExit
A:onEnter
A:onEnterTransitionDidFinish
例子2
首先我们创建一个项目,然后咱们在做一些程序测试。
第一步 创建我们自己的类,其基类为CCLayer
#ifndef __MyScene_H__
#define __MyScene_H__
#include "cocos2d.h"
USING_NS_CC;
class MyScene : public CCLayer
{
public:
//需要我们手动实现
bool init();
//需要我们手动实现
static CCScene* scene();
//这时一个宏,真正的函数是create(),在该函数中会调用init()函数
CREATE_FUNC(MyScene);
};
#endif
首先我们实现scene函数,然后实现init函数
#include "MyScene.h"
//创建scene
CCScene* MyScene::scene() {
CCScene * scene = CCScene::create();
MyScene* layer = MyScene::create();//此处调用该宏创建MyScene*对象,并调用init函数
scene->addChild(layer);
return scene;
}
//主要
bool MyScene::init() {
//调用父类的init()函数
if (!CCLayer::init())
{
return false;
}
//通过文件路径创建精灵
//CCSprite* sprite = CCSprite::create("exp01.jpg");
// 通过纹理创建精灵,纹理通过纹理缓存加载,可以达到节约内存的目的
CCTexture2D* texture = CCTextureCache::sharedTextureCache()->addImage("exp01.jpg");
//CCSprite* sprite = CCSprite::createWithTexture(texture);
//CCSprite* sprite = CCSprite::createWithTexture(texture, CCRect(272, 274, 474, 200));
// 通过精灵帧来创建精灵,精灵帧的引入为了减少内存边角料的浪费情况,
//意思就是我们一次加载一大张图片然后我们剪裁一小部分进行显示
CCSpriteFrame* spriteFrame = CCSpriteFrame::createWithTexture(texture, CCRect(272, 274, 474, 200));
//CCSprite* sprite = CCSprite::createWithSpriteFrame(spriteFrame);
// 通过精灵帧缓存里缓存的精灵帧来创建精灵
//CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFrame(spriteFrame, "mySpriteFrame");
//CCSprite* sprite = CCSprite::createWithSpriteFrameName("mySpriteFrame");
//通过创建空的精灵,在后期添加
CCSprite* sprite = CCSprite::create();
//sprite->setDisplayFrame(spriteFrame);
sprite->setTexture(texture);
sprite->setTextureRect(CCRect(272, 274, 474, 200));
this->addChild(sprite);
sprite->setPosition(ccp(200,200));
return true;
}
那么我们如何让框架调用我们写的自定义类呢,那么还得从scene函数考虑:
bool AppDelegate::applicationDidFinishLaunching() {
// initialize director
CCDirector* pDirector = CCDirector::sharedDirector();
CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
pDirector->setOpenGLView(pEGLView);
// turn on display FPS
pDirector->setDisplayStats(true);
// set FPS. the default value is 1.0/60 if you don't call this
pDirector->setAnimationInterval(1.0 / 60);
// create a scene. it's an autorelease object
CCScene *pScene = MyScene::scene();/在这里调用我们的自定义类的静态函数
// run
pDirector->runWithScene(pScene);
return true;
}
好了我想你也应该明白程序的大概流程了吧,可能你看着还简单,没什么用,但是我们不能一口吃个胖子,慢慢来,逐步提高。