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 ...
随机推荐
- Jquery attr("checked") 返回checked或undefined 获取选中失效
$('#cb').attr('checked'); 返回的是checked或者是undefined,不是原来的true和false了,有关此问题的解决方法如下: <input type='che ...
- 电脑PE系统工具
自己收集的一些PE电脑维护工具 电脑店PE工具 http://u.diannaodian.com/ 通用PE工具箱 http://www.tongyongpe.com/ 大白菜PE工具 http:// ...
- OC 创建单例
static BlockBackground *_sharedInstance = nil; + (BlockBackground*)sharedInstance { if (_sharedInsta ...
- rmdir 命令(转)
原文:http://www.cnblogs.com/peida/archive/2012/10/27/2742076.html rmdir命令.rmdir是常用的命令,该命令的功能是删除空目录,一个目 ...
- html5开放资料
http://www.cnblogs.com/tim-li/archive/2012/08/06/2580252.html KineticJS教程(12) 摘要: KineticJS教程(12) 作者 ...
- Win10怎么设置点击任务栏上文件夹图标直接打开“我的电脑”?
我们都知道Win10任务栏上的文件夹图标可以打开文件资源管理器,但是点击这个图标后打开的位置却是不固定的,有可能是库文件夹,也有可能是其他常用的位置.怎么设置点击这个图标后直接打开"此电脑& ...
- js立即执行函数应用--事件绑定
js中立即执行函数的应用:应用到事件绑定上. 少说多做,直接运行代码(代码中有注释): <!DOCTYPE html> <html lang="zh"> & ...
- Linux下监视NVIDIA的GPU使用情况(转)
在使用TensorFlow跑深度学习的时候,经常出现显存不足的情况,所以我们希望能够随时查看GPU时使用率.如果你是Nvidia的GPU,那么在命令行下,只需要一行命令就可以实现. 1. 显示当前GP ...
- This Handler class should be static or leaks might occur,Handler和Context使用的注意事项!
Android中.在使用到Handler的时候,假设按例如以下代码编写: private Handler handler; @Override public void onCreate(Bundle ...
- maven 如何给web项目添加jar包依赖
maven 如何给web项目添加jar包依赖 CreateTime--2018年4月19日19:06:21 Author:Marydon 开发工具:eclipse 1.打开pom.xml文件--& ...




















