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

cocos2d-x节点(CCObject.h)API

2013-12-06 20:52 330 查看
本文来自http://blog.csdn.net/runaying ,引用必须注明出处!


cocos2d-x节点(CCObject.h)API

温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客 Cocos2d-X权威指南笔记

对象引用计数器的使用和比较
///\cocos2d-x-3.0alpha0\cocos2dx\cocoa
//对象引用计数器的使用和比较

#ifndef __CCOBJECT_H__
#define __CCOBJECT_H__

#include "cocoa/CCDataVisitor.h"
#include "ccMacros.h"

#ifdef EMSCRIPTEN
#include <GLES2/gl2.h>
#endif // EMSCRIPTEN

NS_CC_BEGIN

/**
* @addtogroup base_nodes
* @{
*/

class Object;
class Node;

/** 定义如何克隆一个对象的接口 */
class CC_DLL Clonable
{
public:
/** 返回对象的副本 */
virtual Clonable* clone() const = 0;
/**
* @js NA
* @lua NA
*/
virtual ~Clonable() {};

/** 返回对象的副本 .
@过时不再需要建议使用新的 API。使用 clone() 代替
*/
CC_DEPRECATED_ATTRIBUTE Object* copy() const
{
// 使用 "clone" 代替
CC_ASSERT(false);
return nullptr;
}
};

class CC_DLL Object
{
public:
/// 对象的 id, ScriptSupport 需要一个 public _ID
unsigned int        _ID;
/// Lua 饮用 id
int                 _luaID;
protected:
/// 引用计数
unsigned int        _reference;
/// 统计 autorelease 数量
unsigned int        _autoReleaseCount;
public:
/**
* Constructor
*
*创建后对象的引用计数为1
* @js NA
*/
Object();

/**
* @js NA
* @lua NA
*/
virtual ~Object();

/**
* 立即释放所有权.
*
* 这个对象的引用计数减1
*
* 如果引用计数器减少到 0 后这个对象就不存在了
*
* @see retain, autorelease
* @js NA
*/
inline void release()
{
CCASSERT(_reference > 0, "reference count should greater than 0");
--_reference;

if (_reference == 0)
delete this;
}

/**
* 保持所有权
*
*这增加了该对象的引用计数。
*
* @see release, autorelease
* @js NA
*/
inline void retain()
{
CCASSERT(_reference > 0, "reference count should greater than 0");
++_reference;
}

/**
* 不久的某个时候自动释放所有权.
*
* 在当前自动释放池里,减少这个对象的引用计数
*
*  如果引用计数器减少到 0 后这个对象就不存在了
*
* @returns 这个对象自己.
*
* @see AutoreleasePool, retain, release
* @js NA
* @lua NA
*/
Object* autorelease();

/**
* Returns 一个 boolean 值,表示这个对象是否只被饮用了一次
*也就是说,这个对象的引用计数器是否是 1.
*
* @returns 这个对象的引用计数器是否是 1.
* @js NA
*/
bool isSingleReference() const;

/**
* Returns 这个对象的引用计数.
*
* @returns 这个对象的引用计数.
* @js NA
*/
unsigned int retainCount() const;

/**
* Returns 一个 boolean 值,表示这个对象是否和给定对象相等.
*
* @param object    需要比较的对象.
*
* @returns True 如果这个对象和 @p 对象 equal, otherwise false.
* @js NA
* @lua NA
*/
virtual bool isEqual(const Object* object);
/**
* @js NA
* @lua NA
*/
virtual void acceptVisitor(DataVisitor &visitor);
/**
* @js NA
* @lua NA
*/
virtual void update(float dt) {CC_UNUSED_PARAM(dt);};

friend class AutoreleasePool;
};

typedef void (Object::*SEL_SCHEDULE)(float);
typedef void (Object::*SEL_CallFunc)();
typedef void (Object::*SEL_CallFuncN)(Node*);
typedef void (Object::*SEL_CallFuncND)(Node*, void*);
typedef void (Object::*SEL_CallFuncO)(Object*);
typedef void (Object::*SEL_MenuHandler)(Object*);
typedef int (Object::*SEL_Compare)(Object*);

#define schedule_selector(_SELECTOR) static_cast<cocos2d::SEL_SCHEDULE>(&_SELECTOR)
#define callfunc_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFunc>(&_SELECTOR)
#define callfuncN_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncN>(&_SELECTOR)
#define callfuncND_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncND>(&_SELECTOR)
#define callfuncO_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncO>(&_SELECTOR)
#define menu_selector(_SELECTOR) static_cast<cocos2d::SEL_MenuHandler>(&_SELECTOR)
#define event_selector(_SELECTOR) static_cast<cocos2d::SEL_EventHandler>(&_SELECTOR)
#define compare_selector(_SELECTOR) static_cast<cocos2d::SEL_Compare>(&_SELECTOR)

// 新的 callbacks 基于 C++11
#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)

// end of base_nodes group
/// @}

NS_CC_END

#endif // __CCOBJECT_H__
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: