加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 16:23:06 所属栏目:百科 来源:网络整理
导读:Cocos2d-x学习笔记(三)CCNode分析 http://www.jb51.cc/article/p-cpwvnnwx-bcd.html 通过前两份学习笔记,我们不难发现CCScene、CCLayer、CCSprite等一系列元素都是CCNode的子类。 但是CCNode绝对是Cocos2d-x中举足轻重的一个核心,我们可以把它理解为节点

Cocos2d-x学习笔记(三)CCNode分析
http://www.52php.cn/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轴向上。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读