zoukankan      html  css  js  c++  java
  • 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就可以了。这个在做射击类游戏中会大量使用的!

  • 相关阅读:
    PyQt作品 – PingTester – 多点Ping测试工具
    关于和技术人员交流的一二三
    Pyjamas Python Javascript Compiler, Desktop Widget Set and RIA Web Framework
    Hybrid Qt applications with PySide and Django
    pyjamas build AJAX apps in Python (like Google did for Java)
    PyQt 维基百科,自由的百科全书
    InfoQ:请问为什么仍要选择Java来处理后端的工作?
    Eric+PyQt打造完美的Python集成开发环境
    python select module select method introduce
    GUI Programming with Python: QT Edition
  • 原文地址:https://www.cnblogs.com/atong/p/3414172.html
Copyright © 2011-2022 走看看