cocos2d-x中CCArray的遍历,需要几个宏。现代C++程序设计建议尽量不要使用宏,所以数组的遍历也可以自己写。

但cocos2d-x官方已经提供了几个方便数组遍历的几个宏,用好了,能方便许多 。下面就介绍一下第一个宏

1   CCARRAY_FOREACH ,此宏的定义如下

#define CCARRAY_FOREACH(__array__, __object__)                                                                         \
if ((__array__) && (__array__)->data->num > ) \
for(CCObject** __arr__ = (__array__)->data->arr, **__end__ = (__array__)->data->arr + (__array__)->data->num-; \
__arr__ <= __end__ && (((__object__) = *__arr__) != NULL/* || true*/); \
__arr__++)

宏的作用就是把数组__array__ 从头到尾,把里面的每个元素分别赋值给 __object__ ,这样就可以对每个元素进行操作了。

用法如下:

例子1 :

有一个数组 CCArray* arr;//假如已经初始化了,数组里面有元素

CCObject* obj = NULL;

CCARRAY_FOREACH(arr,obj)

{

  //your code

}

例子2 :

CCNode的成员函数onEnter()中,有一段代码是遍历此节点的所有的子节点是否正在运行,代码如下,只需要看中文注释那几行代码即可

void CCNode::onEnter()
{
//fix setTouchEnabled not take effect when called the function in onEnter in JSBinding.
m_bRunning = true; if (m_eScriptType != kScriptTypeNone)
{
CCScriptEngineManager::sharedManager()->getScriptEngine()->executeNodeEvent(this, kCCNodeOnEnter);
} //Judge the running state for prevent called onEnter method more than once,it's possible that this function called by addChild
if (m_pChildren && m_pChildren->count() > )
{ //数组遍历,只需要看下面代码
CCObject* child;
CCNode* node; //把数组m_pChilden中的所有子节点分别赋值给child
CCARRAY_FOREACH(m_pChildren, child)
{
node = (CCNode*)child;//将child转换成数组中元素的类型
if (!node->isRunning())//对数组中元素进行判断是否正在运行
{
node->onEnter();//如果正在运行,调用onEnter函数
}
}//end loop
} this->resumeSchedulerAndActions();
}

还有一个宏也是进行数组遍历的。

2 CCARRAY_FOREACH_REVERSE

定义如下

#define CCARRAY_FOREACH_REVERSE(__array__, __object__)                                                                  \
if ((__array__) && (__array__)->data->num > ) \
for(CCObject** __arr__ = (__array__)->data->arr + (__array__)->data->num-, **__end__ = (__array__)->data->arr; \
__arr__ >= __end__ && (((__object__) = *__arr__) != NULL/* || true*/); \
__arr__--)

这个宏与上一个宏CCARRAY_FOREACH 的作用是一样的,也是进行数组的遍历,但是CCARRAY_FOREACH 是从头到尾开始遍历,

而CCARRAY_FOREACH_REVERSE 是从尾部向首部开始遍历的。

具体用法同上。自己可以举例进行遍历,验证一下。

3  arrayMakeObjectsPerformSelector

这个宏是对数组中的每一个元素分别调用 func 函数,pArray是数组,func是要调用的函数,elementType是元素的类型,比如数组中存放的是CCSpirte* ,那么elementType就是CCSpirte

定义如下:

#define arrayMakeObjectsPerformSelector(pArray, func, elementType)    \
do { \
if(pArray && pArray->count() > ) \
{ \
CCObject* child; \
CCARRAY_FOREACH(pArray, child) \
{ \
elementType pNode = (elementType) child; \
if(pNode) \
{ \
pNode->func(); \
} \
} \
} \
} \
while(false)

例子:

比如有一个数组 arrSP ,数组存放的全是CCSpirte ,我想对arrSP中所有的精灵调用它的draw()函数

那么我可以这样用

arrayMakeObjectsPerformSelector(arrSP,draw,CCSpirte*);  //注:别忘了后面的分号 ; 哦,如果不加分号,会报错的。

其实在宏的定义里面的最后一句 while(false)后面就可以直接加个分号,可以减少出错的概率。

还有最后一个宏,是调试用的。可以了解一下。

4 CCARRAY_VERIFY_TYPE
这个宏是检查数组中的元素的类型是否正确的。主要用到了dynamic_cast 运算符,dynamic_cast 可以在执行期决定真正的类型,宏的定义如下
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
#define CCARRAY_VERIFY_TYPE(__array__, __type__) \
do { \
if ((__array__) && (__array__)->data->num > ) \
for(CCObject** __arr__ = (__array__)->data->arr, \
**__end__ = (__array__)->data->arr + (__array__)->data->num-; __arr__ <= __end__; __arr__++) \
CCAssert(dynamic_cast<__type__>(*__arr__), "element type is wrong!"); \
} while(false)
#else
#define CCARRAY_VERIFY_TYPE(__array__, __type__) void(0)
#endif

宏定义中有这样一句  CCAssert(dynamic_cast<__type__>(*__arr__), "element type is wrong!");

这就是转换的关键所在。

并且只有定义了 COCOS2D_DEBUG 宏而且还大于 0 的情况下 ,CCARRAY_VERIFY_TYPE才有意义

比如下面第一种方法定义COCOS2D_DEBUG就没有起作用,第二种是起作用的。

第一种方法  :#define COCOS2D_DEBUG

第二种方法  :#define COCOS2D_DEBUG   1 //只要大于0就行


关于数组的一些用法遍历操作就介绍到这

cocos2d-x 之 CCArray 的遍历(3)的更多相关文章

  1. cocos2d JS-(JavaScript) cc.each循环遍历对象

    有了它,妈妈再也不用担心我的数组会越界啦!! each()方法能使DOM循环结构简洁,不容易出错.each()函数封装了十分强大的遍历功能,使用也很方便,它可以遍历一维数组.多维数组.DOM, JSO ...

  2. cocos2d JS-(JavaScript) 几种循环遍历对象的比较

    通常我们会用循环的方式来遍历数组.但是循环是 导致js 性能问题的原因之一.一般我们会采用下几种方式来进行数组的遍历: 方式1: for in 循环: var arr = [1,2,3,4,5]; v ...

  3. Cocos2dx3.0过渡篇 各种遍历与范围for语句的使用【转】

    1.CCArray的遍历看到这里,有些人又按耐不住的要举起西瓜刀了:你不是说3.0beta后已经没有CCArray这货了吗?现在又拿出来作甚?其实我也很无辜,CCArray确实是没了,但在某个不为人知 ...

  4. 升级到cocos2d-x 2.0.2代码差异

    来自:http://www.cnblogs.com/TopWin/archive/2012/09/12/2682042.html 近期看cocos2d-x 2.0.2公布后升级了一下.升级后发现又出现 ...

  5. cocos2d-x 2.0.2升级后某些函数变化(转)

    最近看cocos2d-x 2.0.2发布后升级了一下,升级后发现又出现了很多错误,原来有一些地方的代码用法改变了.在修改代码的过程中,简单做了一些记录,当做是一个备忘录. 1.CCScene和CCLa ...

  6. CCDictionary(转)

    #ifndef __CCDICTIONARY_H__ #define __CCDICTIONARY_H__ //需要哈希表的支持 #include "support/data_support ...

  7. cocos2d 遍历CCAarray

    cocos2d 遍历CCAarray CCARRAY_FOREACH(children_, node){ }

  8. cocos2d CCArray

    CCArray* arr=CCArray::create(); arr->retain();//如果不加这个东西,CCArray会被清空 arr->addObject(CCSprite:: ...

  9. Cocos2D遍历场景图(Scene Graph)

    另一个Cocos2D有用的调试特性是打印出递归的打印出节点的孩子们. 你可以添加以下一行到MainScene或GameScene的didLoadFromCCB的方法中: [self.scene wal ...

随机推荐

  1. [HTML5]块和内联元素的嵌套

    块元素可以包含块或内联元素,但是内联元素只能包含其他内联元素. <!-- 无效代码! :-( --> <strong> <p>你不应该把p元素放在 "st ...

  2. 【javascript基础】6、new与构造函数

    前言 上篇说创建对象的时候提到了带返回值的构造函数,那里没有和大家说这个问题,今天就和大家一起学习构造函数和new操作符.我也是最近才稍微弄明白点这个构造函数,以前总是忽略一些问题,现在就是想到哪块不 ...

  3. properties文件简介及其常用Java操作

    一.properties文件简介 java中的properties文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件,文件的内容是格式是"键=值&q ...

  4. Web服务器禁止range请求

    range: 请求一般是多线程下载的客户端程序使用 在httpd.conf中增加下面的配置,可以禁止range请求: RewriteEngine onRewriteCond %{HTTP:Range} ...

  5. BackTrack 5 开启SSHD服务

    BackTrack 5 开启SSHD服务 1 service ssh start 但启动后,仍然无法从远程连接,会有提示: 1 Read from socket failed: Connection ...

  6. zookeeper启动。

    package com.autonavi.tinfo.traffic.zookeeper; import java.util.Arrays; import java.util.Collections; ...

  7. 'Invalid parameter not satisfying: body'

    afnetwork图片上传的时候出错,出现错误 2015-11-09 15:47:59.086 videoPro[3207:132795] *** Assertion failure in -[AFS ...

  8. 【转】提高VR渲染速度的关键

    提高VR渲染速度的关键,这个教程比以往的教程都要重要很多,如果你是刚刚步入学习和上升阶段那么这将是你必须要看的东西,他会让你迅速提升技能达到比你死看书本好很多的效果,不多说上教程   VR的基本渲染方 ...

  9. MySQL备份学习

    备份分类 物理和逻辑备份 物理备份直接拷贝数据库目录和文件,适合数据量大.重要且需要在出现问题时快速恢复的数据库 逻辑备份保存信息包括逻辑数据库结构(数据库表的创建脚本)和内容(插入语句或者分隔符平面 ...

  10. 关于对 maximio平台的五个常用类的初步理解及总结

    AppBean:绑定应用的默认Bean类,控制主对象集/单个对象,和ui关联的类 继承:DataBean DataBean:任何对象集/单个对象,在ui端处理类. 1.在对象层:写一个Fld类,调用构 ...