http://www.xuanyusong.com/archives/950

上一章我们了解了cocos2d的项目路径以及工作原理,这次作者要真刀真枪地讲解代码了,咱们先来看看cocos2d最常用、也是作者认为最核心的类——CCNode。

之前说过,cocos2d的所有类都以CC开头,那么实际上这个类的名字就是Node,类如其名,这个类的实例就是一个节点。Cocos2d的类是树状继承的,而在内存中,各个实例之间也是以“树”这种数据结构相关联的。,可见树在cocos2d中的重要性,难怪某位伟人说“要致富,少生孩子多种树”……(雾)所以如果有童鞋对树不太了解的话,建议去看看数据结构,相信会对你的编码有帮助。(在后面的文章中,作者均以读者了解树的相关知识为前提来讲解)

在实际应用中,除了根节点外,每一个节点都有一个父节点,任何节点都可以存在N个子节点,结构图如下:

图中的每个圆圈都是一个节点(即CCNode实例),圆圈中的数字是它们的编号,所有的节点组合到一起形成了一个树。我们可以看到,1是这个树的根节点,因为它没有父节点,其余所有节点都是它直接或间接的子节点,2和3是1的子节点,4和5是2的子节点,6是3的子节点。它们通过彼此间的连线可以找到对方,就是说2知道1是它的父节点,4和5是它的子节点,但并不知道3是它的“兄弟”(没有连线),只能通过1间接的寻找,因此这种“关联”效率是最低的,且没有泛用性,在开发中应尽量避免。

上一章的最后提到过,场景是容纳所有演员的大舞台,只有加入场景的元素才会被显示到屏幕上,那么如果图中的树是一个能够正确运行的体系,1一定是一个场景,2和3有可能是层,后面就是一系列的“演员”。可能有的童鞋会问:场景和层是什么类,它们不是CCNode,为什么能作为它们的父节点,加入到树中呢?其实答案我在上一章也说过,cocos2d的类是一层一层继承下来的,它们拥有共通的接口(都是在CCNode声明的),场景类是CCScene,层类是CCLayer,它们都是CCNode的子类,就是说它们实际上也是一个node,完全可以放置在树的任何位置。像这样的例子在cocos2d中还有很多(比如精灵),所以说CCNode是cocos2d的核心一点也不为过。

了解了CCNode的重要性,接下来我们就一起研究下它的内部结构吧~

首先我们先看看它有哪些属性:(它继承自NSObject,因此它与Foundation框架的兼容性完全不用担心= =)

float rotation_

节点的旋转角度,如果是图片的话,会看到旋转效果,所以基本上是为屏幕输出服务的。

float scaleX_, scaleY_

节点的缩放比例,X为横向,Y为纵向,当值为1的时候表示原比例,0.5表示缩小一半,2表示放大1倍,如果是图片的话就会看到效果,也是为屏幕输出服务的。

CGPoint position_

节点的坐标,该属性是一个结构体,position_.x是它的横坐标,position_.y是纵坐标,基本上也是要显示到屏幕上才有意义。

float skewX_, skewY_

节点的扭曲角度,类似于Windows画图板中的扭曲功能,X是横向扭曲,Y是纵向扭曲,单位是度数,也是屏显用的。

CGPoint anchorPointInPoints_

节点的锚点坐标,所谓锚点就是当旋转、缩放或是用其它方式操作节点时的参考的基准点,例如图片的锚点在正中心,当放大它的时候,图片就会向四周扩散,当旋转一个锚点在左上角的图片时,图片就会以左上角为轴旋转。

CGPoint anchorPoint_

节点的锚点在节点位置的比例,比如说一个节点的坐标为(0, 0),宽高各为100,那么当它的锚点坐标为(50, 50)的时候,anchorPoint_.x = 0.5,anchorPoint_.y = 0.5。

CGSize contentSize_

节点的宽高,它也是一个结构体,contentSize_.width表示宽,contentSize_.height表示高,它和position_配合可以用来检测碰撞,但需要注意,contentSize_不会因为节点的旋转和缩放而改变大小。

CCCamera *camera_

节点的镜头,cocos2d虽然是2D游戏引擎,但实际上它是通过3D方式绘制2D效果的,因此有镜头存在就不奇怪了。CCCamera也是cocos2d的一个类,它默认情况下是正对着节点的,距离也是刚好使节点能够以1:1的比例显示到屏幕上,当我们手动修改它的参数后,节点就会呈现出歪曲或缩放等效果。

NSInteger zOrder_

节点的Z轴,当有多个节点在屏幕显示时,引擎会根据它们Z轴的大小决定绘制顺序,Z轴大的会盖住Z轴小的。

CCArray *children_

重头戏来了,前面说过节点可以有N个子节点,children_就是存储这些子节点地址的变量,节点就是通过它们找到自己的子节点的。children_的类型是CCArray,这是cocos2d自己封装的一个数组类,每个元素存储一个子节点地址,它引入了tag机制,当节点有多个子节点时,可以根据它们的tag找到自己想要的那一个。

CCNode *parent_

另一个重点——节点的父节点。因为树中的每个节点都继承自CCNode,所以用CCNode类型定义父节点是最万无一失的,节点可以通过它找到自己的父节点,因为父节点最多只有一个,所以不需要用数组保存。

NSInteger tag_

节点的标签,主要是帮助其父节点找到自己,因为每个节点的子节点并不一定是唯一的,当需要遍历时可以用该参数做区分,所以兄弟节点的标签尽量不要一样。

Bool isRunning_

表示节点是否在更新逻辑,之前说过,未加入树的节点是不会显示到屏幕上的,其实它的逻辑运算也是一样,就是说没有父节点的节点不会显示,也不会处理自己的逻辑,它的一切活动都会停止。那么当节点被加入到树中的时候,isRunning_会被自动置为Yes,此时它会开始执行自己的运算,当节点离开树时,isRunning_会被置为No,如果想在它在树中的时候暂停运算,就需要将它的isRunning_手动置为No。

Bool visible_

和isRunning_对应,用来表示节点是否在绘制,当visible_为No时,节点即使在树中也不会绘制到屏幕上,就相当于隐藏了起来。

以上就是CCNode比较重要的属性,不过我们在开发中直接操作它们的频率并不高,而是通过类中声明的相关方法去改变它们,下面我就来说说CCNode中的方法。

+(id) node

实例化一个CCnode对象,实际上就是封装了alloc、init和autorelease方法。

-(id) init

初始化,将一些数值型的参数归0,缩放比例设为1,指针型的参数设为nil。

-(CCArray*) children

返回对象的children_,即获取全部的子节点。

-(Bool) visible

返回visible_参数,用于检测该节点当前是否被绘制。

-(void) setVisible: (Bool)visible

设置节点的绘制状态,Yes为可见,No为不可见

-(CCNode*) parent

返回节点的parent_,即获取父节点

-(void) setParent: (CCNode*)parent

设置父节点,但实际应用中不要这样修改,因为极易出bug,正确的修改方法会在后面介绍。

-(NSInteger) tag

返回对象的tag_,即获取节点的标签。

-(NSInteger) zOrder

返回对象的zOrder_,即获取Z轴。

-(Bool) isRunning

返回对象的isRunning_,即检测该节点当前是否更新逻辑。

-(float) rotation

返回对象的rotation_,即获取节点的旋转角度。

-(void) setRotation: (float)rotation

设置对象的rotation_值,即旋转节点。

-(CGPoint) position

返回对象的position_,即获取节点的坐标。

-(void) setPosition: (CGPoint)position

设置对象的position_,即更改节点的坐标。

-(CGPoint) anchorPoint

返回对象的anchorPoint_,即获取节点的锚点。

-(void) setAnchorPoint: (CGPoint)anchorPoint

设置对象的anchorPoint_,即修改节点的描点。

-(CGSize) contentSize

返回对象的contentSize_,即获取节点的宽高。

-(void) setContentSize: (CGSize)contentSize

设置对象的contentSize_,即改变节点的宽高。

-(float) skewX

返回对象的skewX_,即获取节点的横向扭曲角度。

-(void) setSkewX: (float)skewX

设置对象的skewX_,即设置节点的横向扭曲角度。

-(float) skewY

返回对象的skewY_,即获取节点的纵向扭曲角度。

-(void) setSkewY: (float)skewY

设置对象的skewY_,即设置节点的纵向扭曲角度。

-(float) scaleX

返回对象的scaleX_,即获取节点的横向缩放比例。

-(void) setScaleX: (float)scaleX

设置对象的scaleX_,即横向缩放节点。

-(float) scaleY

返回对象的scaleY_,即获取节点的纵向缩放比例。

-(void) setScaleY: (float)scaleY

设置对象的scaleY_,即纵向缩放节点。

-(CGRect) boundingBox

返回对象的碰撞框(由坐标和宽高组合而成),这个参数会随着节点的缩放或旋转等操作而改变。

-(CCCamera*) camera

返回对象的camera_,即获取节点的镜头。

-(CCNode*) getChildByTag: (NSInteger) aTag

根据tag_返回children_数组中的某个元素,即根据标签获取节点的某个子节点。

-(void) addChild: (CCNode*)child z: (NSInteger)z tag: (NSInteger)aTag

向children_数组中添加一个CCNode对象,即给节点添加一个子节点,z是子节点的Z轴,aTag是子节点的标签,此方法会将该子节点的parent_指针指向自己,因此这才是设置父节点的正解,比setParent要安全的多。

-(void) addChild: (CCNode*)child z: (NSInteger)z

-(void) addChild: (CCNode*)child

缺省了tag或z的添加子节点方法,缺省值默认为0。

-(void) removeFromParentAndCleanup: (Bool)cleanup

将节点从它的父节点的children_数组中删除,即脱离树,cleanup表示是否将其从内存中清除。

-(void) removeChild: (CCNode*)child cleanup: (Bool)cleanup

将某一节点从children_数组中删除,即删除某一子节点。

-(void) removeChildByTag: (NSInteger)aTag cleanup: (Bool)cleanup

根据tag_删除children_数组中的某个元素,即根据标签删除节点的某个子节点。

-(void) removeAllChildrenWithCleanup: (Bool)cleanup

清空对象的children_数组,即删除所有子节点。

-(void) _setZOrder: (NSInteger)z

设置对象的zOrder_,即改变节点的Z轴。

-(void) reorderChild: (CCNode*)child z: (NSInteger)z

将某节点从子节点队列中取出,并重新重新插入队列,目的是改变其Z轴。

-(void) visit

绘制函数,用来将节点内容(多为图片或文字)显示到屏幕。

-(void) onEnter

相当于一个激活过程,它会在节点被添加到树中的时候执行,使其可以更新自己的逻辑。

-(void) onExit

取消激活,作用是暂停某节点的逻辑更新。

-(CCAction*)runAction: (CCAction*)action

一个会经常被用到的类,作用是执行一种行为,行为模式由参数action决定,CCAction就是上一章提到的行为类,runAction就是联系实体类和行为类的桥梁。行为执行完毕后,action会自动释放(用了autorelease),所以使用时不用担心内存问题。但需要注意,当isRunning_为No时,节点执行的行为会暂停,就是说onExit有暂停节点一切行为的功能。

-(void) stopAllActions

停止节点正在执行的所有行为,注意这里是停止,不是暂停,函数执行后节点中的所有行为类实例都将从内存中清除。

-(void) stopAction: (CCAction*)action

停止节点的某一个行为,如果没有执行该行为则什么都不做。

-(void) stopActionByTag: (NSInteger)aTag

根据标签停止节点的某一个行为。

-(CCAction*) getActionByTag: (NSInteger)aTag

根据标签获取某个正在执行的行为。

-(void) schedule: (SEL)selector interval: (ccTime)interval

Schedule是cocos2d中的一个很重要的机制,在作者看来它的实用性仅次于行为类,它的功能和CCAction有相似的地方,都是执行一种行为;不同之处在于,schedule是通过调用方法来执行逻辑的,而且他它内部还有个计时器,可以每隔一定的时间调用一次,反复循环,直到手动将其停止或者节点被删除(暂停)。这里的参数selector就是执行的方法,interval是间隔时间(秒),ccTime其实就是一个浮点数。

-(void) unschedule: (SEL)selector: (SEL)selector

停止一个schedule任务,注意这里是停止不是暂停。

-(void) unscheduleAllSeletors

停止所有schedule任务

-(void) resumeSchedulerAndActions

恢复运行节点的行为和schedule。

-(void) pauseSchedulerAndActions

暂停节点的行为和schedule。

以上就是实体类的常用参数和方法,希望能对你学习cocos2d有所帮助。有一点要特别提醒一下,当节点执行了一个set开头的方法(即赋值方法)或某种行为时,产生的效果并不仅限于该节点,也包括它的所有子节点,以开头的示例图为例,当节点1执行了setPosition方法后,节点1、2、3、4、5、6都会发生位移,但如果是节点2执行的setPosition,那么只有节点2、4、5会移动,节点1、3、6不会受影响。善用这点的话会使开发更加省力,反之则会给自己增添不少麻烦,所以在设计树的结构时需要动些脑筋(当然作者认为这样还是利大于弊的)。

有了CCNode,自然还要学CCAction,那么下一章我就带大家了解一下这个类,掌握了它们之后,我会写一些例子,以便加深了解。

Cocos2D研究院之CCNode详解(三)的更多相关文章

  1. .NET DLL 保护措施详解(三)最终效果

    针对.NET DLL 保护措施详解所述思路完成最终的实现,以下为程序包下载地址 下载 注意: 运行环境为.net4.0,需要安装VS2015 C++可发行组件包vc_redist.x86.exe.然后 ...

  2. Android 之窗口小部件详解(三)  部分转载

    原文地址:http://blog.csdn.net/iefreer/article/details/4626274. (一) 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget ...

  3. WebSocket安卓客户端实现详解(三)–服务端主动通知

    WebSocket安卓客户端实现详解(三)–服务端主动通知 本篇依旧是接着上一篇继续扩展,还没看过之前博客的小伙伴,这里附上前几篇地址 WebSocket安卓客户端实现详解(一)–连接建立与重连 We ...

  4. logback -- 配置详解 -- 三 -- <encoder>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

  5. python设计模式之装饰器详解(三)

    python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...

  6. Python操作redis字符串(String)详解 (三)

    # -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...

  7. pika详解(三)SelectConnection及其他Connection

    pika详解(三)SelectConnection及其他Connection   本文链接:https://blog.csdn.net/comprel/article/details/94661147 ...

  8. View绘制详解(三),扒一扒View的测量过程

    所有东西都是难者不会,会者不难,Android开发中有很多小伙伴觉得自定义View和事件分发或者Binder机制等是难点,其实不然,如果静下心来花点时间把这几个技术点都研究一遍,你会发现其实这些东西都 ...

  9. Android WebView 开发详解(三)

    转载请注明出处   http://blog.csdn.net/typename/article/details/40302351 powered by miechal zhao 概览 Android ...

随机推荐

  1. 2016 ACM-ICPC Asia China-Final D 二分

    题意:一共有N个冰淇淋球,做一个冰淇淋需要K个球,并且由于稳定性,这K个球还必须满足上下相邻的下面比上面大至少两倍.先给出N个球的质量,问最多能做出多少个冰淇淋? 思路:二分答案并对其检验. 检验标准 ...

  2. SAP(ABAP):STOP,EXIT,CHECK,RETURN,REJECT,CONTINUE

    Stop 命令使用该命令的程序位置INITIALIZATION, AT SELECTION-SCREEN, START-OF-SELECTION和GET 事件中处理说明1. 当在INITIALIZAT ...

  3. Android面试收集录11 Window+Activity+DecorView+ViewRoot之间的关系

    一.职能简介 Activity Activity并不负责视图控制,它只是控制生命周期和处理事件.真正控制视图的是Window.一个Activity包含了一个Window,Window才是真正代表一个窗 ...

  4. 1,Python常用库之一:Numpy

    Numpy支持大量的维度数组和矩阵运算,对数组运算提供了大量的数学函数库! Numpy比Python列表更具优势,其中一个优势便是速度.在对大型数组执行操作时,Numpy的速度比Python列表的速度 ...

  5. Android自定义组件之简单组合

    Android自定义控件有两种,一种是组合.比如一个linearlayout 里面有textview,imageview. 这样的好处是,写一个就可以多处使用. view_image_and_butt ...

  6. 浅析src与href的区别

    src与href的区别 SRC src用于替换当前元素,href用于在当前文档和引用资源之间确立联系. src是source的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置:在请 ...

  7. wget下载https文件,服务器可以虚拟机中不行的问题

    用wget下载一个图片资源(https协议),在服务器上可以,但在本机的虚拟机中卡在下面这里了: [root@localhost ~]# wget 'https://gp1.wac.edgecastc ...

  8. iOS笔记055 - UI总结01

      1.程序启动后的开始动画 程序启动后可以加载一个简单的动画界面来介绍程序或者用户信息. 可以使用一个xib来描述界面.并且如果想在程序加载完成后第一个加载这个xib文件,需要在Appdelegat ...

  9. Linux认知之旅【04 进一步了解目录】!

    一.目录是什么? 二.不得不提的文件系统! 三.绝对路经,相对路径

  10. 爬虫:Scrapy10 - Link Extractors

    Link Extractors 适用于从网页(scrapy.http.Response)中抽取会被 follow 的链接的对象. Scrapy 默认提供 2 种可用的 Link Extractor,但 ...