cocos2D(七)---- CCScene

CoCos2d_android入门所需知道的一切 用Cocos2d_android开发植物大战僵尸,所需要知道的知识。 阅读详情

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

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

 
 

[java]  view plain copy
  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 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.   
  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 plain copy
  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 plain copy
  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 plain copy
  1. // RedLayer.h  
  2. #import "BaseLayer.h"  
  3.   
  4. @interface RedLayer : BaseLayer  
  5. @end  
[java]  view plain copy
  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(255, 0, 0, 255);  
  18. }  
  19. @end  

BlueLayer的代 码

[java]  view plain copy
  1. // BlueLayer.h  
  2. #import "BaseLayer.h"  
  3.   
  4. @interface BlueLayer : BaseLayer  
  5. @end  
[java]  view plain copy
  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(0, 0, 255, 255);  
  13. }  
  14. @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.youkuaiyun.com/q199109106q/article/details/8602106

感谢作者~!

AG32VF407直流电流采集仪设计:从1uA到10A宽范围采样与FPGA加速方案 本文详细介绍了基于AG32VF407芯片的直流电流采集仪设计方案,实现了从1uA到10A的宽范围采样。方案采用低噪声电源、精密运放调理、高速比较器自动档位切换及高精度ADC同步采样,并重点阐述了利用AG32VF407片内FPGA实现硬件加速以提升性能的架构思路,为精密电流测量提供了完整的硬件与FPGA加速解决方案。 阅读详情

相关推荐

ASPICE1-配置管理

SUP.8配置管理 BP1:开发配置管理策略 BP2:识别配置项 BP3:建立配置项管理系统 BP4:建立分支管理 BP5:控制变更和发布 BP6: 建立基线 BP7:报告配置项状态 BP8:验证配置项信息 BP9:管理配置项和基线的存储 1.配置管理概念 配置管理(Configuration Management,CM)是通过使用技术或行政手段对软件产品进行控制,以实现对软件开发过程和生命周期进行控制、规范的一系列措施。 完整性、一致性、可控性。 2.配置管理的主要活动: 1.

HDZQ2005的专栏 3686

七、CCScene

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

M了个J 5644

基于STM32F103的二维码识别项目——OV7670篇

此系列用于记录做过的项目,这篇文章介绍基于STM32F103的二维码识别项目之OV7670FIFO模块。

beyourself_he的博客 4287

cocos2d-x CCNode,CCLayer,CCScene分析

CCNode是父亲,CCLayer和CCScene是他2个孩子,CCScene 负责和CCDirector打交道,负责管理CCNode 所有的孩子(这个CCNode不知道有多少孩子,孙子) CCNode | | CCLayer CCScene CCNode核心属性和方法 class CC_DLL CCNode : public CCObject { 1 2

NightWish 3234

stm32H743基于CubeMX配置为双ADC多通道DMA规则采样

stm32H743的ADC支持的最大频率为36MHz,有相关资料上说是可以超频,具体技术细节不多讨论。 需求: 使用stm32H743的ADC采集5路ovrc

xtqbp的博客 4361

LVI-SAM适配KITTI数据集避坑指南:IMU频率与数据同步问题解析

本文深入解析了将LVI-SAM框架适配KITTI数据集时,在IMU频率与多传感器数据同步方面遇到的核心挑战与解决方案。针对KITTI数据集中sync与extract两种数据包的差异,文章提供了从数据选择、参数调优到时间戳诊断与修复的完整避坑指南,帮助开发者实现稳定高效的SLAM系统部署。

7z8x2c4v6b9的博客 247

cocos2d-X学习之主要类介绍:节点CCNode

首先是类结构: 可以看到CCNode 几乎是游戏中处理的大部分类的父类,其主要有以下函数: virtual int getZOrder (void) //获取节点的顺序 virtual const CCPoint & getPosition (void) //获取节点的位置 virtual void setPosition (const CCPoint &...

A425951726的博客 271

Cadence Allegro 17.4学习记录开始01-原理图Capture CIS 17.4

Orcad的学习记录

qq_31444421的博客 1万+

cocos2d-x总结(六) cocos2d-x与ISO内存管理

之前项目一直在IPAD2上测试,一直很流畅。后来拿到ITOUCH上的时候,瞬间就崩了。用XCODE的内存分析工具分析,内存都快飙到200M了。。。。经过一番折腾以后,终于控制在80M以内。下边就写写折腾过程中遇到的问题。 一,IOS与图片内存 在IOS上,图片会被自动缩放到2的N次方大小。比如一张1024*1025的图片,占用的内存与一张1024*2048的图片是一致的。图片占用内存大小的计算...

weixin_34419321的博客 326

华为HCIP-001:PPPOE配置模拟实验

华为HCIP01:PPPOE配置模拟实验 实验环境 pppoe-client上面的接口信息 [AR1]dis ip interface brief *down: administratively down ^down: standby (l): loopback (s): spoofing The number of interface that is UP in Physical is 2 The number of interface that is DOWN in Physical is 1 Th

兔子乖乖 1797

【麒麟桌面系统】企业微信提示当前副设备的企业微信版本较低

银河麒麟系统中登录企业微信时出现"副设备版本较低"的报错,可通过两种方案解决:1)更新最新版企业微信,需替换软件源并刷新软件商店安装8.0-50-4.1.26.6019kylin5版本;2)安装内测5.0版本企业微信,需下载deb包后使用sudo dpkg命令安装。文章还提供了常见问题解决表和长期维护建议,包括系统更新检查、软件源验证等维护项目及具体操作指南。

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 2263

CCScene解析

代码: /**************************************************************************** Copyright (c) 2008-2010 Ricardo Quesada Copyright (c) 2010-2012 cocos2d-x.org Copyright (c) 2011 Zynga Inc. Copy

Freedom! 695

SAP Fiori Launchpad 自定义层文本翻译实战:精准修正 Tile、Catalog 与 Group 标题

SAP Fiori 项目中,入口层(tile/catalog/group)的翻译问题常被忽视,但其直接影响用户体验。与前端i18n不同,这些文本属于平台配置数据,需通过ABAP标准翻译流程(SE63)处理。关键步骤包括:使用/UI2/FLC定位Text ID和Configuration ID,根据前缀区分Main/Property WD Config Key,在SE63中锁定WDY_CONF_USERT2表对象进行翻译。操作时需注意使用系统源语言环境,翻译完成后可能需要清理缓存。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 170

【玩转cocos2d-x之七】场景类CCScene和布景类CCLayer

场景类CCScene和布景类CCLayer都是作为一个容器来使用,这里简单地看下它们的实现: 1.场景类:CCScene CCScene类继承于CCNode,它的实现很简单,就是基本上没添加什么内容。。。它只是作为一个容器(父节点)的抽象概念存在。对比CCNode差别有: (1)构造函数中设置了不使用锚点定位,而是使用了坐标原点,即使设置了锚点也不起作用。

偶尔e网事 9529

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

[置顶] 【玩转cocos2d-x之七】场景类CCScene和布景类CCLayer

原创作品,转载请标明:http://blog.youkuaiyun.com/jackystudio/article/details/12708811 场景类CCScene和布景类CCLayer都是作为一个容器来使用,这里简单地看下它们的实现: 1.场景类:CCScene CCScene类继承于CCNode,它的实现很简单,就是基本上没添加什么内容。。。它只是作为一个容器(...

weixin_34342207的博客 97

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

cocos2d-x学习之CCScene

介绍 CCScene类对应cocos2d-x引擎里的场景,CCScene中存放的是需要渲染的布景、人物角色、和菜单,它可以作为一个整体,一起渲染,一起销毁,一起被场景切换使用。 类结构图 CCScene 继承自 CCNode。 CCNode继承自CCObject和SelectorProtocol。 作用 在cocos2d-x引擎中CCScene承担

982

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

COCOS2D-X CCScene 与 CCLayer 分离细节

在项目的进行中,特别是过于

PersonFly_小逗 1110

cocos2d-x节点(CCScene)API

本文来自http://blog.youkuaiyun.com/runaying ,引用必须注明出处! cocos2d-x节点(CCScene)API 温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客 Cocos2d-X权威指南笔记 把 Scene 作为所有 node 的parent 是一个很好的做法,基本的 Scene 方法 ///cocos2d-x-3.0

runaying的专栏 1452

cocos2d-x基础类之CCScene类

原文档说明:CCScene是CCNode的子类,这是一个抽象的概念.CCScene与CCNode的唯一不同是CCScene的锚点在屏幕的中心。目前CCScene还没有其他的逻辑,但在未来他可能拥有增加的逻辑,使用CCScene作为你所有节点的父节点会是一个好习惯。 游戏场景类,可以把它想象成一个一个的界面,可以认为是Android组件中的Activity。由于它是一个没有实现逻辑的父类,编程中用

Android & cocos2d-x 504

Cocos2d之CCScene

CCScene是场景类,它相当于一个大容器,将包含在内的层和精灵输出到屏幕上,是整个树的根节点。其实CCScene的内部构成非常简单,虽然继承自CCNode,但没有在它的基础上增加任何成员变量和方法,只是重构了init。由此可以看出,其实CCScene并没有屏显的作用,其实它的作用只是承上启下,之前说过,节点只有被加到树中才会更新逻辑以及绘制,绘制的方法visit是节点实现的,场景只是把节点添加到树

CyRo 543

cocos2d-x CCScene 场景对象如何自动释放

CCScene对象自动释放的方法有两种: 第一种: CCScene *scene = CCScene::create(); CCLog("scene ref:%d",scene->retainCount()); CCDirector::sharedDirector()->replaceScene(scene); CCLog("scene ref:%d",s

myxlz的专栏 1176
上一篇: cocos2D(六)----CCLayer
下一篇: cocos2D(八)---- CCMenu && CCMenuItem
「已注销」
博客等级 码龄12年 28粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值