CCArray
来源:互联网 发布:福州市人口数据 编辑:程序博客网 时间:2024/06/05 04:21
CCArray也是cocos2d-x自己写的类。它相当于是objc的NSArray。在cocos2d-x中是没有NSArray的概念的(NSArray和NSMutableArray的唯一区别就是一个不可以改变数组中含有的对象,另一个可以改变)。但是CCArray也有一个小问题。首先,CCArray是不能使用new的方式创建的。其次,使用CCArray::array()创建的数组,即使这个数组已经是当前类的成员变量,也必须要做一次retain,否则的话在创建数组的函数返回的时候,CCArray就会被直接释放掉了。由于这个问题也无法通过编译时候暴露出来,而且在objc中创建自动释放的NSArray类型的成员变量的时候是不需要retain的,所以当我从objc转为使用cocos2d-x的时候,经常会忘记做retain,多次导致了程序在其他函数中使用该成员变量的时候出现错误。
一.基本用法
1.声明初始化变量
C++
1
2
3
cocos2d::CCArray* pArray;
pArray=CCArray::createWithCapacity(100);
pArray->retain();//如果保留成员变量的话,此处必须retain,否则会崩溃,因为标记了autorelease
2.添加元素到数组
C++
1
2
CCSprite* pRet=CCSprite::create("test.png");
pArray->addObject(pRet);//将pRet添加到数组0位置,此处会调用一次pRet的retain
3.删除元素
C++
1
2
3
//下面这两个函数都能够实现删除元素的效果
pArray->removeObject(pRet);//第二参数为是否调用release,默认为true
pArray->removeObjectAtIndex(0);//删除o位置上的元素
4.遍历
1).使用ccarray中的宏进行遍历
C++
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++
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++
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++
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.还有其他用法?发评论告诉我!
分享到:
0 0
- CCArray
- CCArray
- CCArray
- CCArray Reference
- 关于CCArray
- CCArray注意事项
- 数据结构CCArray
- CCArray、CCMutableArray
- 数据结构CCArray
- cocos2dx CCArray
- cocos2d-x CCArray使用方法
- cocos2d-x ccArray 讲解
- cocos2d-x中的CCArray
- cocos2d-x中的CCArray
- 【Cocos2d-x 018】 CCArray
- CCMutableArray和CCArray
- CCArray的用法
- cocos2dx CCArray类
- xib跟viewcontroller绑定代码
- iOS中的arc4random方法
- cocos2dx 常见的32种切换场景的动画
- action 动画
- schdule
- CCArray
- CCACTION
- CCnotificationCenter 通知
- NSString,NSArray 方法
- CCSprite动态换图片
- Cocos2dx---------------- TinyXml 解析 XML(推荐使用rapidxml)
- cocos2dx 精灵点击事件
- cocos2dx CCSprite操作
- IOS 画图
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
体检夜班不喝水怎么办
眉头上有抬头纹怎么办
20岁脖子有颈纹怎么办
解压分卷已损坏怎么办
大腿外侧抽筋痛怎么办
天天跑步小腿粗怎么办
跑步坚持不下来怎么办
脖子瘙痒有红疹怎么办
皮肤有红疹瘙痒怎么办
孕期起红疹瘙痒怎么办
自助吃不完怎么办藏哪
咖啡厅约会先到怎么办
第一次去星巴克怎么办
跑八百米时腿软怎么办
走路跑步小腿疼怎么办
每天跑步腿疼怎么办
迁西收费站砸车怎么办
退休后异地医保怎么办
当兵中途不想当怎么办
消防改制后异地怎么办
在部队不想训练怎么办
衣服刮丝了怎么办
羽绒服洗花了怎么办
边防武警改革士官怎么办
海警局整合人员怎么办
消防队长打新兵怎么办
消防部队改革干部怎么办
没考上规培怎么办
武警水电改革新兵怎么办
防盗门钥匙丢了怎么办
钥匙mei胶了怎么办
房间朝北晒衣服怎么办
速腾车钥匙没电怎么办
汽车钥匙没电怎么办
中介偷配钥匙怎么办
钥匙环勾衣服怎么办
假如家中发生火灾怎么办
部队训练死人了怎么办
新兵偷玩手机怎么办
减肥减掉了肌肉怎么办
做深蹲导致腿粗怎么办