欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > 内容正文

Cocos2d-x学习笔记(四)CCScene分析

来源: 开发者 投稿于  被查看 16383 次 评论:81

Cocos2d-x学习笔记(四)CCScene分析


 

 

前言

之前提到CCScene是场景,是整个游戏的舞台,通过查看源码我们不难发现CCScene也是CCNode的子节点,那么它也拥有我们上一节讲的CCNode的所有非private属性及方法。

CCScene的作用十为了联系所有的CCNode节点(包括CCLayer、CCSprite等)。

当清楚知道每个场景要显示的内容,那么定义出不同的CCNode,然后统一添加到CCScene中,执行CCDirector->runWithScene()就可以显示在屏幕上了。

 

源码分析

class CC_DLL CCScene : public CCNode
{
public:
    CCScene();
    virtual ~CCScene();
    bool init();

    static CCScene *create(void);
};

CCScene::CCScene()
{
    m_bIgnoreAnchorPointForPosition = true;
    setAnchorPoint(ccp(0.5f, 0.5f));
}

CCScene::~CCScene()
{
}

bool CCScene::init()
{
    bool bRet = false;
     do 
     {
         CCDirector * pDirector;
         CC_BREAK_IF( ! (pDirector = CCDirector::sharedDirector()) );
         this->setContentSize(pDirector->getWinSize());
         // success
         bRet = true;
     } while (0);
     return bRet;
}

CCScene *CCScene::create()
{
    CCScene *pRet = new CCScene();
    if (pRet && pRet->init())
    {
        pRet->autorelease();
        return pRet;
    }
    else
    {
        CC_SAFE_DELETE(pRet);
        return NULL;
    }
}

我们可以发现整个CCScene类实现的代码并不多,主要是在构造方法中将锚点设置在了中心位置,但是开启了在设置位置时忽略锚点坐标(我们知道CCNode默认的锚点位置是(0, 0),即节点左下角)。 作为场景类,为何只有这两个函数而没有其他方法呢,因为目前在CCScene承担的是一个容器的功能,游戏开发时需要渲染的对象反正CCScene里面统一管理,包括创建、销毁和场景切换等。
在场景切换的时候常常都可以看到切换效果,其实系统已经给我们提供了一套效果,他们都是继承自CCTransitionScene,下面看看它的源码:
class CC_DLL CCTransitionScene : public CCScene
{

protected:
    CCScene    * m_pInScene;
    CCScene    * m_pOutScene;
    float    m_fDuration;
    bool    m_bIsInSceneOnTop;
    bool    m_bIsSendCleanupToScene;

public:
    CCTransitionScene();
    virtual ~CCTransitionScene();
    virtual void draw();
    virtual void onEnter();
    virtual void onExit();
    virtual void cleanup();

    static CCTransitionScene * create(float t, CCScene *scene);

    // 该方法初始化一个场景过渡效果,并指定过渡时间和即将过渡的场景
    virtual bool initWithDuration(float t, CCScene* scene);
    // 该方法在过渡效果结束时会调用
    void finish(void);
    // 部分过渡效果会使用该方法来隐藏更外面的场景
    void hideOutShowIn(void);protected:    virtual void sceneOrder();private:    void setNewScene(float dt);};

写个最简单得淡入淡出场景切换效果为例,场景在1S内过渡到另一个场景

CCTransitionFade * transitionScene = CCTransitionFade::initWithDuration(1, gameScene);
CCDirector::sharedDirector()->replaceScene(transitionScene);

自带场景切换效果汇总

// 涡轮效果
class CC_DLL CCTransitionRotoZoom : public CCTransitionScene

// 跳动进入
class CC_DLL CCTransitionJumpZoom : public CCTransitionScene

// 从左/右/上/下侧进入
class CC_DLL CCTransitionMoveInL : public CCTransitionScene, public CCTransitionEaseScene
class CC_DLL CCTransitionMoveInR : public CCTransitionMoveInL
class CC_DLL CCTransitionMoveInT : public CCTransitionMoveInL
class CC_DLL CCTransitionMoveInB : public CCTransitionMoveInL

// 从左/右/上/下侧滑入
class CC_DLL CCTransitionSlideInL : public CCTransitionScene, public CCTransitionEaseScene
class CC_DLL CCTransitionSlideInR : public CCTransitionSlideInL 
class CC_DLL CCTransitionSlideInT : public CCTransitionSlideInL
class CC_DLL CCTransitionSlideInB : public CCTransitionSlideInL

// 交替进入
class CC_DLL CCTransitionShrinkGrow : public CCTransitionScene , public CCTransitionEaseScene

// 左右翻转进入
class CC_DLL CCTransitionFlipX : public CCTransitionSceneOriented

// 上下翻转进入
class CC_DLL CCTransitionFlipY : public CCTransitionSceneOriented

// 左上右下轴翻入
class CC_DLL CCTransitionFlipAngular : public CCTransitionSceneOriented

// 左右放大缩小效果翻入
class CC_DLL CCTransitionZoomFlipX : public CCTransitionSceneOriented

// 上下放大缩小效果翻入
class CC_DLL CCTransitionZoomFlipY : public CCTransitionSceneOriented

// 左上右下放大缩小效果翻入
class CC_DLL CCTransitionZoomFlipAngular : public CCTransitionSceneOriented

// 相变暗,再渐入
class CC_DLL CCTransitionFade : public CCTransitionScene

// 渐变进入
class CC_DLL CCTransitionCrossFade : public CCTransitionScene

// 小方格消失进入
class CC_DLL CCTransitionTurnOffTiles : public CCTransitionScene ,public CCTransitionEaseScene

// 竖条切换进入
class CC_DLL CCTransitionSplitCols : public CCTransitionScene , public CCTransitionEaseScene

// 横条切换进入
class CC_DLL CCTransitionSplitRows : public CCTransitionSplitCols

// 小方格右上角显示进入
class CC_DLL CCTransitionFadeTR : public CCTransitionScene , public CCTransitionEaseScene

// 小方格左下角显示进入
class CC_DLL CCTransitionFadeBL : public CCTransitionFadeTR

// 横条向上显示进入
class CC_DLL CCTransitionFadeUp : public CCTransitionFadeTR

// 横条向下显示进入
class CC_DLL CCTransitionFadeDown : public CCTransitionFadeTR

在之后的笔记中,我们将讲到CCAction,场景切换动画的原理我们也将在学习完CCAction后学习。 好了,这一节就讲到这了,下一节我们一起学习下CCLayer吧~

相关频道:

用户评论