原创文章,转载请注明出处:http://blog.csdn.net/sfh366958228/article/details/38730335
前言
之前提到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吧~
Cocos2d-x学习笔记(四)CCScene分析
时间: 2024-10-11 18:27:21