cocos2D(七)---- CCScene

前端之家收集整理的这篇文章主要介绍了cocos2D(七)---- CCScene前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

CCScene一般情况是游戏里面的根节点,称之为"场景",运行游戏时需要通过CCDirector启动第一个场景。当然,游戏稍微复杂一点的话,可能会包含很多个场景,这就涉及到场景的切换,也是通过CCDirector来完成。CCScene是个抽象的概念,也没有可视化显示功能,对比CCNode,CCScene基本上没有额外的代码

[java] view plain @L_404_1@
  1. //CCScene.h
  2. #import"CCNode.h"
  3. @interfaceCCScene:CCNode
  4. {
  5. }
  6. @end

 
 

copy
    //CCScene,m
  1. import"CCScene.h"
  2. #import"Support/CGPointExtension.h"
  3. import"CCDirector.h"
  4. @implementationCCScene
  5. -(id)init
  6. {
  7. if((self=[superinit])){
  8. CGSizes=[[CCDirectorsharedDirector]winSize];
  9. //设置position不受anchorPoint影响
  10. self.isRelativeAnchorPoint=NO;
  11. //设置anchorPoint
  12. anchorPoint_=ccp(0.5f,0.5f);
  13. //设置CCScene的大小为屏幕大小
  14. [selfsetContentSize:s];
  15. }
  16. returnself;
  17. @end

可以发现,对比CCNode,CCScene只是重写了init方法而已,而且也只是做了一个简单的设置


常用操作

1.运行第一个场景

我们一般是在应用程序代理AppDelegate的applicationDidFinishLaunching:方法结尾处运行游戏的第一个场景

copy
    [[CCDirectorsharedDirector]runWithScene:[HelloWorldLayerscene]];
这里的[HelloWorldLayer scene]返回的是一个CCScene对象


2.替换场景

copy
    [[CCDirectorsharedDirector]replaceScene:scene];
这个方法会用新的场景替换 旧的场景,cocos2d会 释放旧场景的内存,删除旧场景中所有的节点,停止所有动作和消息调度,因此我们不用手动释放旧场景的内存


3.推入和弹出场景

我们知道可以用replaceScene:来运行一个新场景,但是会释放掉旧场景的内存。有时候我们希望在不释放旧场景内存的前提下运行一个新场景,这时候就要用到CCDirector的pushScene:和popScene两个方法了。

1> 使用pushScene:方法推入一个新场景,新场景会层叠在旧场景的上面,但并没有释放旧场景的内存,旧场景继续保留在内存中

copy
    [[CCDirectorsharedDirector]pushScene:scene];

2> 使用popScene方法弹出最上层的场景并释放其 内存,使保留在内存中的旧场景重新显示出来

copy
    [[CCDirectorsharedDirector]popScene];


CCTransitionScene

上面介绍了场景的切换,不过都是瞬间完成的,有时候我们想在场景切换的时候有些过渡效果,即以动画的形式切换场景,我们称之为"场景过渡"。要想做场景过渡效果,就必须用CCTransitionScene的子类,CCTransitionScene本身继承了CCScene,它包含了非常多的子类,每个子类都有不同的场景过渡效果,比如CCTransitionFade是淡入淡出效果,CCTransitionPageTurn是翻页效果

下面演示一个翻页效果

copy
    CCTransitionPageTurn*page=[CCTransitionPageTurntransitionWithDuration:0.5scene:scene];
  1. [[CCDirectorsharedDirector]replaceScene:page];
意思是在0.5秒的时间内使用翻页效果从旧场景过渡到scene这个新场景,因为CCTransitionScene是CCScene的子类,所以可以作为replaceScene:的 参数。

cocos2d中有非常多的过渡效果可以使用,都是CCTransitionScene的子类,类名一般都是以CCTransition开头的。我就不在这里一一介绍每个子类有什么效果,也没有必要,用到时自己再去查API吧。

意:CCTransitionScene只能使用在replaceScene:和pushScene:的时候,在popScene弹出场景时是不能用这个过效果


节点的生命周期

说到场景过渡,那就不得不说一下节点的生命周期,即一个节点从开始被添加到屏幕上 到 从屏幕中移除的过程,CCNode提供了相应的生命周期方法

copy
    //节点被添加到屏幕上或者重新显示到屏幕上时调用
  1. -(void)onEnter;
  2. //调用完onEnter后就会调用方法,如果使用了场景过渡效果,将在场景过渡完毕后才调用方法
  3. -(void)onEnterTransitionDidFinish;
  4. //节点从屏幕中移除或者暂时离开屏幕时调用
  5. void)onExit;


下面演示在场景切换时,节点生命周期方法调用顺序

设有2个图层RedLayer和BlueLayer,它们分别在不同的场景中。点击RedLayer,就推入BlueLayer所在的场景,点击BlueLayer就弹出BlueLayer所在的场景。我们就在场景切换的过程中观察这2个图层的生命周期。

为了区分这2个图层,我让它们继承了CCLayerColor,分别设置不用的背景颜色,RedLayer为红色,BlueLayer为蓝色。

因为RedLayer和BlueLayer都继承CCLayerColor,而且都需要负责创建自己的图层、负责观察生命周期方法调用,那么我就先抽出一个继承了CCLayerColor的公共父类BaseLayer,在它里面完成一些公共操作,然后让RedLayer和BlueLayer都继承它


BaseLayer的代码

copy
    //BaseLayer.h
  1. import"cocos2d.h"
  2. @interfaceBaseLayer:CCLayerColor
  3. //用来创建图层所在的场景
  4. +(CCScene*)scene;
  5. //图层的背景颜色,交给子类去实现
  6. +(ccColor4B)bgColor;
  7. @end
copy
    //BaseLayer.m
  1. import"BaseLayer.h"
  2. @implementationBaseLayer
  3. #pragmamark-初始化场景
  4. +(CCScene*)scene{
  5. //获取当前类的背景颜色
  6. ccColor4Bcolor=[selfbgColor];
  7. //根据当前类名创建图层
  8. BaseLayer*layer=[[selfclass]layerWithColor:color];
  9. //接收触摸输入
  10. layer.isTouchEnabled=YES;
  11. CCScene*scene=[CCScenenode];
  12. [sceneaddChild:layer];
  13. returnscene;
  14. #pragmamark-打印生命周期方法
  15. void)onEnter{//_cmd代表着当前的selector
  16. [superonEnter];
  17. //第一个%@是打印类名,第二个%@是打印方法
  18. NSLog(@"%@-->%@",NSStringFromClass([selfclass]),NSStringFromSelector(_cmd));
  19. void)onEnterTransitionDidFinish{
  20. superonEnterTransitionDidFinish];
  21. NSLog(@"%@-->%@",NSStringFromSelector(_cmd));
  22. void)onExit{
  23. [superonExit];
  24. @end

RedLayer的 代码

copy
    //RedLayer.h
  1. @interfaceRedLayer:BaseLayer
  2. copy
      //RedLayer.m
    1. import"RedLayer.h"
    2. import"BlueLayer.h"
    3. @implementationRedLayer
    4. #pragmamark-点击红色图层时,跳到蓝色图层所在的场景
    5. void)ccTouchesEnded:(NSSet*)toucheswithEvent:(UIEvent*)event{
    6. //初始化蓝色图层所在的场景
    7. CCScene*scene=[BlueLayerscene];
    8. //推入场景(暂时没有使用过渡效果
    9. [[CCDirectorsharedDirector]pushScene:scene];
    10. #pragmamark-背景颜色为红色
    11. +(ccColor4B)bgColor{
    12. returnccc4(255,0); background-color:inherit">0,0); background-color:inherit">255);
    13. @end

    BlueLayer的代

    copy
      //BlueLayer.h
    1. @interfaceBlueLayer:BaseLayer
    2. copy
        //BlueLayer.m
      1. import"BlueLayer.h"
      2. @implementationBlueLayer
      3. #pragmamark-当点击蓝色图层时,弹出场景
      4. [[CCDirectorsharedDirector]popScene];
      5. #pragmamark-背景颜色为蓝色
      6. +(ccColor4B)bgColor{
      7. 255);
      8. @end


      1.在应用程序加载完毕后,即在AppDelegate的applicationDidFinishLaunching:方法中启动第一个场景 ---- 红色图层所在的场景

      copy
        [[CCDirectorsharedDirector]runWithScene:[RedLayerscene]];

      运行完毕后,效果如下:

      生命周期方法打印如下:

      copy
        2013-02-2215:47:56.473HelloWorld[2679:c07]RedLayer-->onEnter
      1. 56.474HelloWorld[2679:c07]RedLayer-->onEnterTransitionDidFinish

      2.点击红色图层,跳到蓝色图层所在的场景

      这里根据有没有使用过渡效果,要分2种情况

      1> 如果没有使用过渡效果

      屏幕直接变为蓝色

      生命周期方法打印如下:

      copy
        50:16.381HelloWorld[2679:c07]RedLayer-->onExit
      1. 16.382HelloWorld[2679:c07]BlueLayer-->onEnter
      2. 16.384HelloWorld[2679:c07]BlueLayer-->onEnterTransitionDidFinish
      可以看出,是先移 除红色,再添加蓝色


      2> 如果使用了过渡效果

      先改变下RedLayer中的代码

      copy
        #pragmamark-点击红色图层时,跳到蓝色图层所在的场景
      1. //旧场景一边旋转一边缩小,新场景一边旋转一边方法
      2. CCTransitionRotoZoom*page=[CCTransitionRotoZoomtransitionWithDuration:2scene:scene];
      3. [[CCDirectorsharedDirector]pushScene:page];
      4. }
      接下来看一下屏幕效果和打印信息

      过渡效果刚开始就会打印:

      copy
        59:38.420HelloWorld[2862:c07]BlueLayer-->onEnter
      说明是先初始化并添 加BlueLayer

      然后中间经历了长达2s的过渡效果

      红色是在一边旋转一边缩小

      红色完全消失后,蓝色在一边旋转一边放大

      蓝色放大到屏幕大小后

      最后会出现以下打印信息:

      copy
        16:04:28.852HelloWorld[2910:c07]RedLayer-->onExit
      1. 28.853HelloWorld[2910:c07]BlueLayer-->onEnterTransitionDidFinish
      移除红色,蓝色过渡完毕


      3> 点击蓝色图层,弹出蓝色图层所在的场景,重新显示红色图层所在的场景

      打印信息如下:

      copy
        06:47.013HelloWorld[2910:c07]BlueLayer-->onExit
      1. 47.014HelloWorld[2910:c07]RedLayer-->onEnter
      2. 47.015HelloWorld[2910:c07]RedLayer-->onEnterTransitionDidFinish

      移除蓝色,重新显示红色



      原文地址:http://blog.csdn.net/q199109106q/article/details/8602106

      感谢作者~!

      猜你在找的Cocos2d-x相关文章