zoukankan      html  css  js  c++  java
  • Cocos2d-x学习笔记(三)CCNode分析

    原创文章。转载请注明出处: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~
  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    整理任正非思想:团结奋斗 再创华为佳绩-1994
    整理任正非思想:赴美考察散记-1994
    你不能不知道的六种 Python 图像库的图片读取方法总结
    Spring boot 2.0 Actuator 的健康检查
    Springboot启动后只能本地访问,无法通过外部IP访问
    Ironic 的 Rescue 救援模式实现流程
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6985609.html
Copyright © 2011-2022 走看看