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分析所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)