cocos2d-x开发记录:二,基本概念(导演,场景,层和精灵,场景切换,效果)
四,Director Scene Layer和Sprite(导演,场景,层和精灵)
1.Scenes(场景)
一个场景 (用CCScene对象实现)相当于APP工作流的独立部分。一些人也喜欢叫做“屏幕”或“舞台”。你的App可以有许多屏幕,但在特定时间内只有一个是处于激活状态。 例如你的一个游戏中有这些场景:介绍,主菜单,关卡1,剧情动画1,关卡2,胜利过场动画,失败过场动画,高分屏。你认为这些场景可以作为一个单独的应用程序,该应用程序只需要很少的连接代码就可以跳到其他的场景。例如介绍场景完成后可能直接跳到主菜单场景,下面是一个假设的游戏流程图:

一个cocos2d CCScene是由一个或多个CCNodes组成, CCNodes还可以做为子类嵌套。CCNodes的子类如CCLayer和CCSprite会给定场景的外观和行为。通常你实现CCLayer的子类并添加到空白的CCScene实例中。然后实现你的其他图形和游戏对象把它们作为CCNodes 添加到CCLayer中。因为场景是CCNode的子类,
它们能被手动或使用CCActions来变换。场景的切换可以通过CCScene 的子类CCTransitionScene类来处理。这些允许你创建特定切换效果。比如渐入渐出等之类的场景切换效果。
2.Director(导演)
CCDirector是一个共享的单例对象,它提供场景之间的导航。它知道当前被激活的场景并允许你改变场景。当你把一个新场景放入栈中,CCDirector会暂停先前的场景,但还是会保留在内存中。当你中栈顶取出顶部的场景时,先前暂停的场景会回复它上一次的状态。CCDirector还负责初始化OpenGL ES。
3.Layers(层)
一个CCLayer是一个CCNode它知道如何处理触摸事件。层知道如何绘制它们自己并可能是半透明,允许玩家看到背后的其他层。CCLayers在定义你游戏的外观和行为上非常有用,因此你应该耗费大量时间在CCLayer子类的编写上。如下图所示:

CCLayer是定义你处理触摸事件的地方。通过实现一个方法来处理触摸事件(ccTouchBegan,ccTouchMoved,ccTouchEnded,ccTouchCancelled)并与玩家互动。这些触摸时间被传递到一个场景内的所有层中,由前向后,直到一些层捕获事件并接受它。而复杂的应用程序将要求你定义CCLayer的子类,cocos2d提供一些预定义的层。一些例子包括CCMenu(一个简单的菜单层),CCColorLayer(一个实体颜色层),CCLayerMultiplex(一个多样化的层,让你多种不同的子元素中,每次激活一个元素但关闭其他元素)。层可以包含任意的CCNode,如CCSprites,CCLabels或CCLayer他自己。因为层是CCNode的子类,它们能被手动或使用CCActions来变换。以下是CCLayerMultiplex的例子代码:
CCLayerGradient* layer1 = CCLayerGradient::create(ccc4(, , , ), ccc4(, , , ));
layer1->setContentSize(CCSizeMake(, ));
layer1->setPosition(ccp(,));
addChild(layer1);
CCLayerGradient* layer2 = CCLayerGradient::create(ccc4(, , , ), ccc4(, , , ));
layer2->setContentSize(CCSizeMake(, ));
layer2->setPosition(ccp(,));
addChild(layer2);
CCLayerGradient* layer3 = CCLayerGradient::create();
layer3->setContentSize(CCSizeMake(, ));
layer3->setPosition(ccp(,));
layer3->setStartColor(ccc3(, , ));
layer3->setEndColor(ccc3(, , ));
layer3->setStartOpacity();
layer3->setEndOpacity();
ccBlendFunc blend;
blend.src = GL_SRC_ALPHA;
blend.dst = GL_ONE_MINUS_SRC_ALPHA;
layer3->setBlendFunc(blend);
addChild(layer3);

Sprites(精灵)
一个cocos2d CCSprite其实和其他游戏引擎的sprites类似。这是一个2D图像,可以移动,旋转,缩放,动画,并接受其他转换。当然精灵也能嵌套。它父类精灵被转换时,它的所有子元素也会被转换。同样精灵也是CCNode的子类,任何转换都适用于CCActions
五,场景切换
Cocos2d-x提供一个非常酷的功能,就是两个不同场景间的切换。擦拭,淡入淡出,缩放,分裂。它依赖于CocosNode 并类似于层,从技术上来讲场景过渡也是一个场景,它承前启后。相比用过Android源生的同学都知道,android也有这样的功能,但cocos2d-x的过渡效果更加强大。
1.创建过渡
他的时间单位为秒,应用场景转换的语法如下所示:
CCDirector::sharedDirector()->replaceScene(CCTransitionFade::create(0.5,newScene));
它提供一些过渡自定义参数,如FadeTransition有一个淡入淡出的颜色作为一个额外的参数如下代码所示:
static
CCTransitionFade* create(float duration,CCScene* scene, const ccColor3B&
color);
对于场景过渡它得心应手,下面是一个小例子:
CCScene *s = SecondPage::scene(); CCDirector::sharedDirector()->setDepthTest(true); CCTransitionScene *transition = CCTransitionPageTurn::create(3.0f, s, false);
如果你运行上面的代码你将会有一个翻页的效果:

六,效果
1.导言
效果是一个特殊类型的action。它不是修改一些常用的属性,如透明度,位置,旋转,缩放。而是修改一个新的属性:grid。一个grid属性像一个矩阵,它是一个网络的线路,相互交叉,形成一系列的正方形或长方形。这些特殊的动作渲染于任何的CocosNode对象(Layer, Scene, Sprite等)到grid,并且你能通过改变它们的顶点来变换grid。下面有两种girds:tiled girds和非tiled grids。它们的区别是tiled girds是由于个体的tiles组成而非tiled grids由顶点组成。如下图所示:

下面是一个Ripple3D动作的例子,它使用是Grid3D(非tiled)grid:


下面是一个FadeOutTR 动作,它使用是TiledGrid3D(tiled)grid:


2.如何使用它们
任何其他的action,都是通过runAciton执行:
// Create an sprite
CCSprite* grossini = CCSprite::create("grossini.png");
grossini->runAction(CCLiquid::create(, , ccg(,), ));
液体类似的效果,它们接收gird参数。你可以通过增加网格的大小调整效果的质量。但它也意味着更少的FPS。这种效果是IntervalAction动作,因此你能对待其他动作一样处理:
// create a Lens3D action
CCActionInterval* lens = CCLens3D::create(ccp(,),,ccg(,),); // create a Waved3D action
CCActionInterval* waves = CCWaves3D::create(,,ccg(,),); // create a sequence an repeat it forever
grossini->runAction(CCRepeatForever::create((CCSequence*)CCSequence::create(waves, lens, NULL ) ) );
以下是使用Grid3D (非tiled)的action,基于v2.1.0版本
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
以下是使用TiledGrid3D(tiled)的action
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
cocos2d-x开发记录:二,基本概念(导演,场景,层和精灵,场景切换,效果)的更多相关文章
- Dokuwiki 二次开发记录
Dokuwiki 二次开发记录 [转]http://www.syyong.com/other/Dokuwiki-Secondary-Development-Record.html DokuWiki 是 ...
- SQL开发技巧(二)
本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列文章基于SQLServer系列,且版本为SQLServer2005及以上-- 文章系列目录 SQL开发技巧(一) SQL开 ...
- Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式
目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...
- MS CRM 2011的自定义和开发(11)——插件(plugin)开发(二)
http://www.cnblogs.com/StoneGarden/archive/2012/02/06/2339490.html MS CRM 2011的自定义和开发(11)——插件(plugin ...
- .NET Web开发总结(二)
第二章 4.1 Application对象 在.NET开发中具有举足轻重的作用 Application对象的作用和运行机制存储所有用户的信息将一个网站创建一个应用程序一 . 创建一个Global文件 ...
- SQL开发技巧(二) 【转】感觉他写的很好
本文转自: http://www.cnblogs.com/marvin/p/DevelopSQLSkill_2.html 本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列 ...
- CozyRSS开发记录9-快速实现一个RSS解析器
CozyRSS开发记录9-快速实现一个RSS解析器 1.再读RSS标准 既然需要自己实现一个RSS解析器,那自然需要仔细的读一读RSS的标准文档.在网上随便找了两份,一份英文一份中文: http:// ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 修改及删除文章
上次做了显示文章列表,再实现修改和删除文章这部分内容就结束了,这次内容比较简单,由于做过了添加文章,修改文章非常类似,就是多了一个TryUpdateModel部分更新模型数据. 目录: ASP.N ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 全部文章列表
显示文章列表分两块,管理员可以显示全部文章列表,一般用户只显示自己的文章列表.文章列表的显示采用easyui-datagrid.后台需要与之对应的action返回json类型数据 目录 ASP.N ...
随机推荐
- Exception in thread "main" java.lang.ClassCastException: $Proxy13
Exception in thread "main" java.lang.ClassCastException: $Proxy13原因:业务层实现了接口 解决:方法一:切面配置事务 ...
- php之快速入门学习-8(if-else)
PHP If...Else 语句 条件语句用于根据不同条件执行不同动作. PHP 条件语句 当您编写代码时,您常常需要为不同的判断执行不同的动作.您可以在代码中使用条件语句来完成此任务. 在 PHP ...
- MySQL 联合索引测试
搭建测试环境 1:创建表 CREATE TABLE tab_index (id int(5), age int(3), dte datetime); 2:插入测试数据 INSERT INTO tab_ ...
- Protobuf学习 - 入门(转)
从公司的项目源码中看到了这个东西,觉得挺好用的,写篇博客做下小总结.下面的操作以C++为编程语言,protoc的版本为libprotoc 3.2.0. 一.Protobuf? 1. 是什么? Goo ...
- 算法练习--- DP 求解最长上升子序列(LIS)
问题描写叙述: 对于2,5,3,1,9,4,6,8,7,找出最长上升子序列的个数 最长上升子序列定义: 对于i<j i,j∈a[0...n] 满足a[i]<a[j] 1. 找出DP公式:d ...
- servlet Servlet例子
Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口(参看J2EE API文档),用户若想使用Java程序开发一个动态web资源, ...
- 2014年,daliu_it 年末文章汇总清单
一.javabase 1. Windows环境下JDK安装与环境变量配置 详细的介绍了JDK的安装以及配图,同时安装的注意事项. 2. 项目的命名规范,为以后的程序开发中养成良好的行为习惯 详细的介绍 ...
- IDEA 开发环境中 调试Spark SQL及遇到问题解决办法
1.问题 java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemoryError: Java heap space // :: WAR ...
- OpenWrt 中安装配置Transmission
参考文章https://wiki.openwrt.org/doc/uci/transmission 1. 安装包 必装的 transmission-daemon-openssl (后台服务)选装的 t ...
- oper
package main.java.com.zte.controller.ems; import java.util.HashMap; import java.util.List; import ja ...




















