Cocos2d-x学习笔记(三)CCNode分析

Cocos2d-x学习笔记(三)CCNode分析,第1张

概述Cocos2d-x学习笔记(三)CCNode分析 http://www.voidcn.com/article/p-cpwvnnwx-bcd.html 通过前两份学习笔记,我们不难发现CCScene、CCLayer、CCSprite等一系列元素都是CCNode的子类。 但是CCNode绝对是Cocos2d-x中举足轻重的一个核心,我们可以把它理解为节点。它是一个不能够可视化显示的抽象类,只是用来定义

Cocos2d-x学习笔记(三)CCNode分析
http://www.jb51.cc/article/p-cpwvnnwx-bcd.html
通过前两份学习笔记,我们不难发现CCScene、cclayer、CCSprite等一系列元素都是CCNode的子类。

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

特征

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

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

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

4)每个节点都可以通过runAction执行瞬间动作或延时动作。

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

属性
[cpp] vIEw plaincopyprint?在CODE上查看代码片派生到我的代码片

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轴向上。

总结

以上是内存溢出为你收集整理的Cocos2d-x学习笔记(三)CCNode分析全部内容,希望文章能够帮你解决Cocos2d-x学习笔记(三)CCNode分析所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1067921.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存