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

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

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

[java] view
plain
copy

  1. // CCScene.h
  2. #import "CCNode.h"
  3. @interface CCScene : CCNode
  4. {
  5. }
  6. @end


[java] view
plain
copy

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

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

经常使用操作

1.执行第一个场景

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

[java] view
plain
copy

  1. [[CCDirector sharedDirector] runWithScene: [HelloWorldLayer scene]];

这里的[HelloWorldLayer scene]返回的是一个CCScene对象

2.替换场景

[java] view
plain
copy

  1. [[CCDirector sharedDirector] replaceScene:scene];

这种方法会用新的场景替换旧的场景,cocos2d会释放旧场景的内存,删除旧场景中全部的节点。停止全部动作和消息调度。因此我们不用手动释放旧场景的内存

3.推入和弹出场景

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

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

[java] view
plain
copy

  1. [[CCDirector sharedDirector] pushScene:scene];

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

[java] view
plain
copy

  1. [[CCDirector sharedDirector] popScene];

CCTransitionScene

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

以下演示一个翻页效果:

[java] view
plain
copy

  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
plain
copy

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

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

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

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

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

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

BaseLayer的代码

[java] view
plain
copy

  1. // BaseLayer.h
  2. #import "cocos2d.h"
  3. @interface BaseLayer : CCLayerColor
  4. // 用来创建图层所在的场景
  5. + (CCScene *)scene;
  6. // 图层的背景颜色。交给子类去实现
  7. + (ccColor4B)bgColor;
  8. @end
[java] view
plain
copy

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

RedLayer的代码

[java] view
plain
copy

  1. // RedLayer.h
  2. #import "BaseLayer.h"
  3. @interface RedLayer : BaseLayer
  4. @end
[java] view
plain
copy

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

BlueLayer的代码

[java] view
plain
copy

  1. // BlueLayer.h
  2. #import "BaseLayer.h"
  3. @interface BlueLayer : BaseLayer
  4. @end
[java] view
plain
copy

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

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

[java] view
plain
copy

  1. [[CCDirector sharedDirector] runWithScene: [RedLayer scene]];

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

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

[java] view
plain
copy

  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
plain
copy

  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
plain
copy

  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
plain
copy

  1. 2013-02-22 15:59:38.420 HelloWorld[2862:c07] BlueLayer --> onEnter

说明是先初始化并添加BlueLayer

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

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

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

蓝色放大到屏幕大小后

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

[java] view
plain
copy

  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
plain
copy

  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

感谢作者~!

cocos2D(七)---- CCScene的更多相关文章

  1. Cocos2d-android (01) 创建一个简单的cocos2d应用程序

    下载Cocos2d-android的源代码:cocos2d-android-1 git@github.com:ZhouWeikuan/cocos2d.git 将项目导入到eclipse中.运行实例: ...

  2. 基于cocos2d开发的android小游戏——採花仙

    /*cocos 2d 已经成为了如今移动端游戏开发的强有力的工具,眼下主流游戏中多採用cocos 2d游戏引擎. 我也尝试了一下该引擎.我是用的是cocos2d-android,以后要移植到Cocos ...

  3. CCScrollView

    #ifndef TestCCScrollView_testScene_h #define TestCCScrollView_testScene_h #include "cocos2d.h&q ...

  4. cocos2d_android 第一个游戏

    依据上一篇文章.创建好cocos2d--android的开发环境 先上效果图 实现该效果的代码: package com.cn.firstgame; import org.cocos2d.layers ...

  5. 第四十天 阿乐在其中—Android小游戏的飞机(四)加入敌人

    8月9日,晴. "江城如画里,山晓望晴空. 雨水夹明镜.双桥落彩虹. 人烟寒橘柚,秋色老梧桐." 上篇已经让飞机载入子弹和音效及背景音乐,本篇主要加入敌机. 本篇要用到的几个函数解 ...

  6. 七、CCScene

    CCScene一般情况是游戏里面的根节点,称之为"场景",运行游戏时需要通过CCDirector启动第一个场景.当然,游戏稍微复杂一点的话,可能会包含很多个场景,这就涉及到场景的切 ...

  7. Touch Handling in Cocos2D 3.x(七)

    在touchMoved方法中寻找触摸在父节点(CCScene)中的位置并且移动CCDragSprite到其父节点的相应位置中去. 在我们在动作中观赏拖放机制之前,我们需要使用这个新实现的类.打开Mai ...

  8. 【Cocos2d入门教程七】三分钟看懂Cocos2d坐标系

    无论是搞2d还是3d开发,最需要搞清楚的就是坐标系,这部分混乱的话就没啥搞头了.所以玩cocos2d,一上来就需要先把各种与坐标有关的东西搞清楚. 1.OpenGL坐标系 Cocos2d-x使用的是O ...

  9. Cocos2D iOS之旅:如何写一个敲地鼠游戏(七):弹出地鼠

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

随机推荐

  1. PHP开发心得四

    1,php返回给html页面的Json数据不能含有回车符 某次用php编写查询数据库数据,以json格式返回给前端页面js文件,js文件以angularJS的函数调用处理的方式进行数据显示,但数据返回 ...

  2. UEditer的使用

    1.首先到官网下载http://ueditor.baidu.com/website/download.html#ueditor 2.然后把解压后的文件复制到项目中(放在UEditer中),如图 3.在 ...

  3. ES 提案的各状态

    JavaScrpit,亦即 ECMAScript,新功能的演进是由一个叫 TC39 这么个组织在统筹协调和推进的. 一般新特性会由社区先提案,被采纳后开始进入下一流程.一个提案到最终落地到成为标准,需 ...

  4. 实现加载页Loading Page 的几种方法

    网页也可以像原生应用那样加入进度条或者其他的loading效果带来更好的等待体验,这里归纳几种我收集的实现loading page的方法,这几种方法在交互上都有利有弊,适用于不同应用.(PS:以下方法 ...

  5. C++ 11常见功能介绍:auto,decltype,nullptr,for,lambda

    什么是C++11 C++11是曾经被叫做C++0x,是对目前C++语言的扩展和修正,C++11不仅包含核心语言的新机能,而且扩展了C++的标准程序库(STL),并入了大部分的C++ Technical ...

  6. Docker 安装并定制 Nginx 服务器

    安装并定制 Nginx 1.查阅对应的官方文档,首先下载镜像文件: [spider@izwz9d74k4cznxtxjeeur9z local]$ sudo docker pull nginx [su ...

  7. Android中ProgressDialog自动消失

    主要函数部分代码: final ProgressDialog proDialog = android.app.ProgressDialog .show(MainActivity.this, " ...

  8. Vue.js 计算属性(computed)

    Vue.js 计算属性(computed) 如果在模板中使用一些复杂的表达式,会让模板显得过于繁重,且后期难以维护.对此,vue.js 提供了计算属性(computed),你可以把这些复杂的表达式写到 ...

  9. APUE 文件IO

    文件 IO 记录书中的重要知识和思考实践部分 Unix 每个文件都对应一个文件描述符(file descriptor),为一个非负整数,一个文件可以有多个fd, 后面所有与文件(设备,套接字等)有关操 ...

  10. jsonview插件的常见使用方法整理

    Jsonview是目前最热门的一款开发者工具插件,确切的来说jQuery JSONView是一款非常实用的格式化和语法高亮JSON格式数据查看器jQuery插件.它是查看json数据的神器. 下载地址 ...