您的位置:首页 > 移动开发 > Cocos引擎

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

2014-08-20 17:53 525 查看
原创文章,转载请注明出处:/article/8316758.html

通过前两份学习笔记,我们不难发现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~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: