标签:
#ifndef __CCOBJECT_H__ #define __CCOBJECT_H__ #include "platform/CCPlatformMacros.h" //Cocos2d命名空间 NS_CC_BEGIN //声明以下几种类,在后面会定义相应类的成员变量的指针。以下几个类均是CCObject类的派生类。 class CCZone; //CCObject指针暂存类 class CCObject;//基类 class CCNode; //结点类 class CCEvent; //事件类 //这里定义了一个拷贝类 class CC_DLL CCCopying { public: //虚函数。功能是为CCZone指针所指向的对象复制一份新的CCObject对象指针 virtual CCObject* copyWithZone(CCZone* pZone); }; //由CCCopying派生出CCObject class CC_DLL CCObject : public CCCopying { public: // 唯一ID unsigned int m_uID; // 在LUA脚本引擎中的访问标识ID.暂可不理会,待学习到LUA时再分析 int m_nLuaID; protected: // 引用计数器,进行内存计数。 unsigned int m_uReference; // 是否是被内存管理器进行托管而自动进行释放。 bool m_bManaged; public: //构造函数 CCObject(void); //析构函数 virtual ~CCObject(void); //释放 void release(void); //保留 void retain(void); //设置实例对象的释放由内存管理器进行管理。实现自动释放。 CCObject* autorelease(void); //取得一个拷贝 CCObject* copy(void); //本类的实例化对象是否只有一个使用者 bool isSingleRefrence(void); //返回内存计数器的值,也就是取得使用者的个数 unsigned int retainCount(void); //判断是否与另一个CCObject实例对象相同 virtual bool isEqual(const CCObject* pObject); //更新函数 virtual void update(ccTime dt) {CC_UNUSED_PARAM(dt);}; //设定CAutoreleasePool为友元类,这是一个通过CCObject指针容器CCMutableArray来对CCObject实例对象的内存进行管理的类,CCMutableArray在加入CCObject时对其引用计数器加1,在移除CCObject时对其引用计数器减1。 friend class CCAutoreleasePool; }; //定义一些函数 //定义定时器访问类成员函数 typedef void (CCObject::*SEL_SCHEDULE)(ccTime); //定义普通回调类成员函数 typedef void (CCObject::*SEL_CallFunc)(); //定义带结点参数的回调类成函数 typedef void (CCObject::*SEL_CallFuncN)(CCNode*); //定义带结点参数及1个用户值参数的回调类成员函数 typedef void (CCObject::*SEL_CallFuncND)(CCNode*, void*); typedef void (CCObject::*SEL_CallFuncO)(CCObject*); //定义菜单响应类成员函数 typedef void (CCObject::*SEL_MenuHandler)(CCObject*); //定义事件响应类成员函数 typedef void (CCObject::*SEL_EventHandler)(CCEvent*); //定义一些宏来取得这些回调成员函数的指针。 #define schedule_selector(_SELECTOR) (SEL_SCHEDULE)(&_SELECTOR) #define callfunc_selector(_SELECTOR) (SEL_CallFunc)(&_SELECTOR) #define callfuncN_selector(_SELECTOR) (SEL_CallFuncN)(&_SELECTOR) #define callfuncND_selector(_SELECTOR) (SEL_CallFuncND)(&_SELECTOR) #define callfuncO_selector(_SELECTOR) (SEL_CallFuncO)(&_SELECTOR) #define menu_selector(_SELECTOR) (SEL_MenuHandler)(&_SELECTOR) #define event_selector(_SELECTOR) (SEL_EventHandler)(&_SELECTOR) #define compare_selector(_SELECTOR) (SEL_Compare)(&_SELECTOR) NC_CC_END #endif // __CCOBJECT_H_CCObject.cpp:
#include "CCObject.h" //内存管理器头文件 #include "CCAutoreleasePool.h" //Cocos2d-x定义的一些宏的头文件 #include "ccMacros.h" //加入脚本支持 #include "scripte_support/CCScriptSupport.h" NS_CC_BEGIN //虚函数。这里简单处理一下。需要进行重载 CCObject* CCCopying::copyWithZone(CCZone *pZone) { CC_UNUSED_PARAM(pZone); //如果不进行重载,则会提示没有重载实现函数功能。 CCAssert(0, "not implement"); return 0; } //构造 CCObject::CCObject(void) { //定义一个静态UINT类型变量做为实例对象计数器,此值只会增长,不会减少,保证唯一。 static unsigned int uObjectCount = 0; //将计数器加1后赋值给唯一ID。 //注意:所有由此CCObject类派生的子类也会拥有这个唯一的ID。它可以使我们通过唯一ID来获取相应的实例对象。 m_uID = ++uObjectCount; //脚本ID m_nLuaID = 0; // 当类进行实例化时,将m_uReference设为1 m_uReference = 1; //初始化时设实例化对象由用户进行内存管理。如果new出一个对象,需要自行delete。 m_bManaged = false; } //析构 CCObject::~CCObject(void) { 如果内存是由内存管理器统一管理,则调用内存管理器实例对象的移除函数对自已的内存进行释放。 if (m_bManaged) { CCPoolManager::getInstance()->removeObject(this); } //如果有使用到LUA脚本,调用脚本引擎的实例对象的移除函数将本身从脚本引擎的实例对象中移除。 if (m_nLuaID) { CCScriptEngineManager::sharedManager()->getScriptEngine()->removeCCObjectByID(m_nLuaID); } } //返回一个本类实例化对象的拷贝 CCObject* CCObject::copy() { return copyWithZone(0); } //供使用者外部调用的释放函数 void CCObject::release(void) { //先确保计数器是大于0的数值,说明正常有效 CCAssert(m_uReference > 0, "reference count should greater than 0"); //计数器减1 --m_uReference; //如果计数器减为0,释放本类实例化对象占用的内存 if (m_uReference == 0) { delete this; } } //使用者外部调用的,使用一次时更新计数器。 void CCObject::retain(void) { CCAssert(m_uReference > 0, "reference count should greater than 0"); ++m_uReference; } //设置当前类的实例化对象的内存管理交给内存管理器去管理,不手动进行内存计数器的处理。 CCObject* CCObject::autorelease(void) { //调用内存管理器实例对象的addObject函数加入当前CCObject实例对象的指针 CCPoolManager::getInstance()->addObject(this); //打开使用内存管理器的标记 m_bManaged = true; return this; } //是否当前类的实例化对象只被一个使用者使用 bool CCObject::isSingleRefrence(void) { //计数器的个数即代表使用者的个数,因为一个使用者使用一次,计数器加1 return m_uReference == 1; } //返回当前类的实例化对象的使用者的个数 unsigned int CCObject::retainCount(void) { return m_uReference; } //是否与另一个基类为CCObject的实例化对象是同一个对象 bool CCObject::isEqual(const CCObject *pObject) { return this == pObject; } NS_CC_END
CCObject作为cocos2dx中大部分类的父类,提供了内存管理功能;为脚本提供对象ID管理;序列化接口;
节点类CCNode可以说是游戏元素的祖宗了,基本上我们看得到的游戏元素都是以它为原型进行扩展的。像CCScene,CCLayer,CCSprite,CCMenu,CCSpriteBatchNode等等都是从CCNode继承而来。另外如果我们要自定义精灵,那么从CCNode继承也是一个很不错的选择。CCNode直接从CCObject继承而来,有如下几个特点:
一些子类化的节点提供了更为丰富的特性和功能。
Features of CCNode: - position //位置,默认(0,0) - scale (x, y) //缩放,默认(1,1) - rotation (in degrees, clockwise) //旋转,默认为0 - skew //倾斜,默认为0 - CCCamera (an interface to gluLookAt ) //CCCamera,视点转换,每个节点都有,默认指向节点中心 - CCGridBase (to do mesh transformations) //CCGridBase,网类转变 - anchor point //锚点,默认(0,0) - size //尺寸,默认(0,0) - visible //可见 - z-order //z轴值 - openGL z position //OpenGL z值
//初始化函数,成功返回true virtual bool init(); //分配内存空间,调用init并添加autoRelease标记 static CCNode * create(void); //返回描述字符串 const char* description(void);
//设置/获取Z轴顺序,Z轴大的覆盖Z轴小的 virtual void setZOrder(int zOrder); virtual void _setZOrder(int z); virtual int getZOrder(); //设置/获取OpenGL Z轴顶点 virtual void setVertexZ(float vertexZ); virtual float getVertexZ(); //设置/获取缩放值 virtual void setScaleX(float fScaleX); virtual float getScaleX(); 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); virtual void setPositionX(float x); virtual float getPositionX(void); virtual void setPositionY(float y); virtual float getPositionY(void); //设置/获取倾斜角度 virtual void setSkewX(float fSkewX); virtual float getSkewX(); virtual void setSkewY(float fSkewY); virtual float getSkewY(); //设置/获取锚点 virtual void setAnchorPoint(const CCPoint& anchorPoint); virtual const CCPoint& getAnchorPoint(); 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(); virtual void setRotationX(float fRotaionX); virtual float getRotationX(); virtual void setRotationY(float fRotationY); virtual float getRotationY();
//添加/获取子节点,可以带Z轴顺序(默认为0)和标签 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); virtual CCNode* getParent(); //从父节点中移除自身,默认cleanup为true virtual void removeFromParent(); virtual void removeFromParentAndCleanup(bool cleanup); //移除子节点 virtual void removeChild(CCNode* child); virtual void removeChild(CCNode* child, bool cleanup); virtual void removeChildByTag(int tag); virtual void removeChildByTag(int tag, bool cleanup); //移除所有节点 virtual void removeAllChildren(); virtual void removeAllChildrenWithCleanup(bool cleanup); //重新设置节点顺序 virtual void reorderChild(CCNode * child, int zOrder);
//设置/获取tag virtual int getTag() const; virtual void setTag(int nTag); //设置/获取userdata,它是一个指针可以指向你想要的任意数据块,不过记得要释放 virtual void* getUserData(); virtual void setUserData(void *pUserData); //设置/获取CCObject,和上面一样,只是数据换成了CCObject对象 virtual CCObject* getUserObject(); virtual void setUserObject(CCObject *pUserObject);
//事件回调 //节点开始进入触发 virtual void onEnter(); //节点完成进入触发 virtual void onEnterTransitionDidFinish(); //节点退出触发 virtual void onExit(); //如果节点退出有过渡动画,动画开始时触发 virtual void onExitTransitionDidStart(); //停止动画和调度器 virtual void cleanup(void);
//获取/设置动作管理器 virtual void setActionManager(CCActionManager* actionManager); virtual CCActionManager* getActionManager(); //运行动作 CCAction* runAction(CCAction* action); //停止动作 void stopAllActions(void); void stopAction(CCAction* 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); //开启update调度 void scheduleUpdate(void); //设置调度优先级 void scheduleUpdateWithPriority(int priority); //关闭update调度器 void unscheduleUpdate(void); //开启/关闭/恢复/暂停调度器 void schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay); void schedule(SEL_SCHEDULE selector, float interval); void scheduleOnce(SEL_SCHEDULE selector, float delay); void schedule(SEL_SCHEDULE selector); void unschedule(SEL_SCHEDULE selector); void unscheduleAllSelectors(void); void resumeSchedulerAndActions(void); void pauseSchedulerAndActions(void); //每帧调用函数 virtual void update(float delta);
//坐标转换相关,这一部分后面再介绍 CCPoint convertToNodeSpace(const CCPoint& worldPoint); CCPoint convertToWorldSpace(const CCPoint& nodePoint); CCPoint convertToNodeSpaceAR(const CCPoint& worldPoint); CCPoint convertToWorldSpaceAR(const CCPoint& nodePoint); CCPoint convertTouchToNodeSpace(CCTouch * touch); CCPoint convertTouchToNodeSpaceAR(CCTouch * touch);
//获取/设置着色程序 virtual CCGLProgram* getShaderProgram(); virtual void setShaderProgram(CCGLProgram *pShaderProgram); //获取CCCamera对象 virtual CCCamera* getCamera(); //节点是否在运行 virtual bool isRunning(); //绘制节点 virtual void draw(void); //递归访问节点 virtual void visit(void); //返回所占矩形,节点坐标系 CCRect boundingBox(void);
标签:
原文地址:http://blog.csdn.net/shimazhuge/article/details/45287361