这一篇博客我主要想分析CCNode的坐标转换相关的底层实现,其他功能只做大概的介绍,先给出头文件的代码分析: #include "ccMacros.h" #include "cocoa/CCAffineTransform.h" #include "cocoa/CCArray.h" #include "CCGL.h" #include "shaders/ccGLStateCache.h" #include "shaders/CCGLProgram.h" #include "kazmath/kazmath.h" #include "script_support/CCScriptSupport.h" #include "CCProtocols.h" NS_CC_BEGIN class CCCamera; class CCGridBase; class CCPoint; class CCTouch; class CCAction; class CCRGBAProtocol; class CCLabelProtocol; class CCScheduler; class CCActionManager; class CCDictionary; //2dx 2.1.4新出来的东西 class CCComponent; class CCComponentContainer; enum { //CCNode tag的默认值 kCCNodeTagInvalid = -1, }; /** CCNode能够产生的5个事件,如果有脚本回调将通知给对应的脚本 */ enum { kCCNodeOnEnter, //节点准备进入runningScene子节点 kCCNodeOnExit, //节点已经退出runningScene子节点 kCCNodeOnEnterTransitionDidFinish, //节点已经进入runningScene子节点 kCCNodeOnExitTransitionDidStart, //节点准备退出runningScene子节点 kCCNodeOnCleanup //Stops all running actions and schedulers }; /** 为了方便阅读我按照功能模块来划分将相关代码换了次序 */ class CC_DLL CCNode : public CCObject { protected: /** 父子节点关系 */ bool m_bVisible; ///< is this node visible int m_nZOrder; ///< z-order value that affects the draw order bool m_bReorderChildDirty; ///< children order dirty flag CCArray* m_pChildren; ///< array of children nodes CCNode* m_pParent; ///< weak reference to parent node int m_nTag; ///< a tag. Can be any number you assigned just to identify this node unsigned int m_uOrderOfArrival; ///< used to preserve sequence while sorting children with the same zOrder bool m_bRunning; ///< is running /** 节点位置信息(与坐标转换相关的) */ float m_fRotationX; float m_fRotationY; float m_fScaleX; float m_fScaleY; CCPoint m_obPosition; float m_fSkewX; float m_fSkewY; CCPoint m_obAnchorPointInPoints;//只读 CCPoint m_obAnchorPoint; bool m_bIgnoreAnchorPointForPosition; CCSize m_obContentSize; //转换矩阵 CCAffineTransform m_sAdditionalTransform; //为什么需要新增这个转换矩阵看对应的函数注释 CCAffineTransform m_sTransform; //node to parent transform CCAffineTransform m_sInverse; //inverse matrix of node to parent transform bool m_bTransformDirty; ///< transform dirty flag bool m_bInverseDirty; ///< transform dirty flag bool m_bAdditionalTransformDirty; ///< The flag to check whether the additional transform is dirty CCCamera *m_pCamera; ///< a camera CCGridBase *m_pGrid; ///< a grid /** 渲染相关 */ CCGLProgram *m_pShaderProgram; ///< OpenGL shader ccGLServerState m_eGLServerState; ///< OpenGL servier side state(这个state貌似这个版本没什么用了) /** 计时器与action的支持 */ CCScheduler* m_pScheduler; ///< scheduler used to schedule timers and updates CCActionManager*m_pActionManager; ///< a pointer to ActionManager singleton, which is used to handle all the actions /** 相关事件脚本回调 */ int m_nScriptHandler; ///< script handler for onEnter() & onExit(), used in Javascript binding and Lua binding. int m_nUpdateScriptHandler;///< script handler for update() callback per frame, which is invoked from lua & javascript. ccScriptType m_eScriptType;///< type of script binding, lua or javascript /** 自定义数据存储 */ void *m_pUserData; ///< A user assingned void pointer, Can be point to any cpp object CCObject *m_pUserObject; ///< A user assigned CCObject CCComponentContainer *m_pComponentContainer; ///< Dictionary of components /** OpenGL real Z vertex */ float m_fVertexZ; public: CCNode(void); virtual ~CCNode(void); virtual bool init(); static CCNode * create(void); const char* description(void); /** 父子节点之间关系 */ //改变zorder如果有父节点,则根据新的zorder排序 virtual void setZOrder(int zOrder); //只改变zorder virtual void _setZOrder(int z); virtual int getZOrder(); //CCNode的id标识符 virtual int getTag() const; virtual void setTag(int nTag); //可见性,如果不可见该节点以及子节点将不会被visit virtual void setVisible(bool visible); virtual bool isVisible(); //以下函数无需纠结 virtual void addChild(CCNode * child); virtual void addChild(CCNode * child, int zOrder); virtual void addChild(CCNode* child, int zOrder, int tag); CCNode * getChildByTag(int tag); virtual CCArray* getChildren(); unsigned int getChildrenCount(void) const; virtual void setParent(CCNode* parent);//