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

     从继承关系图知,CCNode是继承自基类CCObject,而场景CCScene、布景层CCLayer和精灵CCSprite都从它继承而来。它是一个抽象类,没有可视化的表示形式,但任何需要画在屏幕上的对象几乎都是从节点类CCNode继承而来。下面这张CCNode及子类继承图可说明这一点:
 
  CCNode包括的核心功能如下:
  1)节点都可以通过addChild添加一个或多个子节点,每个子节点只有唯一一个父节点,这就形成了节点树形结构。这个树形结构非常重要,它使节点有能力将概念类组织起来,实现概念之间的层次关系结构。
  2)节点包含CCScheduler,用于支持调度;
  3)节点包含CCActionManager,用于支持动作;
  4)父节点的属性设置(如旋转角度和位置等属性)可以传递到子节点上。
 
  CCNode有两个作用:一是需要利用它的树形结构管理大量子节点;二是需要自定义一个在屏幕上显示的对象可以继承自CCNode。Cocos2D-x游戏开发基本上就是和CCNode或它的子类打交道。CCNode是Cocos2D-x的核心类,Cocos2D-x引擎整个框架就建立在CCNode树形结构基础上。
  了解CCNode的重要性和作用,接下来查看一下它的内部结构和功能。
 
  ·CCNode属性:
    float m_fRotation:节点的旋转角度。
    float m_fScaleX,m_fScaleY:节点的缩放比例,X为横向,Y为纵向。当值为1表示原比例。
    CCPoint m_tPosition:节点的位置坐标。该属性是一个结构体,m_tPosition.x表示横坐标,m_tPosition.y表示纵坐标。
    float m_fSkewX,m_fSkewY:节点的扭曲角度。
    CCPoint m_tAnchorPointInPoints:节点的锚点坐标。所谓锚点就是当旋转、缩放或用其它方式操作节点时的参考基准点。在讲Cocos2D-x坐标系时,会专门讲锚点的概念。
    CCPoint m_tAnchorPoint:节点的锚点在节点位置的比例。
    CCSize m_tContentSize:节点的宽度和高度。它也是一个结构体,m_tContentSize.width表示宽度,m_tContentSize.height表示高度。它和m_tPosition配合可以用来检测碰撞,但需要注意的是m_tContentSize不会因为节点的旋转和缩放而改变大小。所有节点都有大小,场景和布景层的大小是屏幕的大小。
    CCCamera* m_pCamera:跟随节点的摄像机对象。Coco2D-x虽然是2D游戏引擎,但实际上它是通过3D方式绘制2D效果的,因此有镜头存在就不奇怪了。CCCamera默认情况下是正对着节点的,距离也是刚好使节点能够以1:1的比例显示到屏幕上。当我们手动修改它的参数后,节点就可以会呈现出歪曲或缩放等效果。
    int m_nZOrder:表示该节点兄弟节点的Z轴顺序。在2D游戏中,Z轴顺序决定遮挡关系(值越小越在上面)。
    int m_fVertexZ:表示在OpenGL中的Z轴值。
    CCArray* m_pChildren:节点的子节点集合。节点可以通过集合遍历和查找子节点。
    CCNode* m_pParent: 节点的父节点。除根节点外没有父节点外,所有节点只有唯一一个父节点。
    int m_nTag:节点的标签,用于从父节点查找子节点。
    bool m_bIsRuning:表示节点是否在运行中。
    bool m_bIsVisible:表示节点是否显示。
 
   ·CCNode方法:
    void onEnter():回调函数,该节点被添加到父节点时调用。
    void onEnterTransitionDidFinish():回调函数,同onEnter函数。
    void onExit():回调函数,该节点被父节点删除时调用。
    void onExitTransitionDidStart():回调函数,同onExie函数。
    void draw(void):渲染节点。
    void visit(void):递归调用本节点和子节点并调用draw函数绘制它们。
    CCAction* runAction(CCAction* action):执行动作
    CCPoint convertToNodeSpace(const CCPoint& worldPoint):转换为节点空间坐标,相对于节点的左下角,与锚点无关。
    CCPoint convertToWorldSpace(const CCPoint& nodePoint); 转换为世界空间(全局绝对)坐标,与锚点无关。
 
  以上这些就是CCNode的主要属性和方法。还有很多未提及到的属性和方法,请查看API帮助文档了解。
 
  上面CCNode的属性和方法中涉及到了坐标以及坐标转换,曾经使用微软DirectX开发过3D游戏客户端的同学,一定知道坐标系的概念是非常重要的,它涉及到图形绘制的显示。下面就学习一下,Cocos2D-x所涉及到的坐标系。
 
  ·OpenGL坐标系
     Cocos2D-x是以OpenGLOpenGL ES为基础,所以支持OpenGL坐标系。该坐标系原点在屏幕左下角,x轴向右,y轴向上。
   ·屏幕坐标系(UI坐标系)
     Cocos2D-x的屏幕坐标系是屏幕触摸事件CCTouch传入的位置信息使用的坐标系。该坐标系与OpenGL不同,它的原点在左上角,x轴向下,y轴向上。因此,在Cocos2D-x中对触屏事件做响应前,需要触屏点转换到OpenGL坐标系。后来将介绍的CCDirect的convertToGL方法可以完成这一转换。
 
  ·节点坐标系(本地坐标系)
     本地坐标系也叫做物体坐标系,是和特定物体相关联的坐标系。每个物体都有它们独立的坐标系,当物体移动或改变方向时,和该物体关联的坐标系将随之移动或改变方向。例如在城市里坐出租车时,我们在车内对司机指方向说"向右转",这时我们使用的是车的物体坐标系,"向右转"只有在物体坐标系中才有意义;如果我们说"向东开",我们使用的是就是城市坐标系;如果我们说"向西经20度北纬10度开",我们使用的是地球坐标系。而地球坐标系相对其内的我们来说,这是一个绝对坐标系,除非你离开地球,那么你需要宇宙坐标系。
   回到Cocos2D-x中,节点坐标系是和特定节点相关联的坐标系,每个节点都有一个独立的本地坐标系。当节点移动或改变方向时,和该节点关联的坐标系(它的子节点)将随之移动和改变方向。这一切是相对基准的,只有在节点坐标系中才有意义。CCNode的位置m_tPosition使用的是父节点的本地坐标系,它和OpenGL坐标系是一致的,原点在父节点的左下角,x轴向右,y轴向上。如果父节点是场景树中的顶层节点,那么它使用的本地坐标系就和下面介绍的世界坐标系重合了。在CCNode对象中有几个方便的函数可以做坐标转换:convertToWorldSpace方法可以把基于当前节点的本地坐标系下的坐标转换到世界坐标系中。convertToNodeSpace方法可以把世界坐标转换到当前节点的本地坐标中。注意这些方法转换的是基于当前节点的坐标,而一个节点的m_tPosition所使用的坐标是基于它父节点的本地坐标,因此我们要把节点的位置转换到世界坐标系中应该调用父节点的convertToWorldSpace方法。几乎绝大部分游戏引擎都会使用本地坐标系而非世界坐标系来指定元素位置,这样做的好处是当计算物体运动的时候使用同一本地坐标系的元素可以作为一个子系统独立计算,最后再转换坐标系即可。
   如果仍对节点坐标系不是很理解,可以把节点想像成一棵树(节点本身就是树形结构),如果向一个方向移动树根(根节点),是不是树冠(子节点)和树叶(孙子节点)也会相对一起移动。也就是说,子节点总是使用其父节点的坐标系,而根节点直接使用世界坐标系。思考一下,如果我移动了节点树中的某个叶节点,那么它会影响到哪些节点呢?
 
  ·世界坐标系
     世界坐标系是一个绝对坐标系,是游戏里面固定的坐标系。它建立了描述其他坐标系所需要的参考标准。我们能够用世界坐标系来描述其他坐标系的位置。如果把游戏世界看作地球,游戏中的元素看作是地球上的生物,那么地球坐标系就是游戏中的世界坐标系也是绝对坐标系,因为它可以确定游戏中任何元素之间的位置。世界坐标系与OpenGL方面一致,原点在屏幕左下角,x轴向右,y轴向上。Cocos2D-x中的元素最终在绘制到屏幕时,都将转换成世界坐标系。在Cocos2D-x游戏中没有比世界坐标系更大的坐标系了。
  ·锚点(AnchorPoint)
     每个CCNode都有一个锚点,锚点指定了纹理贴图上和所在节点原点(也就是设置位置的点m_tPosition)重合的点的位置,因此只有在CCNode类节点使用纹理贴图的情况下,锚点才有意义。锚点的默认值是(0.5,0.5),表示的并不是一个像素点,而是一个乘数因子。它表示锚点位于纹理贴图长度乘以0.5和宽度乘以0.5的地方,即纹理贴图的中心。
     改变锚点的值并不会改变节点的位置,虽然可能看起来节点的纹理贴图位置发生的变化,其实变化的只是纹理贴图相对于m_tPosition的相对位置,相当于你在移动节点里面的纹理贴图,而非节点本身。如果把锚点设置成(0,0),纹理贴图的左下角就会和节点的位置重合,这可能使用元素定位更为方便,但会影响到元素的缩放和旋转等一系列变换。因此,并没有一种锚点设置需要根据实际需要来定义。
     可以看出,锚点并不具有独立坐标系,它只是节点位置坐标的一个相对值,其作用是使节点内纹理贴图的移动和旋转通过简单设置锚点即可实现。
 
    Cocos2D-x涉及的坐标系就介绍完了,如需了解更多有关坐标系和坐标转换的内容,请参考如下资料:
     cocos2d-x坐标系详解【cocos2d-x官方文档】

-------------------------------------------------------------------------------------------------------------------------------------------------------------

注:本人在本博客的原创文章采用创作共用版权协议http://creativecommons.org/licenses/by-nc-sa/2.5/cn/), 要求署名、非商业用途和保持一致。要求署名包含注明我的网名及文章来源(我的博客地址:http://www.cnblogs.com/binbingg)。

[原创]cocos2d-x研习录-第二阶 概念类之节点类(CCNode)的更多相关文章

  1. [原创]cocos2d-x研习录-第二阶 概念类之精灵类(CCSprite)

    上一节说布景层CCLayer是小容器,那么精灵类CCSprite就是容器添加的内容,它是构成游戏的主要元素.精灵这个名称应该是游戏专用,它表示游戏中玩家操作的主角.敌人.NPC(Non Player ...

  2. [原创]cocos2d-x研习录-第二阶 概念类之场景类(CCScene)

    场景类CCScene是Cocos2D-x在屏幕显示的内容,相当于游戏关卡或界面.CCDirector任何时候只能显示一个场景CCScene,游戏中可能存在若干场景,CCDirector通过场景切换达到 ...

  3. [原创]cocos2d-x研习录-第二阶 概念类之导演类(CCDirector)

    CCDirector类是游戏的组织和控制中心(总指挥),它控制着主屏幕的显示.场景的切换和显示,以及游戏的开始.结束和暂停.它的继承关系图如下:    CCDirector继承自基类CCObject, ...

  4. [原创]cocos2d-x研习录-第二阶 概念类之摄相机类(CCCamera)

    在Cocos2D-x中,每个CCNode都拥有一个摄像机类CCCamera.只有通过CCCamera,CCNode才会被渲染出来.当CCNode发生缩放.旋转和位置变化时,都需要覆盖CCCamera, ...

  5. [原创]cocos2d-x研习录-第二阶 概念类之布场层类(CCLayer)

    上面说场景CCScene相当于一个大容器,那么布景层类CCLayer就是大容器里的若干个小容器.每个游戏场景CCScene会有很多层CCLayer,每一层CCLayer负责各自的任务.看一下CCLay ...

  6. [原创]cocos2d-x研习录-第二阶 基本框架

    了解完Cocos2D-x的基本概念和概念类之后,是不是有一种蠢蠢欲动的冲动,想要探究Cocos2D-x是如何完成这一切的.接着我将通过对Cocos2D-x自代的HelloCpp项目进行分析,初步了解C ...

  7. [原创]cocos2d-x研习录-第二阶 基本概念

    在Cocos2D-x引擎中,有几个非常重要的概念:导演(CCDirector).摄像机(CCCamera).场景(CCSecen).布景(CCLayer).精灵(CCSPrite)和动作(CCActi ...

  8. [原创]cocos2d-x研习录—前言

    我认为很多开发者面对层出不穷的新技术.新思想和新理念,最为之苦恼的是找不到行之有效的学习方法,对于知识的本质缺乏认识,虽阅读了大量教材,却无法将其融入自己的知识体系,并搭建自己的知识树.不可否认,教材 ...

  9. [原创]cocos2d-x研习录-第三阶 特性之物理引擎

    游戏物理引擎是指在游戏中涉及物理现象的逻辑处理,它用于模拟现实世界的各种物理规律(如赛车碰撞.子弹飞行.物体掉落等),让玩家能够在游戏中有真实的体验. Cocos2D-x中支持Box2D和Chipmu ...

随机推荐

  1. equals

    package abstractClasses; import java.time.LocalDate; /** * Created by xkfx on 2016/12/20. */ public ...

  2. OneSQL的docker之旅

      百度盘下载地址: http://pan.baidu.com/s/1v9GWA   OneSQL Docker使用方法:  1. 解压    tar zxvf OneSql-Docker-5.6.2 ...

  3. Eclipse 的 Debug 介绍与技巧

    转载: Eclipse 的 Debug 介绍与技巧

  4. javascript的一些基础

    当复制的两个变量的地址不同时他们是不相等的如下代码所示 function getFunction(value){ return function(value){ return value; } } v ...

  5. linux下多路复用模型之Select模型

    Linux关于并发网络分为Apache模型(Process per Connection (进程连接) ) 和TPC , 还有select模型,以及poll模型(一般是Epoll模型) Select模 ...

  6. subplot demo

    Y=[6484.05190614446 3479.60374683749 2326.82521799362 862.207727785871 423.711173743815 299.23540931 ...

  7. ios中autolayout

    IOS 6 自动布局 入门-1  Matthijs Hollemans on September 29, 2012 Tweet 这篇文章还可以在这里找到 英语, 韩语, 土耳其语 If you're ...

  8. Wifite v2 is now available

    Wifite v2 is now available What's new in this version: support for cracking WPS-encrypted networks ( ...

  9. Leetcode 58 Length of Last Word 难度:0

    https://leetcode.com/problems/length-of-last-word/ int lengthOfLastWord(char* s) { int ans = 0; int ...

  10. WP8.1 Study17:网络之后台下载/上传及HttpClient

    一.后台下载/上传 1.简介 使用BackgroundTransferGroup可以十分方便操作上传及下载文件,BackgroundDownloader和BackgroundUploader类中的方法 ...