Cocos2d-x学习笔记(六)之 场景类CCScene

  CCScene 类是CCNode 的子类。和CCNode 相比,它只是添加了一个特性,那就是拥有自己的锚点,位置在屏幕的正中央。除此之外,它目前还没有额外的功能,只是一个抽象的概念。CCScene类的继承关系如下:

  CCTransitionScene-->CCScene-->CCNode-->CCObject-->CCCopying

  可以看到,CCScene 类有CCTransitionScene(切换场景类),并且CCTransitionScene 类有很多子类,这些类都用于切换场景的特效。注意:游戏通常都会出现这种情况,当切换场景时,程序会由于旧场景的内存没有释放并且新场景已经载入,出现短暂的“峰值”,但是不必为此而做额外的工作,因为Cocos2D-x 引擎会清除旧场景的内存。但是要注意,正确使用内存的保留与释放,尤其是使用场景切换特效的时候,你要做的工作是尽早上机测试和合理的内存使用。

  1、创建场景类

 1      //创建场景类
 2     CCScene *scene = CCScene::create();
 3     
 4     // 新建层
 5     HelloWorld *layer = HelloWorld::create();
 6 
 7     // 将层加入到场景中。
 8     scene->addChild(layer);
 9 
10     // 返回场景
11     return scene;

  2、获得并运行场景

1     // 创建场景
2     CCScene *pScene = HelloWorld::scene();
3 
4     // 运行场景
5     CCDirector::sharedDirector()->runWithScene(pScene);

  3、替换场景

1     CCDirector::sharedDirector()->replaceScene(this);

  替换场景分为三个步骤:

  1)调用CCDirector::sharedDirector()->purgeCachedData() 清空缓存。

  2)新建场景。

  3)调用CCDirector::sharedDirector()->replaceScene(this) 替换新场景。

  注意:不要在节点初始化的init 函数中调用replaceScene 函数。导演类不允许在一个节点初始化的调用场景替换,否则会导致程序崩溃。

  这里说一下压入场景(pushScene)和弹出场景(popScene)。它们都可以用来显示场景和保留当前场景并显示新场景;不同的是它们不把旧场景从内存中释放掉,这样可以提高加载速度,这时需要注意,如果内存不足以支撑的话,建议采用replaceScene 函数。

 

  下面我们来看一下场景的切换,场景的切换中就会有场景切换的动画,正常的无过渡场景,如果尚未建立场景(游戏中的第一个场景),使用runWithScene函数即可以使用相应场景;如果是替换场景,则使用replaceScene 函数替换相应的场景即可;而如果要使用场景间的切换效果,则需要使用相应的切换类。当然,不同效果的使用方法略有不同。然后,通过replaceScene 函数启动场景,也就是说给这个场景加了一个外包装类,然后再启动。那么,这个场景就不是直接显示了,而是在场景的效果动画播完以后进入场景,起到过渡的效果。一般情况下,CCTransitionScene 子类的create 函数有两个参数。第一个参数是特效的切换时间,直接生成一个CCTime 类即可,例子中设定的时间是1 ~ 2s,对于很多场景的显示都很舒服,你也可以根据你的要求修改切换时间;第二个参数是要进入的场景。有的类会有第三个参数。如果需要第三个参数下面介绍动画类时会在后面用()标注。

  下面就详细介绍一下场景切换动画类:

  CCTransitionJumpZoom:跳跃式,原场景先缩小,然后新场景跳跃进来。

  CCTransitionFade:淡出淡入,原场景淡出,新场景淡入。(为渐变的颜色,如ccWHITE)

  CCTransitionFlipX:x 轴平移移动。(kOrientationLeftOver:向左平移、kOrientationRightOver:向右平移)

  CCTransitionFlipY:Y 轴平移移动。(kOrientationUpOver:向上平移、kOrientationDownOver:向下平移)

  CCTransitionFlipAngular:水平角度翻转。(kOrientationLeftOver:向左翻、kOrientationRightOver:向右翻)

  CCTransitionZoomFlipX:带缩放效果的x 轴平移。(kOrientationLeftOver:向左平移、kOrientationRightOver:向右平移)

  CCTransitionZoomFlipY:带缩放效果的y 轴平移。(kOrientationUpOver:向上平移、kOrientationDownOver:向下平移)

  CCTransitionZoomFlipAngular:带缩放效果的旋转。(kOrientationLeftOver:向左翻、kOrientationRightOver:向右翻)

  CCTransitionShrinkGrow:交错切换。

  CCTransitionRotoZoom:转角切换。

  CCTransitionMoveInL:新场景从左移入覆盖。

  CCTransitionMoveInR:新场景从右移入覆盖。

  CCTransitionMoveInT:新场景从上移入覆盖。

  CCTransitionMoveInB:新场景从下移入覆盖。

  CCTransitionSlideInL:新场景从左移入推出原场景。

  CCTransitionSlideInR:新场景从右移入推出原场景。

  CCTransitionSlideInT:新场景从上移入推出原场景。

  CCTransitionSlideInB:新场景从下移入推出原场景。

  CCTransitionFadeTR:向右上波浪。

  CCTransitionFadeBL:向左下波浪。

  CCTransitionFadeUp:向上百叶窗。

  CCTransitionFadeDown:向下百叶窗。

  CCTransitionTurnOffTiles:随机小方块切换。

  CCTransitionSplitRows:按行切换。

  CCTransitionSplitCols:按列切换。

  CCTransitionPageTurn:翻页。(false:前翻true:后翻)

  其中,CCTransitionPageTurn 类需要先设置摄像机,使用以下代码:

1 CCDirector::sharedDirector()->setDepthTest(true);

  CCTransitionCrossFade(淡出淡入交叉,同时进行)、CCTransitionRadialCCW(顺时针切入)、CCTransitionRadialCW(逆时针切入)这三种特效需要检测OpenGL版本支持,使用如下方式进行检测,如果为真则不支持。

1 CCConfiguration::sharedConfiguration()->getGlesVersion() <= GLES_VER_1_0

 

posted @ 2013-08-21 14:03  【Winco】  阅读(748)  评论(0编辑  收藏  举报