• cocos2D(七)---- CCScene


    CCScene普通情况是游戏里面的根节点。称之为"场景",执行游戏时须要通过CCDirector启动第一个场景。

    当然,游戏略微复杂一点的话。可能会包括非常多个场景,这就涉及到场景的切换,也是通过CCDirector来完毕。

    CCScene是个抽象的概念。也没有可视化显示的功能。对照CCNode。CCScene基本上没有额外的代码:

    [java] view plaincopy
    1. // CCScene.h  
    2. #import "CCNode.h"  
    3.   
    4. @interface CCScene : CCNode  
    5. {  
    6. }  
    7. @end  

    
    
    
    

    [java] view plaincopy
    1. // CCScene,m  
    2. #import "CCScene.h"  
    3. #import "Support/CGPointExtension.h"  
    4. #import "CCDirector.h"  
    5.   
    6. @implementation CCScene  
    7. -(id) init  
    8. {  
    9.     if( (self=[super init]) ) {  
    10.         CGSize s = [[CCDirector sharedDirector] winSize];  
    11.         // 设置position不受anchorPoint影响  
    12.         self.isRelativeAnchorPoint = NO;      
    13.         // 设置anchorPoint  
    14.         anchorPoint_ = ccp(0.5f, 0.5f);  
    15.         // 设置CCScene的大小为屏幕大小  
    16.         [self setContentSize:s];      
    17.     }  
    18.       
    19.     return self;  
    20. }  
    21. @end  

    能够发现,对照CCNode。CCScene仅仅是重写了init方法而已,并且也仅仅是做了一个简单的设置


    经常使用操作

    1.执行第一个场景

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

    [java] view plaincopy
    1. [[CCDirector sharedDirector] runWithScene: [HelloWorldLayer scene]];  
    这里的[HelloWorldLayer scene]返回的是一个CCScene对象


    2.替换场景

    [java] view plaincopy
    1. [[CCDirector sharedDirector] replaceScene:scene];  
    这种方法会用新的场景替换旧的场景,cocos2d会释放旧场景的内存,删除旧场景中全部的节点。停止全部动作和消息调度。因此我们不用手动释放旧场景的内存


    3.推入和弹出场景

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

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

    [java] view plaincopy
    1. [[CCDirector sharedDirector] pushScene:scene];  

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

    [java] view plaincopy
    1. [[CCDirector sharedDirector] popScene];  


    CCTransitionScene

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

    以下演示一个翻页效果:

    [java] view plaincopy
    1. CCTransitionPageTurn *page = [CCTransitionPageTurn transitionWithDuration:0.5 scene:scene];  
    2. [[CCDirector sharedDirector] replaceScene:page];  
    意思是在0.5秒的时间内使用翻页效果从旧场景过渡到scene这个新场景。由于CCTransitionScene是CCScene的子类。所以能够作为replaceScene:的參数。

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

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


    节点的生命周期

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

    [java] view plaincopy
    1. // 节点被加入到屏幕上  或者 又一次显示到屏幕上 时调用  
    2. -(void) onEnter;  
    3.   
    4. // 调用完onEnter后就会调用此方法。假设使用了场景过渡效果,将在场景过渡完成后才调用此方法  
    5. -(void) onEnterTransitionDidFinish;  
    6.   
    7. // 节点从屏幕中移除 或者 临时离开屏幕 时调用  
    8. -(void) onExit;  


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

    设有2个图层RedLayer和BlueLayer,它们分别在不同的场景中。

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


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

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


    BaseLayer的代码

    [java] view plaincopy
    1. // BaseLayer.h  
    2. #import "cocos2d.h"  
    3.   
    4. @interface BaseLayer : CCLayerColor  
    5. // 用来创建图层所在的场景  
    6. + (CCScene *)scene;  
    7.   
    8. // 图层的背景颜色。交给子类去实现  
    9. + (ccColor4B)bgColor;  
    10. @end  
    [java] view plaincopy
    1. // BaseLayer.m  
    2. #import "BaseLayer.h"  
    3.   
    4. @implementation BaseLayer  
    5.   
    6. #pragma mark - 初始化场景  
    7. + (CCScene *)scene {  
    8.     // 获取当前类的背景颜色  
    9.     ccColor4B color = [self bgColor];  
    10.     // 依据当前类名创建图层  
    11.     BaseLayer *layer = [[self class] layerWithColor:color];  
    12.     // 接收触摸输入  
    13.     layer.isTouchEnabled = YES;   
    14.       
    15.     CCScene *scene = [CCScene node];  
    16.     [scene addChild:layer];  
    17.     return scene;  
    18. }  
    19.   
    20. #pragma mark - 打印生命周期方法  
    21. - (void)onEnter { // _cmd 代表着当前的selector  
    22.     [super onEnter];  
    23.     // 第一个%@是打印类名,第二个%@是打印方法名  
    24.     NSLog(@"%@ --> %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd));  
    25. }  
    26.   
    27. - (void)onEnterTransitionDidFinish {  
    28.     [super onEnterTransitionDidFinish];  
    29.     NSLog(@"%@ --> %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd));  
    30. }  
    31.   
    32. - (void)onExit {  
    33.     [super onExit];  
    34.     NSLog(@"%@ --> %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd));  
    35. }  
    36. @end  

    RedLayer的代码

    [java] view plaincopy
    1. // RedLayer.h  
    2. #import "BaseLayer.h"  
    3.   
    4. @interface RedLayer : BaseLayer  
    5. @end  
    [java] view plaincopy
    1. // RedLayer.m  
    2. #import "RedLayer.h"  
    3. #import "BlueLayer.h"  
    4.   
    5. @implementation RedLayer  
    6.   
    7. #pragma mark - 点击红色图层时,跳到蓝色图层所在的场景  
    8. - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {  
    9.     // 初始化蓝色图层所在的场景  
    10.     CCScene *scene = [BlueLayer scene];  
    11.     // 推入场景(临时没有使用过渡效果)  
    12.     [[CCDirector sharedDirector] pushScene:scene];  
    13. }  
    14.   
    15. #pragma mark - 背景颜色为红色  
    16. + (ccColor4B)bgColor {  
    17.     return ccc4(25500255);  
    18. }  
    19. @end  

    BlueLayer的代

    [java] view plaincopy
    1. // BlueLayer.h  
    2. #import "BaseLayer.h"  
    3.   
    4. @interface BlueLayer : BaseLayer  
    5. @end  
    [java] view plaincopy
    1. // BlueLayer.m  
    2. #import "BlueLayer.h"  
    3.   
    4. @implementation BlueLayer  
    5. #pragma mark - 当点击蓝色图层时,弹出场景  
    6. - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {  
    7.     [[CCDirector sharedDirector] popScene];  
    8. }  
    9.   
    10. #pragma mark - 背景颜色为蓝色  
    11. + (ccColor4B)bgColor {  
    12.     return ccc4(00255255);  
    13. }  
    14. @end  


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

    [java] view plaincopy
    1. [[CCDirector sharedDirector] runWithScene: [RedLayer scene]];  

    执行完成后,效果例如以下:

    生命周期方法打印例如以下:

    [java] view plaincopy
    1. 2013-02-22 15:47:56.473 HelloWorld[2679:c07] RedLayer --> onEnter  
    2. 2013-02-22 15:47:56.474 HelloWorld[2679:c07] RedLayer --> onEnterTransitionDidFinish  

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

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

    1> 假设没有使用过渡效果

    屏幕直接变为蓝色

    生命周期方法打印例如以下:

    [java] view plaincopy
    1. 2013-02-22 15:50:16.381 HelloWorld[2679:c07] RedLayer --> onExit  
    2. 2013-02-22 15:50:16.382 HelloWorld[2679:c07] BlueLayer --> onEnter  
    3. 2013-02-22 15:50:16.384 HelloWorld[2679:c07] BlueLayer --> onEnterTransitionDidFinish  
    能够看出。是先移除红色,再加入蓝色


    2> 假设使用了过渡效果

    先改变下RedLayer中的代码:

    [java] view plaincopy
    1. #pragma mark - 点击红色图层时。跳到蓝色图层所在的场景  
    2. - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {  
    3.     // 初始化蓝色图层所在的场景  
    4.     CCScene *scene = [BlueLayer scene];  
    5.     // 旧场景一边旋转一边缩小,新场景一边旋转一边方法  
    6.     CCTransitionRotoZoom *page = [CCTransitionRotoZoom transitionWithDuration:2 scene:scene];  
    7.     // 推入场景(临时没有使用过渡效果)  
    8.     [[CCDirector sharedDirector] pushScene:page];  
    9. }  
    接下来看一下屏幕效果和信息打印

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

    [java] view plaincopy
    1. 2013-02-22 15:59:38.420 HelloWorld[2862:c07] BlueLayer --> onEnter  
    说明是先初始化并添加BlueLayer

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

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

    红色全然消失后。蓝色在一边旋转一边放大

    蓝色放大到屏幕大小后

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

    [java] view plaincopy
    1. 2013-02-22 16:04:28.852 HelloWorld[2910:c07] RedLayer --> onExit  
    2. 2013-02-22 16:04:28.853 HelloWorld[2910:c07] BlueLayer --> onEnterTransitionDidFinish  
    移除红色,蓝色过渡完成


    3> 点击蓝色图层。弹出蓝色图层所在的场景,又一次显示红色图层所在的场景

    信息打印例如以下:

    [java] view plaincopy
    1. 2013-02-22 16:06:47.013 HelloWorld[2910:c07] BlueLayer --> onExit  
    2. 2013-02-22 16:06:47.014 HelloWorld[2910:c07] RedLayer --> onEnter  
    3. 2013-02-22 16:06:47.015 HelloWorld[2910:c07] RedLayer --> onEnterTransitionDidFinish  

    移除蓝色,又一次显示红色



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

    感谢作者~!

  • 相关阅读:
    hdu 1203 I NEED A OFFER!
    数据表示范围
    1936 哪一瓶是毒药?
    注册会计师带你用Python进行探索性风险分析(一)
    网络编程1 初识网络编程
    优秀技术网站汇总:
    DNS(域名系统)
    如何查看电脑网页的源码以及编码方式的位置?
    推荐一款播放器
    我的北大之路(贺舒婷)
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6861505.html
Copyright © 2020-2023  润新知