• cocos2d-x CCArray用法 遍历和删除元素


    一.基本用法

    1.声明初始化变量

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

    2.添加元素到数组

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

    3.删除元素

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

    4.遍历

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

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

    2).for循环遍历

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

    二.注意事项

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

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

    3.遍历时删除元素

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

    三.什么时候会用到CCArray?

     

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

     

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

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

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

     

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

  • 相关阅读:
    前端-微信公众号开发(jssdk)
    wampserver 配置本地环境局域网内pc移动访问
    客户端缓存之localStorage and sessionStorage
    webpack+vue搭建基础
    高德地图javascriptAPI基本使用心得(下)
    高德地图javascriptAPI基本使用心得(上)
    表单单选多选项清除默认样式小技巧
    (原创)C#零基础学习笔记003-流程控制语句
    (原创)C#零基础学习笔记002-表达式与运算符
    (原创)C#零基础学习笔记000-学习结构
  • 原文地址:https://www.cnblogs.com/atong/p/3414172.html
Copyright © 2020-2023  润新知