节点与渲染树

回顾前面的介绍,我们已经知道了精灵、层和场景如何构成一个游戏的框架。精灵属于层,层属于场景,玩家与精灵互动,并导致游戏画面在不同场景中切换。把每个环节拼接在一起,我们得到了一个完整的关系图。以《捕鱼达人》的游戏场景的简化版为例,各个游戏元素按照图2-4所示的方式组织在一起。

从组织关系的角度来说,游戏元素按照图2-4中的树形结构组织起来;而从绘图的角度来说,图形按照自上而下的顺序绘制出来。为了绘制场景,需要绘制场景中的层,为了绘制层,需要绘制层中的精灵。因此,关系图实质上安排了图元的绘图方式,关系图中的每一个元素称作节点(node),关系图则称作渲染树(rendering tree)。渲染场景的过程就是遍历渲染树的过程。

图2-4 游戏元素的组织方式

一旦建立起渲染树,组织复杂的场景就变得十分简单。我们赋予每个节点一系列属性,包括节点相对于父节点的位置、旋转角度、缩放比例和变形参数等。渲染树的优势在于,我们只需要考虑节点相对于父节点的属性,就可以逐层创建复杂的对象或动作。

另一个简单的例子是《捕鱼达人》中的海龟由躯干和4条腿构成(如图2-5所示)。在游戏中,不但海龟在水中游动,它的4条腿也在不断做划水的动作。这一系列动作可以分解为:

4条腿相对整个海龟在一定角度内旋转;

躯干相对于整个海龟静止不动;

整个海龟在鱼层中游动,位置和方向在不断改变。

因此,建立一个节点表示海龟,在海龟节点下再建立5个精灵,分别表示4条腿和躯干。这样,每个动作都是可控的,只要为每个节点设置好了动作,就可以完成复杂的动画。反之,如果没有树型结构,组织一个稍微复杂的游动都会成为一个巨大的工程。

图2-5 海龟的构成

Cocos2d也采用了渲染树架构。任何可见的游戏元素都派生自Cocos2d-x节点(CCNode),常见的游戏元素有场景(CCScene)、层(CCLayer)和精灵(CCSprite)等。前面提到过,通常游戏按照场景、层、精灵的层次顺序组织,每种节点都有各自的特点。然而在实际开发中,为了实现一些特殊的效果,也不必拘泥于这个层次顺序。层或精灵都是普通的节点,因此,即使向精灵中添加精灵,向场景中添加精灵,甚至向精灵中添加层,这些操作也都没有被禁止。在读者认为必要时,可以自己尝试各种组织层次。

节点类(CCNode)的更多相关文章

  1. [原创]cocos2d-x研习录-第二阶 概念类之节点类(CCNode)

    节点类CCNode在基本概念中并不存在,它是为了建立基本概念之间的关联关系而抽象出来的中间辅助类.这个类在Cocos2D-x中极为重要,它为概念类之间搭建了一座宏伟的桥梁.它的继承关系图如下:     ...

  2. 9 DelayQueueEntry 延时队列节点类——Live555源码阅读(一)基本组件类

    这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...

  3. C# 读取xml节点类容

    这是一个测试节点类容的获取 这是控制台代码部分 注意的应用文件 :using.system.Xml using System; using System.Collections.Generic; us ...

  4. lua基于oopclass的属性节点类 和 集合类

    --[[---------------------------------------------------------------------------- --@ Descrption: 属性节 ...

  5. cocos2dx[3.2](6) 节点类Node

    与2.x相比,节点类Node的属性和功能做了大幅度的修改与增加. Node类是绝大部分类的父类(并不是所有的类,例如Director类是直接继承Ref类的),如Scene.Layer.Sprite以及 ...

  6. js复制对象 和 节点类型和NodeList

    1. myList.cloneNode(true); 在参数为true的情况下,执行深复制,也就是复制节点及其整个子节点树,包括属性 2. myList.cloneNode(false); 在参数为f ...

  7. 简单名称值对节点类NameValuePair

    本类位于System.Data.dll中,名为:System.Data.Common.NameValuePair.主要用途是在DBConnectionString类中,解析ConnectionStri ...

  8. cocos2dx基础篇(3) 常用重要类

    ---------------------------------------- 入口类main.cpp 主要控制类AppDelegate.cpp -------------------------- ...

  9. [原创]cocos2d-x研习录-第三阶 特性之动作

    在前面的Cocos2D-x的概念类中,我们了解到节点类CCNode.导演类CCDirector.场景类CCScene.布景层类CCLayer和精灵类CCSprite等,这些类都是构成游戏画面的基本元素 ...

随机推荐

  1. Django关于filter和get()方法

    首先引入一个问题: 问: card = Card.objects.filter(pk=offline_card_id).get() card = Card.objects.get(pk=offline ...

  2. bzoj 1138: [POI2009]Baj 最短回文路 dp优化

    1138: [POI2009]Baj 最短回文路 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 161  Solved: 48[Submit][Sta ...

  3. What does it mean for an algorithm to be fair

    What does it mean for an algorithm to be fair In 2014 the White House commissioned a 90-day study th ...

  4. Security 可视化

    http://web.cs.ucdavis.edu/~ma/SecVis/ http://research.dbvis.de/security/tools/clockview/ http://raff ...

  5. POJ - 3264 Balanced Lineup 线段树解RMQ

    这个题目是一个典型的RMQ问题,给定一个整数序列,1~N,然后进行Q次询问,每次给定两个整数A,B,(1<=A<=B<=N),求给定的范围内,最大和最小值之差. 解法一:这个是最初的 ...

  6. 如何在C++中使用WebService

    gsoap主页 http://sourceforge.net/projects/gsoap2   使用gsoap生成所需的WebService 下载后的gsoap包为:(点击到我的资源中下载) 将他解 ...

  7. webview调用javascript脚本无反应

    最近遇到一个问题:在html中有一段javascript脚本定义了一个方法,在使用webview.loadUrl("javascript:方法名()")时方法未执行,后来 查资料发 ...

  8. Java 多维数组 按某列 排序

        public MetaCell[][] getByColumn(final int columnIndex, int decisionIndex) {//[注意]final咯          ...

  9. op论坛,分支

    http://www.arm9home.net/thread.php?fid=68 http://www.openwrt.org.cn/bbs/forum.php https://dev.openwr ...

  10. 编程实现改变win7主题

    一  : 解析问题 1. Windows 7 主题在:%windir%\Resources\Themes  : 2: 我们通过shell 命令  (这个是msdn中提到的) rundll32.exe ...