原创文章。转载请注明出处:http://blog.csdn.net/sfh366958228/article/details/38706483

通过前两份学习笔记,我们不难发现CCScene、CCLayer、CCSprite等一系列元素都是CCNode的子类。

可是CCNode绝对是Cocos2d-x中举足轻重的一个核心,我们可以把它理解为节点。它是一个不可以可视化显示的抽象类,仅仅是用来定义全部节点的公共属性和方法的。

特征

1)每一个节点都能够通过addChild方法包括其它节点作为子节点,也能够通过removeChild来移除子节点。CCNode就像是一棵自由的树。

2)每一个子节点都能够通过setTag来设置标记,通过getChildByTag来获取该子节点。

3)每一个节点都能够运行计划任务,在Cocos2d-x的系统循环中处理这些任务。

4)每一个节点都能够通过runAction运行瞬间动作或延时动作。

5)每一个节点加入到场景中,当所在场景为激活场景时,这个节点的画图方法就会被自己主动调用完毕自我绘制。

属性

class CC_DLL CCNode : public CCObject
{
public:
CCNode(void);
virtual ~CCNode(void); // 初始化节点
virtual bool init(); // 创建一个节点对象
static CCNode * create(void); // 获取一个描写叙述字符串。便于调试
const char* description(void); /**
* 设置/获取Z轴坐标
*
* zOrder独立于绘制顺序,它只不过记录node在它父类以及相关兄弟之间的排序,其顺序是相对于其父类的子类而言。跟OpenGl的Z vertex没有关系
* 默认的Z vertex=0.它只影响nodes的绘制顺序,数字越大,绘制越靠后
*/
virtual void setZOrder(int zOrder);
virtual int getZOrder(); //设置Z轴坐标,与setZOrder的差别是,setZOrder先设置m_nZOrder,然后会又一次录入父类的自节点数组
virtual void _setZOrder(int z); // 设置/获取OpenGL真实Z轴坐标
virtual void setVertexZ(float vertexZ);
virtual float getVertexZ(); // 设置/获取X轴缩放系数
virtual void setScaleX(float fScaleX);
virtual float getScaleX(); // 设置/获取Y轴缩放系数
virtual void setScaleY(float fScaleY);
virtual float getScaleY(); // 设置/获取缩放系数
virtual void setScale(float scale);
virtual float getScale(); // 设置缩放系数
virtual void setScale(float fScaleX,float fScaleY); // 设置/获取节点坐标
virtual void setPosition(const CCPoint &position);
virtual const CCPoint& getPosition(); // 设置节点坐标
virtual void setPosition(float x, float y); // 获取节点坐标至传參
virtual void getPosition(float* x, float* y); // 设置/获取X轴Y轴坐标,这些方法用在与Lua、Javascript绑定
virtual void setPositionX(float x);
virtual float getPositionX(void);
virtual void setPositionY(float y);
virtual float getPositionY(void); // 设置/获取X轴扭曲角度
virtual void setSkewX(float fSkewX);
virtual float getSkewX(); // 设置/获取Y轴扭曲角度
virtual void setSkewY(float fSkewY);
virtual float getSkewY(); // 设置/获取锚点
virtual void setAnchorPoint(const CCPoint& anchorPoint);
virtual const CCPoint& getAnchorPoint(); // 获取详细锚点在当前节点坐标系中的详细坐标,正常锚点是以0-1为范围的比例
virtual const CCPoint& getAnchorPointInPoints(); // 设置/获取节点大小
virtual void setContentSize(const CCSize& contentSize);
virtual const CCSize& getContentSize() const; // 设置/获取节点可见性
virtual void setVisible(bool visible);
virtual bool isVisible(); // 设置/获取节点旋转角度
virtual void setRotation(float fRotation);
virtual float getRotation(); // 设置/获取节点X轴旋转角度
virtual void setRotationX(float fRotaionX);
virtual float getRotationX(); // 设置/获取节点Y轴旋转角度
virtual void setRotationY(float fRotationY);
virtual float getRotationY(); /**
* 设置/获取arrival order
*
* 一个节点调用addChild后将得到一个更大的arrival order,
* 假设两个子节点有同样的Z order,那么arrival order大的将后绘制
*/
virtual void setOrderOfArrival(unsigned int uOrderOfArrival);
virtual unsigned int getOrderOfArrival(); // 设置/获取OpenGL服务端状态
virtual void setGLServerState(ccGLServerState glServerState);
virtual ccGLServerState getGLServerState(); /**
* 设置/获取当你设置节点坐标位置的时候,锚点是否视作(0, 0)
*
* 当设置为true的时候。锚点还是(0.5,0.5),可是此时是通过起始点(0,0)来定位的
* 而设置为false的时候,是通过锚点定位(0.5,0.5)
* 假设为true的时候,尽管定位是通过起始点(0,0)来起作用的
* 可是对于scale,还是通过锚点来放大缩小
*/
virtual void ignoreAnchorPointForPosition(bool ignore);
virtual bool isIgnoreAnchorPointForPosition(); // 加入子节点
virtual void addChild(CCNode * child); // 加入子节点,同一时候设置子节点Z轴坐标
virtual void addChild(CCNode * child, int zOrder); // 加入子节点。同一时候设置子节点Z轴坐标及子节点Tag标签
virtual void addChild(CCNode* child, int zOrder, int tag); // 通过Tag获取子节点
virtual CCNode * getChildByTag(int tag); // 获取当前节点全部子节点
virtual CCArray* getChildren(); // 获取当前子节点数量
virtual unsigned int getChildrenCount(void) const; // 设置/获取当前节点父节点
virtual void setParent(CCNode* parent);
virtual CCNode* getParent(); // 将当前节点从父节点中移除
virtual void removeFromParent(); // 移除此节点于父类中,而且清除本节点,当cleanup为true的时候。会将action停止,包含子类的action也一并停止
virtual void removeFromParentAndCleanup(bool cleanup); // 移除子节点
virtual void removeChild(CCNode* child); // 移除子节点。并设置是否清除本节点
virtual void removeChild(CCNode* child, bool cleanup); // 通过Tag移除子节点
virtual void removeChildByTag(int tag); // 通过Tag移除子节点。并设置是否清除本节点
virtual void removeChildByTag(int tag, bool cleanup); // 移除全部子节点
virtual void removeAllChildren(); // 移除全部子节点,并设置是否清楚本节点
virtual void removeAllChildrenWithCleanup(bool cleanup); // 又一次设置某个子节点的Z轴坐标
virtual void reorderChild(CCNode * child, int zOrder); // 给全部子节点排序
virtual void sortAllChildren(); // 获取/设置网格对象
virtual CCGridBase* getGrid();
virtual void setGrid(CCGridBase *pGrid); // 获取/设置Tag标识
virtual int getTag() const;
virtual void setTag(int nTag); // 获取/设置用户数据。能够放进指针,数据块,结构体,对象等,注意要release
virtual void* getUserData();
virtual void setUserData(void *pUserData); // 获取/设置用户数据对象。能够放CCObject数据,加进来的CCObject须要release
virtual CCObject* getUserObject();
virtual void setUserObject(CCObject *pUserObject); /**
* 引擎提供了CCGLProgram类来处理着色器相关操作,对当前画图程序进行了封装。
* 当中使用频率最高的应该是获取着色器程序的接口:const GLuint getProgram();
* 该接口返回了当前着色器程序的标识符。 后面将会看到,在操作OpenGL的时候,我们经常须要针对不同的着色器程序作设置。
* 注意,这里返回的是一个无符号整型的标识符,而不是一个指针或结构引用。这是OpenGL接口的一个风格。
* 对象(纹理、着色器程序或其它非标准类型)都是使用整型标识符来表示的。 */
virtual CCGLProgram* getShaderProgram();
virtual void setShaderProgram(CCGLProgram *pShaderProgram); // 获取摄像机对象
virtual CCCamera* getCamera(); // 获取当前节点是否在运行
virtual bool isRunning(); // 注冊/取消注冊脚本Handle
virtual void registerScriptHandler(int handler);
virtual void unregisterScriptHandler(void); //获取脚本Handle
inline int getScriptHandler() { return m_nScriptHandler; }; // 依据优先级更新Handle(Lua调用)
void scheduleUpdateWithPriorityLua(int nHandler, int priority); // 当节点进入时调用
virtual void onEnter(); // 当节点进入动画结束时调用
virtual void onEnterTransitionDidFinish(); // 当节点退出入时调用
virtual void onExit(); // 当节点退出动画结束时调用
virtual void onExitTransitionDidStart(); // 停止全部运行的动画及调度
virtual void cleanup(void); // 重构这种方法能够绘制自己的节点
virtual void draw(void); // 递归遍历当前节点树
virtual void visit(void); // 获取经过缩放和旋转之后的外框盒大小
virtual CCRect boundingBox(void); /**
* 设置/获取当前节点的一个ActionManager
*
* 当加入CCActionManager的时候,原先的action都将停止
* 初始化node时候CCActionManager是通过director->getActionManager()初始化的
* 当然m_pActionManager也retain()了,所以runAction中的一切action都是当前node的m_pActionManager管理的
*/
virtual void setActionManager(CCActionManager* actionManager);
virtual CCActionManager* getActionManager(); // 运行Action
CCAction* runAction(CCAction* action); // 停止全部Action
void stopAllActions(void); // 停止指定Action
void stopAction(CCAction* action); // 通过Tag停止/获取Action
void stopActionByTag(int tag);
CCAction* getActionByTag(int tag); // 获取正在运行的动作的总数
unsigned int numberOfRunningActions(void); // 设置/获取任务
virtual void setScheduler(CCScheduler* scheduler);
virtual CCScheduler* getScheduler(); // 是否正在运行该计划
bool isScheduled(SEL_SCHEDULE selector); // 计划更新方法
void scheduleUpdate(void); // 依据优先级更新Handle
void scheduleUpdateWithPriority(int priority); // 取消更新计划
void unscheduleUpdate(void); /**
* 运行某个任务
*
* @param interval 触发间隔。0为每帧都触发,假设interval = 0,推荐使用scheduleUpdate()取代
* @param repeat 反复次数
* @param delay 延迟启动时间
* @lua NA
*/
void schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay);
void schedule(SEL_SCHEDULE selector, float interval);
void schedule(SEL_SCHEDULE selector); // 运行任务单次
void scheduleOnce(SEL_SCHEDULE selector, float delay); // 取消任务
void unschedule(SEL_SCHEDULE selector); // 取消全部任务
void unscheduleAllSelectors(void); // 恢复/暂停节点的动作和任务
void resumeSchedulerAndActions(void);
void pauseSchedulerAndActions(void); // 当scheduleUpdate被调用,而且节点为活动状态时。这种方法将在每帧自己主动调用
virtual void update(float delta); /**
* Performs OpenGL view-matrix transformation based on position, scale, rotation and other attributes.
*/
void transform(void); /**
* Performs OpenGL view-matrix transformation of it's ancestors.
* Generally the ancestors are already transformed, but in certain cases (eg: attaching a FBO)
* It's necessary to transform the ancestors again.
*/
void transformAncestors(void); /**
* Calls children's updateTransform() method recursively.
*
* This method is moved from CCSprite, so it's no longer specific to CCSprite.
* As the result, you apply CCSpriteBatchNode's optimization on your customed CCNode.
* e.g., batchNode->addChild(myCustomNode), while you can only addChild(sprite) before.
*/
virtual void updateTransform(void); /**
* Returns the matrix that transform the node's (local) space coordinates into the parent's space coordinates.
* The matrix is in Pixels.
*/
virtual CCAffineTransform nodeToParentTransform(void); /**
* Returns the matrix that transform parent's space coordinates to the node's (local) space coordinates.
* The matrix is in Pixels.
*/
virtual CCAffineTransform parentToNodeTransform(void); /**
* Returns the world affine transform matrix. The matrix is in Pixels.
*/
virtual CCAffineTransform nodeToWorldTransform(void); /**
* Returns the inverse world affine transform matrix. The matrix is in Pixels.
*/
virtual CCAffineTransform worldToNodeTransform(void); /**
* Converts a Point to node (local) space coordinates. The result is in Points.
*/
CCPoint convertToNodeSpace(const CCPoint& worldPoint); /**
* Converts a Point to world space coordinates. The result is in Points.
*/
CCPoint convertToWorldSpace(const CCPoint& nodePoint); /**
* Converts a Point to node (local) space coordinates. The result is in Points.
* treating the returned/received node point as anchor relative.
*/
CCPoint convertToNodeSpaceAR(const CCPoint& worldPoint); /**
* Converts a local Point to world space coordinates.The result is in Points.
* treating the returned/received node point as anchor relative.
*/
CCPoint convertToWorldSpaceAR(const CCPoint& nodePoint); /**
* convenience methods which take a CCTouch instead of CCPoint
*/
CCPoint convertTouchToNodeSpace(CCTouch * touch); /**
* converts a CCTouch (world coordinates) into a local coordinate. This method is AR (Anchor Relative).
*/
CCPoint convertTouchToNodeSpaceAR(CCTouch * touch); /**
* Sets the additional transform.
*/
void setAdditionalTransform(const CCAffineTransform& additionalTransform); // 获取组件
CCComponent* getComponent(const char *pName) const; // 加入组件
virtual bool addComponent(CCComponent *pComponent); // 通过名字移除组件
virtual bool removeComponent(const char *pName); // 通过指针移除组件
virtual bool removeComponent(CCComponent *pComponent); // 移除全部组件
virtual void removeAllComponents();
}

以上方法为CCNode中的提供。在public块中的方法主要由下面几个部分:

1)针对节点显示的属性信息读写

2)针对节点变化的属性信息读写

3)针对子节点管理的相关方法

4)针对节点数据绑定的相关方法

5)针对节点生命周期的相关方法

6)针对节点处理动作CCAction的相关方法

7)针对节点定时任务的相关方法

8)针对节点坐标变换的相关方法

结言

在CCNode中的节点都有自己的坐标系,成为节点坐标系,当节点坐标系变换后该节点的全部子节点都会随之变换。

节点加入到场景时会參考节点的锚点,锚点默认定义为该节点的中心。在贴图时会以锚点为中心,改变锚点并没有改变节点的位置,仅仅是改变了贴图的位置。

Cocos2d-x的世界坐标系和openGL的坐标系一致,都是一左下角为0,0点,X轴向右。y轴向上。


好了,本节就到这了。下一节将学习CCScene~

Cocos2d-x学习笔记(三)CCNode分析的更多相关文章

  1. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  2. Java IO学习笔记三:MMAP与RandomAccessFile

    作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...

  3. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  4. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

  5. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  6. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  7. UML和模式应用学习笔记-1(面向对象分析和设计)

    UML和模式应用学习笔记-1(面向对象分析和设计) 而只是对情节的记录:此处的用例场景为:游戏者请求掷骰子.系统展示结果:如果骰子的总点数是7,则游戏者赢得游戏,否则为输 (2)定义领域模型:在领域模 ...

  8. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  9. NumPy学习笔记 三 股票价格

    NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...

  10. Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

随机推荐

  1. 客户端运行gpupdate /force,后提示原因是缺少到域控制器的网络连接

    问题: C:\Users\wb>gpupdate /force正在更新策略... 用户策略更新成功完成.无法成功更新计算机策略.遇到下列错误: 处理组策略失败,原因是缺少到域控制器的网络连接.这 ...

  2. Felx之菜单导航

    Felx之菜单导航 环境搭建:MyEclipse 6.5+Flex Builder 3 Plug-in <?xml version="1.0" encoding=" ...

  3. 网络场景图WebScene介绍

    网络场景图的创建同样需要ID,然后再放入3维的地图底图中. 1.创建一个新的网络场景图 "esri/WebScene" var scene = new WebScene({ por ...

  4. 【Nginx从入门到实战】

    目录 1. 网站服务 2. 所谓Nginx 3. 安装Nginx 4. Nginx配置文件详述 5. 开始玩转Nginx Nginx虚拟主机 Nginx状态信息(status)配置 Nginx错误页面 ...

  5. AVEVA RVM to 3D PDF

    AVEVA RVM to 3D PDF eryar@163.com RvmTranslator 3D PDF plugin can convert PDMS RVM files to 3D PDF w ...

  6. Mysql主从级联复制

    场景1 如果主节点已经运行了一段时间,且有大量数据时,如何配置并启动slave节点 通过备份恢复数据至从服务器· 复制起始位置为备份时,二进制日志文件及其POS: Mater 设置 1) 修改配置文件 ...

  7. vuejs模板中使用html代码

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. KnockOut下的离开检测

    <input type="text" class="form-control" data-bind="event:{ blur:$root.ch ...

  9. 【Uva 1543】Telescope

    [Link]: [Description] 给你一个圆和圆周上的n(3≤n≤40)个不同点.请选择其中的m(3≤m≤n)个,按照在圆 周上的顺序连成一个m边形,使得它的面积最大. [Solution] ...

  10. Centos6.4安装opennebula

    Centos6.4安装opennebula #安装163源 http://mirrors.163.com/.help/CentOS6-Base-163.repo #安装epel源 wget http: ...