CCArray的用法_ccarray怎么设置层级

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

CCArray是一个面向对象包装类

CCArray继承至CCObject(CCObject主要是为了自动内存管理而创建的),并且提供了一系列接口,包括

创建

/\*\* 创建一个数组 \*/
  static CCArray\* create();
 /\*\* 使用一些对象创建数组 \*/
static CCArray\* create(CCObject\* pObject, …);     
 /\*\* 使用一个对象创建数组 \*/   
   static CCArray\* createWithObject(CCObject\* pObject);     
 /\*\* 创建一个指定大小的数组 \*/   
   static CCArray\* createWithCapacity(unsigned int capacity);     
 /\*\* 使用一个现有的CCArray数组来新建一个数组 \*/ 
static CCArray\* createWithArray(CCArray\* otherArray);

插入

/\*\* 插入一个对象 \*/
    void addObject(CCObject\* object);
    /\*\* 插入别外一个数组里面的全部对象 \*/
    void addObjectsFromArray(CCArray\* otherArray);
    /\*\* 在一个确定的索引位置插入一个对象 \*/
    void insertObject(CCObject\* object, unsigned int index);

删除

 
 /\*\* 移除最后的一个对象 \*/
     void removeLastObject(bool bReleaseObj = true);
     /\*\*移除一个确定的对象 \*/
     void removeObject(CCObject\* object, bool bReleaseObj = true);
     /\*\* 移除一个确定索引位置的元素 \*/
     void removeObjectAtIndex(unsigned int index, bool bReleaseObj = true);
     /\*\* 移除全部元素 \*/
     void removeObjectsInArray(CCArray\* otherArray);

  /\*\* 移除所有对象 \*/
    void removeAllObjects();
    /\*\* 快速移除一个对象 \*/
    void fastRemoveObject(CCObject\* object);
    /\*\* 快速移除一个确定索引位置的对象 \*/
    void fastRemoveObjectAtIndex(unsigned int index);

– See more at: http://www.cocos2d-x.org/projects/cocos2d-x/wiki/CCArray#sthash.kc1dtGXI.dpuf

remove和fastRemove有什么区别,可以看看源代码,remove是从CCArray中完全的移除,fastRemove只是将CCArray中对应的对象释放掉了,没够改变整个CCArray的结构。从代码上来看,区别在于删除元素之后,是否把数组之后的元素向前移动覆盖掉之前位置的元素。
代码上的差别如下所示:

unsigned int remaining = arr->num - index;
 if(remaining>0)
{
 memmove((void \*)&arr->arr[index], (void \*)&arr->arr[index+1], remaining \* sizeof(CCObject\*));
}

遍历

CCArray

在教程第五章 “怎么样去侦测碰撞”中,在update()函数下面调用了CCARRAY_FOREACH(arr, obj)方法,这个方法就是用来遍历CCArray(_targets和_projectiles),用来在每一帧中检测碰撞。

在HelloWorldScene.h中申明,并且在HelloWorldScene.cpp中定义

void HelloWorld::update(ccTime dt)
{
 CCArray \*projectilesToDelete = new CCArray;
 CCObject\* it = NULL;
 CCObject\* jt = NULL;

 CCARRAY\_FOREACH(\_projectiles, it)
 {
 CCSprite \*projectile = dynamic\_cast(it);
 CCRect projectileRect = CCRectMake(
 projectile->getPosition().x - (projectile->getContentSize().width/2),
 projectile->getPosition().y - (projectile->getContentSize().height/2),
 projectile->getContentSize().width,
 projectile->getContentSize().height);

 CCArray\* targetsToDelete =new CCArray;

 CCARRAY\_FOREACH(\_targets, jt)
 {
 CCSprite \*target = dynamic\_cast(jt);
 CCRect targetRect = CCRectMake(
 target->getPosition().x - (target->getContentSize().width/2),
 target->getPosition().y - (target->getContentSize().height/2),
 target->getContentSize().width,
 target->getContentSize().height);

 // if (CCRect::CCRectIntersectsRect(projectileRect, targetRect))
 if (projectileRect.intersectsRect(targetRect))
 {
 targetsToDelete->addObject(target);
 }
 }

 CCARRAY\_FOREACH(targetsToDelete, jt)
 {
 CCSprite \*target = dynamic\_cast(jt);
 \_targets->removeObject(target);
 this->removeChild(target, true);
 }

 if (targetsToDelete->count() >0)
 {
 projectilesToDelete->addObject(projectile);
 }
 targetsToDelete->release();
 }

 CCARRAY\_FOREACH(projectilesToDelete, it)
 {
 CCSprite\* projectile = dynamic\_cast(it);
 \_projectiles->removeObject(projectile);
 this->removeChild(projectile, true);
 }
 projectilesToDelete->release();
}

– See more at: http://www.cocos2d-x.org/projects/cocos2d-x/wiki/CCArray#sthash.hQf6ATw7.dpuf

CCArray 和 NSArray

CCArray效率很高,但是CCArray中的对象也是有对应位置的,假如你的代码依赖于这些对象的位置,你就不应该使用fastRemoveObject方法。

速度测试

以下代码是测试CCArray和NSArray分别遍历200个对象:

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

取](https://bbs.csdn.net/topics/618679757)**

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值