CCAssert(cond ,msg);
断言表达式cond为真 ,如果cond不为真的话就打印msg的信息
遍历Array Dictionary 的宏
// 可以通过源代码分析到这个宏的意思就是遍历Array
#define CCARRAY_FOREACH(__array__, __object__) \
if ((__array__) && (__array__)->data->num > 0) \
for(Ref** __arr__ = (__array__)->data->arr, **__end__ = (__array__)->data->arr + (__array__)->data->num-1; \
__arr__ <= __end__ && (((__object__) = *__arr__) != NULL/* || true*/); \
__arr__++)
// 这个是逆序遍历
#define CCARRAY_FOREACH_REVERSE(__array__, __object__) \
if ((__array__) && (__array__)->data->num > 0) \
for(Ref** __arr__ = (__array__)->data->arr + (__array__)->data->num-1, **__end__ = (__array__)->data->arr; \
__arr__ >= __end__ && (((__object__) = *__arr__) != NULL/* || true*/); \
__arr__--)
//具体的使用如下但是还需对得到的元素进行强制转换
CCArray* _array;
CCObject* _object; // 用来遍历数组的临时变量
CCARRAY_FOREACH(_array, _object) // 正向遍历
{
CCSprite* _bullet = (CCSprite*)_object;
// todo with _bullet....
}
<span><span class="comment">//遍历一个array 并且使其中的元素执行方法</span></span>
#define arrayMakeObjectsPerformSelector(pArray, func, elementType) \
do { \
if(pArray && pArray->count() > 0) \
{ \
Ref* child; \
CCARRAY_FOREACH(pArray, child) \
{ \
elementType pNode = static_cast<elementType>(child); \
if(pNode) \
{ \
pNode->func(); \
} \
} \
} \
} \
while(false)
//遍历array 并且执行一个传参数的方法
#define arrayMakeObjectsPerformSelectorWithObject(pArray, func, object, elementType) \
do { \
if(pArray && pArray->count() > 0) \
{ \
Ref* child; \
CCARRAY_FOREACH(pArray, child) \
{ \
elementType pNode = static_cast<elementType>(child); \
if(pNode) \
{ \
pNode->func(object); \
} \
} \
} \
} \
while(false)
// 命名空间的预定义宏
#define NS_CC_BEGIN namespace cocos2d {
#define NS_CC_END }
#define USING_NS_CC using namespace cocos2d
#define NS_CC ::cocos2d
#define NODE_FUNC(__TYPE__) \
CC_DEPRECATED_ATTRIBUTE static __TYPE__* node() \
{ \
__TYPE__ *pRet = new __TYPE__(); \
if (pRet && pRet->init()) \
{ \
pRet->autorelease(); \
return pRet; \
} \
else \
{ \
delete pRet; \
pRet = NULL; \
return NULL; \
} \
}
<pre name="code" class="cpp">//在创建的工程目录下的helloworld的头文件可以看到使用先
//分配一个空间再使用其调用的初始化方法
//自动生成一个默认的create 方法
</pre>#define CREATE_FUNC(__TYPE__) \static __TYPE__* create() \{ \ __TYPE__ *pRet = new __TYPE__(); \ if (pRet && pRet->init()) \ { \ pRet->autorelease(); \ return pRet; \ } \ else \ { \ delete pRet; \ pRet = NULL; \ return NULL; \ } \}
<pre name="code" class="cpp">//还有关于安全删除对象的宏,一般来说删除对象,需要判断是否为空
//再执行赋值为空的代码
</pre>#define CC_SAFE_DELETE(p) do { delete (p); (p) = nullptr; } while(0)#define CC_SAFE_DELETE_ARRAY(p) do { if(p) { delete[] (p); (p) = nullptr; } } while(0)#define CC_SAFE_FREE(p) do { if(p) { free(p); (p) = nullptr; } } while(0)#define CC_SAFE_RELEASE(p) do { if(p) { (p)->release(); } } while(0)#define CC_SAFE_RELEASE_NULL(p) do { if(p) { (p)->release(); (p) = nullptr; } } while(0)#define CC_SAFE_RETAIN(p) do { if(p) { (p)->retain(); } } while(0)#define CC_BREAK_IF(cond) if(cond) break
<pre name="code" class="cpp">//下面是cocos2d中独有的while(0)循环当初看到这个while(0)
//我还真不是清楚为什么要写这个while(0)相当于 if(<<<<) return
bool Class::init() { bool bRet = false; do { // do some initialization 1 CC_BREAK_IF(cond); // 当表达式cond为真时候跳出。 // do some more initialization bRet = true; } while(0); return bRet; }
//生成一个-1到1之间的随机数
#define CCRANDOM_MINUS1_1()
//生成一个0到1的随机数
#define CCRANDOM_0_1()
//角度转弧度的
#define CC_DEGREES_TO_RSDISNS(_angle_)
//弧度转角度
#define CC_RADIANS_TO_DEGREES(_ANGLE_)
关于cocos2d中使用最多的Point 的一些操作
ccpFromSize(s) //以size s 的width为x,height 为y 创建向量
ccpAdd(v1,v2) //相加
ccpSUb(v1,v2)
ccpNeg(v)
ccpMult(v,s) //等价于ccp(v.x*s ,v.y*s)
ccpMidpoint(v1,v2) //求点1和点2的中点
CCPDo(v1,v2) //求点乘
ccpCross(v1,v2) //求叉乘
ccpProject(v1,v2) //返回在向量1在向量2上的投影向量
ccpLength(v) //返回向量v的长度 即点v到原点的距离
ccpLengthSQ(v) //返回向量的长度的平方
ccpDistance(v1,v2) //返回v1 v2距离的
ccpDistanceSQ(v1,v2) //返回平方
ccpNormalize(v) //返回v的标准话向量即长度为1
ccpRotate(v1,v2) //向量v1
向量v1旋转过向量v2的角度并且乘上向量v2的长度。当v2是一个长度为1的标准向量时就是正常的旋转了,可以配套地用ccpForAngle
ccPerp(v) //等价于逆时针旋转90度
ccpRPerp(v) //顺时针旋转