[cocos2dx]cocos2dx主要类

CCObject

CCObject.h:

#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

节点类CCNode可以说是游戏元素的祖宗了,基本上我们看得到的游戏元素都是以它为原型进行扩展的。像CCScene,CCLayer,CCSprite,CCMenu,CCSpriteBatchNode等等都是从CCNode继承而来。另外如果我们要自定义精灵,那么从CCNode继承也是一个很不错的选择。CCNode直接从CCObject继承而来,有如下几个特点:

  • 可以包含其他CCNode节点,可以进行添加/获取/删除子节点操作。
  • 可以执行周期性的回调任务。
  • 可以执行动作。

一些子类化的节点提供了更为丰富的特性和功能。

属性

 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);
时间: 2024-10-10 17:12:31

[cocos2dx]cocos2dx主要类的相关文章

cocos2dx的CCLabelTTF类使用不同的TTF字库时字体没有变化的问题

windows开发环境下,使用不同的字库文件,创建不同的CCLabelTTF对象时,发现显示字体并没有发生变化.比如: CCLabelTTF *ttf1 = CCLabelTTF::create("cocos2dx", "arial", 24); CCLabelTTF *ttf2 = CCLabelTTF::create("cocos2dx", "xxx", 24); 发现两种字体显示的字体竟然是一样的,这个问题纠结了好久.到

[Cocos2d-x]Cocos2d-x 3.2 学习笔记

获取屏幕大小(Visible) Size visibleSize = Director::getInstance()->getVisibleSize(); Vec2 origin = Director::getInstance()->getVisibleOrigin(); 打印调试(CCLOG) CCLOG("Characters: %c %c", 'a', 65); CCLOG("Decimals: %d %ld", 1977, 650000L); C

Cocos2d-x 自定义按钮类控制精灵攻击----之游戏开发《赵云要格斗》

本篇要讲讲怎么自定义按钮类,并通过这个按钮类的对像来控制精灵的攻击.在看本篇之前最好先看看上一篇 Cocos2d-x虚拟摇杆控制精灵上下左右运动----之游戏开发<赵云要格斗>,要素材和项目代码的把邮箱留下吧,因为这个项目还没弄完,我一直在改. 精灵的攻击也是一个动画,只不过,这个动画只播放一次,相当于在界面上加一个按钮,然后你点一次按钮,精灵就播放一次动画. 一.自定义按钮类 按钮可以用COCOS2D-X自带的,想着方便一点,我就自己封装了一个按钮类ControlButton,在里面添加一个

cocos2dx 导出c++类供lua使用

官方教程传送门 http://www.cocos2d-x.org/docs/manual/framework/native/wiki/how-to-use-bindings-generator/zh ..编辑 ini文件 修改py脚本内容 运行py工具 就可以使用了 目前还不会lua传 函数 给c++ 类 执行 ini文件 [network_srv] # the prefix to be added to the generated functions. You might or might n

[windows+cocos2dx]CCSprite精灵类

序言 回想cocos2dx,之前在mac+Xcode平台学习了一遍cocos2dx,一年时间不接触cocos了.一直在搞Unity3d.如今还是就之前所学温故温故,但不再用Xcode来写.用经常使用的Windows+VS2012做为开发环境来回想cocos2dx.从CCSprite精灵类開始回想起. CCSprite多种创建方式 创建CCSprite精灵类有好多中方式,好多构造函数,这里列举集中创建形式.包含要显示某个部分和缓存帧,2D贴图创建和普通创建等. if ( !CCLayer::ini

【cocos2dx中Node类getParent和getChildByTag()】学习体会

参考http://cn.cocos2d-x.org/doc/cocos2d-x-3.0/d3/d82/classcocos2d_1_1_node.html 其中和child.parent有关的成员函数如下: Children and Parent virtual void  addChild (Node *child) 添加一个子节点到容器内,z-order是0. 更多... virtual void  addChild (Node *child, int localZOrder) 添加一个子节

Cocos2dx项目--动作类游戏内存优化--Spine结构分析1

SPine数据组织 spAtlas:这个是从.atlas文件中解出来的结构,其中包含了纹理 struct spAtlas { spAtlasPage* pages; spAtlasRegion* regions; void* rendererObject; int ref; }; 先不要管,看它的数据组织,spAtlasPage,spAtlasRegion,rendererObject都是什么东西?往下看 struct spAtlasPage { const spAtlas* atlas; co

关于Cocos2d-x中类与类之间调用彼此方法的机制

1.一般情况下都是把需要实例化的对象类的头文件包含到一个GameController.h中,再在GameController.cpp文件里面去使用各种对象类的方法来实现游戏的逻辑. 2.还有的时候会把GameScene.h头文件包含到需要实例化的对象类的头文件中,是为了使用GameScene类中的某个方法 3.还有的时候会把实例化的对象类整个的Class包含到GameController.h中,写法是 class PlaneEnemy;class PlaneHero; 这样的话,在GameCon

Cocos2d-x动画工具类

1.此工具类的目的是为了方便执行动画,使用TexturePackerGUI工具可以导出plist文件和png图片,这里我示例图片叫bxjg.plist和bxjg.png //////////////////////////////////////.h文件 #ifndef _AnimateUtil_H_ #define _AnimateUtil_H_ #include "cocos2d.h" using namespace cocos2d; using namespace std; cl