本文为 justbilt 原创,转载请标明原作者及原文出处,以示尊重!

作者:justbilt

原文:http://blog.justbilt.com/25/

一.基本用法

1.声明初始化变量

C++
cocos2d::CCArray* pArray; pArray=CCArray::createWithCapacity(100); pArray->retain();//如果保留成员变量的话,此处必须retain,否则会崩溃,因为标记了autorelease
1
2
3

cocos2d::CCArray* pArray;
pArray=CCArray::createWithCapacity(100);
pArray->retain();//如果保留成员变量的话,此处必须retain,否则会崩溃,因为标记了autorelease

2.添加元素到数组

C++
CCSprite* pRet=CCSprite::create("test.png"); pArray->addObject(pRet);//将pRet添加到数组0位置,此处会调用一次pRet的retain
1
2

CCSprite* pRet=CCSprite::create("test.png");
pArray->addObject(pRet);//将pRet添加到数组0位置,此处会调用一次pRet的retain

3.删除元素

C++
//下面这两个函数都能够实现删除元素的效果 pArray->removeObject(pRet);//第二参数为是否调用release,默认为true pArray->removeObjectAtIndex(0);//删除o位置上的元素
1
2
3

//下面这两个函数都能够实现删除元素的效果
pArray->removeObject(pRet);//第二参数为是否调用release,默认为true
pArray->removeObjectAtIndex(0);//删除o位置上的元素

4.遍历

1).使用ccarray中的宏进行遍历

C++
CCObject* pObj; //正向 CCARRAY_FOREACH(s_pBulletArray,pObj) { CMapNode* pNode=(CMapNode*)pObj; //... } //逆向 CCARRAY_FOREACH_REVERSE(s_pBulletArray,pObj) { CMapNode* pNode=(CMapNode*)pObj; //... }
1
2
3
4
5
6
7
8
9
10
11
12
13

CCObject* pObj;
//正向
CCARRAY_FOREACH(s_pBulletArray,pObj)
{
    CMapNode* pNode=(CMapNode*)pObj;
    //...
}
//逆向
CCARRAY_FOREACH_REVERSE(s_pBulletArray,pObj)
{
    CMapNode* pNode=(CMapNode*)pObj;
    //...
}

2).for循环遍历

C++
for (unsigned int i = 0; i <s_pBulletArray->count(); ++i) { CCNode* pObj=(CCNode*)s_pBulletArray->objectAtIndex(i); }
1
2
3
4

for (unsigned int i = 0; i <s_pBulletArray->count(); ++i)
{
    CCNode* pObj=(CCNode*)s_pBulletArray->objectAtIndex(i);
}

二.注意事项

1.创建一个CCArray后如果不是立刻使用的话一定要调用retain,增加引用计数,不然会被自动释放!

2.删除CCArray中的元素时最好默认内部调用一次release,不然可能会内存泄露!

3.遍历时删除元素

C++
//判断条件删除时,最好能够逆向遍历删除,这样不会漏掉任何元素 for (int i = arr->count()-1; i>=0 ; --i) { CMonster* pObj=(CMonster*)arr->objectAtIndex(i); bool isCollide = false; isCollide =rect.intersectsRect(pObj->getCollideRect()); if (isCollide) { arr->removeObject(pObj); } }
1
2
3
4
5
6
7
8
9
10
11

//判断条件删除时,最好能够逆向遍历删除,这样不会漏掉任何元素
for (int i = arr->count()-1; i>=0 ; --i)
{
    CMonster* pObj=(CMonster*)arr->objectAtIndex(i);
    bool        isCollide = false;
    isCollide =rect.intersectsRect(pObj->getCollideRect());
    if (isCollide)
    {
        arr->removeObject(pObj);
    }
}

三.什么时候会用到CCArray?

1.每一个CCNode的children本质就是一个CCArray,这样我们就可以通过getChildren()获得array,进行操作!

2.对于CCSequence如果只有到运行时才能知道有个少个动作时,我们就可以声明一个CCArray然后将动作addObject(),最后通过一个array来创建CCSequence,例如下面这段代码:

C++
//所有的路径节点 CCArray *array = CCArray::createWithCapacity(20); float dt=1/(m_pProperty->fMoveSpeed); CCPoint point(-1,-1); for (UINT i=0;i<CGlobal::getGameMap()->m_PathNode.size()-1;++i) { array->addObject(CCMoveTo::create(dt,point)); } //移动完毕的回调 array->addObject(CCCallFunc::create(this,callfunc_selector(CMonster::onArrive))); CCSequence* pAct=CCSequence::create(array);
1
2
3
4
5
6
7
8
9
10
11
12

//所有的路径节点
CCArray *array = CCArray::createWithCapacity(20);
float dt=1/(m_pProperty->fMoveSpeed);
CCPoint point(-1,-1);
for (UINT i=0;i<CGlobal::getGameMap()->m_PathNode.size()-1;++i)
{
    array->addObject(CCMoveTo::create(dt,point));
}
//移动完毕的回调
array->addObject(CCCallFunc::create(this,callfunc_selector(CMonster::onArrive)));
CCSequence* pAct=CCSequence::create(array);

3.对于一个CCSprite,我们肯定需要把它addChild到parent上,这样他才能显示出来,这样的话parent上就会有好多child,但是我们要遍历只是其中的一部分(例:场景的地图上有好多种花,我们都会把它们添加到同一个parent上,这时候策划说其中的一种花会被怪物踩死?纳尼….,这个时候我们就需要唉将能被踩死的花加入到parent上时同时加入到一个CCArray中去….),这样我们用的时候遍历这个数组就可以了,而不是遍历这个children!

4.多谢@子龙山人 大大的添加,CCArray还可以内存预分配,比如预先生成一堆子弹,然后加到CCArray中,再从这个CCArray中去重用子弹。这样可以提高游戏效率。消失的子弹只需要设置为Invisible就可以了。这个在做射击类游戏中会大量使用的!

5.还有其他用法?发评论告诉我!

cocos2d-x CCArray用法 遍历和删除元素相关推荐

  1. hashmap移除元素_Java HashMap 如何正确遍历并删除元素的方法小结

    (一)HashMap的遍历 HashMap的遍历主要有两种方式: 第一种采用的是foreach模式,适用于不需要修改HashMap内元素的遍历,只需要获取元素的键/值的情况. HashMap myHa ...

  2. 浅谈为什么倒序遍历List删除元素没有问题

    要搞清楚这个问题,首先要知道如何正确的遍历List删除元素.注:下述代码完整版附在末尾. 先给出这次测试的list初始化结构: list.add("a");list.add(&qu ...

  3. C++ vector容器遍历并删除元素

    在使用C++ vector的迭代器遍历并删除元素时,存在一些不注意的误区,这里特此记录. 在使用迭代器遍历vector元素时,错误的删除方法: vector<int>::iterator ...

  4. List遍历中删除元素

    List遍历主要有索引下标遍历.for循环遍历和Iterator迭代遍历,索引下标和for循环在遍历中删除元素都存在问题,Iterator迭代可以实现遍历中删除元素. 索引下标遍历 List<I ...

  5. foreach遍历list删除元素一定会报错?

    foreach遍历list集合删除某些元素一定会报错吗? 先上一段代码: List list = new ArrayList(); list.add("1"); list.add( ...

  6. jQuery:设置获取属性、遍历添加删除元素、尺寸、位置

    目录 一.设置或获取元素属性值 1.设置或获取元素固有属性值 2.设置或获取元素自定义属性值attr() 3.数据缓存data() 二.获取元素内容 三.jQuery对元素操作 1.遍历元素 2.创建 ...

  7. 集合中的遍历以及删除元素

    package collection;import java.util.ArrayList; import java.util.Collection; import java.util.Iterato ...

  8. List如何在遍历时删除元素

    背景:业务中经常会涉及遍历list时对集合进行插入或者删除操作 一. 错误方式 先看看下面几段代码,1是foreach的方式去遍历list并删除元素,2是用迭代器的方式遍历list并删除元素,3是下标 ...

  9. python 遍历list删除元素_详解Python遍历列表时删除元素的正确做法

    这篇文章主要介绍了详解Python遍历列表时删除元素的正确做法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 一.问题描述 这是 ...

最新文章

  1. android 获取网卡mac_防亚马逊账号关联黑科技--如何修改我们的网卡MAC到底重要不?...
  2. 有没有记录程序运行中所有的函数调用堆栈的工具?
  3. 初等数论--同余--欧拉函数、欧拉定理、费马小定理
  4. friend之友元函数和友元类
  5. Storm【技术文档】-Worker Executor Task的关系
  6. 【dijkstra模板】旅游规划 (25 分)
  7. Linux编程手册读书笔记第五章(20140408)
  8. 本科计算机专业在车辆段,机电与轨道车辆工程系2021届毕业生参加成都铁路局车辆段及电务段认知实习...
  9. quatus ii 常见错误及其改正方法
  10. linux返回值含义,linux命令返回值的含义解析
  11. ActiveMQ实现负载均衡+高可用部署方案 -转载
  12. 金融财务数据分析报告PPT模板
  13. 医院计算机管理办法试行,医院信息工作制度七、计算机中心机房管理制度
  14. UC浏览器如何开启html5,如何开启手机uc浏览器中的极速模式
  15. JS的Date函数Date方法的相关汇总
  16. Kafka其实就是个“篮子”
  17. 广告推广是什么意思?利用文章推广的方法做广告推广技巧总结
  18. [附源码]计算机毕业设计JAVA旅游网站
  19. runauto 病毒
  20. swfobject.js 2.2 使用方法

热门文章

  1. python从入门到实践课后题_Python 从入门到实践 函数篇 8-6-8习题
  2. html view设置全屏,uni-app 如何设置web-view 不全屏,不自动铺满,动态控制web-view的高度...
  3. add git 的文件 移除_【Git第八节】移除文件
  4. python字符串补空格输出_python实现指定字符串补全空格、前面填充0的方法
  5. snmpset对象不可写_别再问了,好吗?Java字符串一定是不可变的
  6. Qt一个进程运行另一个进程
  7. Qt Project Build error PRJ0019: 工具从Moc'ing xxx.h...
  8. UGUI 图片灰显裁剪
  9. 负载均衡调度算法追溯
  10. excel内容少却文件很大_009- EXCEL文件的表格内的数据内容明明不多,但是文件却变得很大...