cocos2D(七)---- CCScene
CCScene普通情况是游戏里面的根节点。称之为"场景",执行游戏时须要通过CCDirector启动第一个场景。
当然,游戏略微复杂一点的话。可能会包括非常多个场景,这就涉及到场景的切换,也是通过CCDirector来完毕。
CCScene是个抽象的概念。也没有可视化显示的功能。对照CCNode。CCScene基本上没有额外的代码:
- // CCScene.h
- #import "CCNode.h"
- @interface CCScene : CCNode
- {
- }
- @end
- // CCScene,m
- #import "CCScene.h"
- #import "Support/CGPointExtension.h"
- #import "CCDirector.h"
- @implementation CCScene
- -(id) init
- {
- if( (self=[super init]) ) {
- CGSize s = [[CCDirector sharedDirector] winSize];
- // 设置position不受anchorPoint影响
- self.isRelativeAnchorPoint = NO;
- // 设置anchorPoint
- anchorPoint_ = ccp(0.5f, 0.5f);
- // 设置CCScene的大小为屏幕大小
- [self setContentSize:s];
- }
- return self;
- }
- @end
能够发现,对照CCNode。CCScene仅仅是重写了init方法而已,并且也仅仅是做了一个简单的设置
经常使用操作
1.执行第一个场景
我们通常是在应用程序代理AppDelegate的applicationDidFinishLaunching:方法结尾处执行游戏的第一个场景
- [[CCDirector sharedDirector] runWithScene: [HelloWorldLayer scene]];
这里的[HelloWorldLayer scene]返回的是一个CCScene对象
2.替换场景
- [[CCDirector sharedDirector] replaceScene:scene];
这种方法会用新的场景替换旧的场景,cocos2d会释放旧场景的内存,删除旧场景中全部的节点。停止全部动作和消息调度。因此我们不用手动释放旧场景的内存
3.推入和弹出场景
我们知道能够用replaceScene:来执行一个新场景,可是会释放掉旧场景的内存。有时候我们希望在不释放旧场景内存的前提下执行一个新场景,这时候就要用到CCDirector的pushScene:和popScene两个方法了。
1> 使用pushScene:方法推入一个新场景。新场景会层叠在旧场景的上面,但并没有释放旧场景的内存,旧场景继续保留在内存中
- [[CCDirector sharedDirector] pushScene:scene];
2> 使用popScene方法弹出最上层的场景并释放其内存。使保留在内存中的旧场景又一次显示出来
- [[CCDirector sharedDirector] popScene];
CCTransitionScene
上面介绍了场景的切换。只是都是瞬间完毕的,有时候我们想在场景切换的时候有些过渡效果,即以动画的形式切换场景,我们称之为"场景过渡"。要想做场景过渡效果,就必须用CCTransitionScene的子类,CCTransitionScene本身继承了CCScene,它包括了许多的子类。每一个子类都有不同的场景过渡效果,比方CCTransitionFade是淡入淡出效果。CCTransitionPageTurn是翻页效果。
以下演示一个翻页效果:
- CCTransitionPageTurn *page = [CCTransitionPageTurn transitionWithDuration:0.5 scene:scene];
- [[CCDirector sharedDirector] replaceScene:page];
意思是在0.5秒的时间内使用翻页效果从旧场景过渡到scene这个新场景。由于CCTransitionScene是CCScene的子类。所以能够作为replaceScene:的參数。
cocos2d中有许多的过渡效果能够使用,都是CCTransitionScene的子类,类名一般都是以CCTransition开头的。我就不在这里一一介绍每一个子类有什么效果,也没有必要。用到时自己再去查API吧。
注意:CCTransitionScene仅仅能使用在replaceScene:和pushScene:的时候,在popScene弹出场景时是不能用这个过渡效果的
节点的生命周期
说到场景过渡。那就不得不说一下节点的生命周期,即一个节点从開始被添加到屏幕上 到 从屏幕中移除的过程,CCNode提供了对应的生命周期方法:
- // 节点被加入到屏幕上 或者 又一次显示到屏幕上 时调用
- -(void) onEnter;
- // 调用完onEnter后就会调用此方法。假设使用了场景过渡效果,将在场景过渡完成后才调用此方法
- -(void) onEnterTransitionDidFinish;
- // 节点从屏幕中移除 或者 临时离开屏幕 时调用
- -(void) onExit;
以下演示在场景切换时,节点生命周期方法的调用顺序
假设有2个图层RedLayer和BlueLayer,它们分别在不同的场景中。
点击RedLayer,就推入BlueLayer所在的场景。点击BlueLayer就弹出BlueLayer所在的场景。我们就在场景切换的过程中观察这2个图层的生命周期。
为了区分这2个图层,我让它们继承了CCLayerColor,分别设置不用的背景颜色。RedLayer为红色,BlueLayer为蓝色。
由于RedLayer和BlueLayer都继承CCLayerColor,并且都须要负责创建自己的图层、负责观察生命周期方法的调用,那么我就先抽出一个继承了CCLayerColor的公共父类BaseLayer,在它里面完毕一些公共操作。然后让RedLayer和BlueLayer都继承它
BaseLayer的代码
- // BaseLayer.h
- #import "cocos2d.h"
- @interface BaseLayer : CCLayerColor
- // 用来创建图层所在的场景
- + (CCScene *)scene;
- // 图层的背景颜色。交给子类去实现
- + (ccColor4B)bgColor;
- @end
- // BaseLayer.m
- #import "BaseLayer.h"
- @implementation BaseLayer
- #pragma mark - 初始化场景
- + (CCScene *)scene {
- // 获取当前类的背景颜色
- ccColor4B color = [self bgColor];
- // 依据当前类名创建图层
- BaseLayer *layer = [[self class] layerWithColor:color];
- // 接收触摸输入
- layer.isTouchEnabled = YES;
- CCScene *scene = [CCScene node];
- [scene addChild:layer];
- return scene;
- }
- #pragma mark - 打印生命周期方法
- - (void)onEnter { // _cmd 代表着当前的selector
- [super onEnter];
- // 第一个%@是打印类名,第二个%@是打印方法名
- NSLog(@"%@ --> %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
- }
- - (void)onEnterTransitionDidFinish {
- [super onEnterTransitionDidFinish];
- NSLog(@"%@ --> %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
- }
- - (void)onExit {
- [super onExit];
- NSLog(@"%@ --> %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
- }
- @end
RedLayer的代码
- // RedLayer.h
- #import "BaseLayer.h"
- @interface RedLayer : BaseLayer
- @end
- // RedLayer.m
- #import "RedLayer.h"
- #import "BlueLayer.h"
- @implementation RedLayer
- #pragma mark - 点击红色图层时,跳到蓝色图层所在的场景
- - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
- // 初始化蓝色图层所在的场景
- CCScene *scene = [BlueLayer scene];
- // 推入场景(临时没有使用过渡效果)
- [[CCDirector sharedDirector] pushScene:scene];
- }
- #pragma mark - 背景颜色为红色
- + (ccColor4B)bgColor {
- return ccc4(255, 0, 0, 255);
- }
- @end
BlueLayer的代码
- // BlueLayer.h
- #import "BaseLayer.h"
- @interface BlueLayer : BaseLayer
- @end
- // BlueLayer.m
- #import "BlueLayer.h"
- @implementation BlueLayer
- #pragma mark - 当点击蓝色图层时,弹出场景
- - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
- [[CCDirector sharedDirector] popScene];
- }
- #pragma mark - 背景颜色为蓝色
- + (ccColor4B)bgColor {
- return ccc4(0, 0, 255, 255);
- }
- @end
1.在应用程序载入完成后。即在AppDelegate的applicationDidFinishLaunching:方法中启动第一个场景 ---- 红色图层所在的场景
- [[CCDirector sharedDirector] runWithScene: [RedLayer scene]];
执行完成后,效果例如以下:

生命周期方法打印例如以下:
- 2013-02-22 15:47:56.473 HelloWorld[2679:c07] RedLayer --> onEnter
- 2013-02-22 15:47:56.474 HelloWorld[2679:c07] RedLayer --> onEnterTransitionDidFinish
2.点击红色图层,跳到蓝色图层所在的场景
这里依据有没有使用过渡效果。要分2种情况
1> 假设没有使用过渡效果
屏幕直接变为蓝色

生命周期方法打印例如以下:
- 2013-02-22 15:50:16.381 HelloWorld[2679:c07] RedLayer --> onExit
- 2013-02-22 15:50:16.382 HelloWorld[2679:c07] BlueLayer --> onEnter
- 2013-02-22 15:50:16.384 HelloWorld[2679:c07] BlueLayer --> onEnterTransitionDidFinish
能够看出。是先移除红色,再加入蓝色
2> 假设使用了过渡效果
先改变下RedLayer中的代码:
- #pragma mark - 点击红色图层时。跳到蓝色图层所在的场景
- - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
- // 初始化蓝色图层所在的场景
- CCScene *scene = [BlueLayer scene];
- // 旧场景一边旋转一边缩小,新场景一边旋转一边方法
- CCTransitionRotoZoom *page = [CCTransitionRotoZoom transitionWithDuration:2 scene:scene];
- // 推入场景(临时没有使用过渡效果)
- [[CCDirector sharedDirector] pushScene:page];
- }
接下来看一下屏幕效果和信息打印
过渡效果刚開始就会打印:
- 2013-02-22 15:59:38.420 HelloWorld[2862:c07] BlueLayer --> onEnter
说明是先初始化并添加BlueLayer
然后中间经历了长达2s的过渡效果:
红色是在一边旋转一边缩小

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

蓝色放大到屏幕大小后

最后会出现下面信息打印:
- 2013-02-22 16:04:28.852 HelloWorld[2910:c07] RedLayer --> onExit
- 2013-02-22 16:04:28.853 HelloWorld[2910:c07] BlueLayer --> onEnterTransitionDidFinish
移除红色,蓝色过渡完成
3> 点击蓝色图层。弹出蓝色图层所在的场景,又一次显示红色图层所在的场景

信息打印例如以下:
- 2013-02-22 16:06:47.013 HelloWorld[2910:c07] BlueLayer --> onExit
- 2013-02-22 16:06:47.014 HelloWorld[2910:c07] RedLayer --> onEnter
- 2013-02-22 16:06:47.015 HelloWorld[2910:c07] RedLayer --> onEnterTransitionDidFinish
移除蓝色,又一次显示红色
原文地址:http://blog.csdn.net/q199109106q/article/details/8602106
感谢作者~!
cocos2D(七)---- CCScene的更多相关文章
- Cocos2d-android (01) 创建一个简单的cocos2d应用程序
下载Cocos2d-android的源代码:cocos2d-android-1 git@github.com:ZhouWeikuan/cocos2d.git 将项目导入到eclipse中.运行实例: ...
- 基于cocos2d开发的android小游戏——採花仙
/*cocos 2d 已经成为了如今移动端游戏开发的强有力的工具,眼下主流游戏中多採用cocos 2d游戏引擎. 我也尝试了一下该引擎.我是用的是cocos2d-android,以后要移植到Cocos ...
- CCScrollView
#ifndef TestCCScrollView_testScene_h #define TestCCScrollView_testScene_h #include "cocos2d.h&q ...
- cocos2d_android 第一个游戏
依据上一篇文章.创建好cocos2d--android的开发环境 先上效果图 实现该效果的代码: package com.cn.firstgame; import org.cocos2d.layers ...
- 第四十天 阿乐在其中—Android小游戏的飞机(四)加入敌人
8月9日,晴. "江城如画里,山晓望晴空. 雨水夹明镜.双桥落彩虹. 人烟寒橘柚,秋色老梧桐." 上篇已经让飞机载入子弹和音效及背景音乐,本篇主要加入敌机. 本篇要用到的几个函数解 ...
- 七、CCScene
CCScene一般情况是游戏里面的根节点,称之为"场景",运行游戏时需要通过CCDirector启动第一个场景.当然,游戏稍微复杂一点的话,可能会包含很多个场景,这就涉及到场景的切 ...
- Touch Handling in Cocos2D 3.x(七)
在touchMoved方法中寻找触摸在父节点(CCScene)中的位置并且移动CCDragSprite到其父节点的相应位置中去. 在我们在动作中观赏拖放机制之前,我们需要使用这个新实现的类.打开Mai ...
- 【Cocos2d入门教程七】三分钟看懂Cocos2d坐标系
无论是搞2d还是3d开发,最需要搞清楚的就是坐标系,这部分混乱的话就没啥搞头了.所以玩cocos2d,一上来就需要先把各种与坐标有关的东西搞清楚. 1.OpenGL坐标系 Cocos2d-x使用的是O ...
- Cocos2D iOS之旅:如何写一个敲地鼠游戏(七):弹出地鼠
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
随机推荐
- 2017-12-01HTML块及引用
HTML块1.HTML块元素 快元素在显示时,通常会以新行开始 例如:<h1>.<p>.<ul>2.HTML内联元素 内联元素通常不会以新行开始 例如:<b& ...
- mongodb GUI工具
人性化,界面工具 网上搜索找的一些 1. 官方网站 tools 2. adminMongo 这个也是我在使用的 3. MongoClient 4. NoSQL Manager for MongoDB ...
- POJ_3565_Ants
题意:给出N个白点和N个黑点,要求用N条不相交的线段把它们连接起来,其中每条线段恰好连接一个白点和一个黑点,每个点恰好连接到一条线段. 分析:因为有结点黑白两色,我们不难想到构造一个二分图,其中每个白 ...
- Crash reporter
A crash reporter is a software application whose function is to identify report crash details and to ...
- 基于 CentOS 搭建Seafile个人网盘
一.安装 Seafile 安装依赖环境使用 yum 安装 Python 及 MySQL: yum install python python-setuptools python-imaging pyt ...
- 【Linux】Tomcat安装及端口配置
安装环境 :Linux(CentOS 64位) 安装软件 : apache-tomcat-9.0.20.tar.gz(下载地址http://tomcat.apache.org/) 一:JDK安装配置 ...
- C++调用Com
需求:1.创建myCom.dll,该COM只有一个组件,两个接口: IGetRes--方法Hello(), IGetResEx--方法HelloEx() 2.在工程中导入组件或类型库 #im ...
- 表格 —— 一个单元格插入多个tags
<st #st [columns]="columns" [data]="data" [bordered]='true'> <ng-templa ...
- 并发和多线程(七)--volatile
volatile: 相当于轻量级的synchronized,只能用来修饰变量,线程安全的三个特性通过volatile能实现其中的两个 原子性: 在之前的文章有说到,通过Atomic相关类.synchr ...
- BZOJ3124: [Sdoi2013]直径 (树形DP)
题意:给一颗树 第一问求直径 第二问求有多少条边是所有直径都含有的 题解:求直径就不说了 解第二问需要自己摸索出一些性质 任意记录一条直径后 跑这条直径的每一个点 如果以这个点不经过直径能到达最远的 ...