cocos2d-x 2.x版本中,场景切换各方法调用顺序

假设从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;
}


好了我想你也应该明白程序的大概流程了吧,可能你看着还简单,没什么用,但是我们不能一口吃个胖子,慢慢来,逐步提高。

发布了30 篇原创文章 · 获赞 0 · 访问量 281

猜你喜欢

转载自blog.csdn.net/andy1515/article/details/103740926
今日推荐