cocos2d-x 自己实现了一个数组CCArray ,下面我们来分析一下CCArray的源码

CCArray继承CCObject,所以,CCArray也具有引用计数功能和内存自动管理功能。

数组的源码如下:


class CC_DLL CCArray : public CCObject
{
public:
/************************************************************************/
/* 构造析构函数 */
/************************************************************************/
//构造函数
CCArray();


//capacity 为数组元素的个数,创建的数组至少有1个元素,如果传的是0,也会创建包含一个元素大小的数组
CCArray(unsigned int capacity);


//构造函数
~CCArray();






/************************************************************************/
/* 创建数组 ,一共有7个函数 */
/************************************************************************/
// 创建一个新的数组,默认大小为1个元素的数组
static CCArray* create();


//根据数组中包含的的元素创建一个新的数组,注意,最后一个参数必须为NULL。如CCArray::create(pobj1,pobj2,NULL);
static CCArray* create(CCObject* pObject,...);


//创建一个包含一个元素pObject的数组
static CCArray* createWithObject(CCObject* pObject);

//创建一个包含capacity个元素的数组
static CCArray* createWithCapacity(unsigned int capacity);

//根据一个已经存在的数组创建一个新的数组,这个函数没有实现。暂时用不到
static CCArray* createWithArray(CCArray* otherArray);


/*
根据一个 .plist 文件创建一个新的数组,创建的数组调用了autorelease()函数,所以不用担心内存的释放
*/
static CCArray* createWithContentsOfFile(const char* pFileName);

/*
与上面一个函数功能一样,但是没有调用autorelease()函数,所以使用完后需要调用 release();
*/
static CCArray* createWithContentsOfFileThreadSafe(const char* pFileName);






/************************************************************************/
/* 初始化数组 ,一共有5个函数 */
/************************************************************************/
//初始化一个数组,此数组只包含一个元素大小
bool init();

//初始化一个数组,此数组只包含一个元素,这个元素是pObject
bool initWithObject(CCObject* pObject);

//初始化一个数组,此数组包含多个指定的元素,注:函数有最后一个参数为NULL
bool initWithObjects(CCObject* pObject,...);

//初始化一个数组,此数组包含capacity个元素大小,如果capacity为0,那么创建的是一个只有1个元素大小的数组
bool initWithCapacity(unsigned int capacity);


//初始化一个数组,数组的元素的大小等于otherArray中已经存在的元素的个数相同,并且把other中的元素分别赋值给新创建的数组
//注:在把otherArray中的元素复制到新创建的数组中的过程中,别忘了 pObject->retain()
bool initWithArray(CCArray* otherArray);



/************************************************************************/
/* 初始化数组 ,一共有8个函数 */
/************************************************************************/
//返回数组中已经存在的元素的个数
unsigned int count() const;


//返回数组的总大小
unsigned int capacity() const;


//根据一个给定的元素,返回此元素在数组中的索引,以第1次找到的为准,如果数组中不包含这个元素,返回CC_INVALID_INDEX
unsigned int indexOfObject(CCObject* object) const;

//根据一个给定的数组中的索引,返回其对象
CCObject* objectAtIndex(unsigned int index);

//返回数组中的最后一个元素
CCObject* lastObject();


//随机返回数组中的一个元素
CCObject* randomObject();


//判断元素object是否包含在数组中,true 则元素在此数组中,false则表示元素不在数组中
bool containsObject(CCObject* object) const;

//判断两个数组是否相等,具体是指两个数组中的相应的索引上的元素一一相等,则两数组相等
bool isEqualToArray(CCArray* pOtherArray);


/************************************************************************/
/* 添加元素 ,一共有3个函数 */
/************************************************************************/
//在数组的最后一个元素的后面再添加一个元素object,如果数组空间不足,则数组会再动态申请2倍于以前数组的最大的空间
void addobject(CCObject* object);


//把数组otherArray中的相应元素分别添加到数组中,如果空间不足,则数组会再动态申请2倍于以前数组的最大的空间
void addobjectsFromArray(CCArray* otherArray);

//将object插入到数组中index位置上,从index位置往后每个元素向后移动一个位置
//这个过程使用了memmove()函数
void insertObject(CCObject* object,unsigned int index);


/************************************************************************/
/* 删除元素 ,一共有7个函数 */
/************************************************************************/
//删除数组中的最后一个元素,如果bReleaSEObj为true,则会调用元素的release()函数
//注:特别注意,这个函数实际上并没有真正的把元素删除,只是把当前的元素的个数减1,从而可以正确确定索引的范围了
void removeLastObject(bool bReleaSEObj = true);


//删除数组中第一次出现的object , bReleaSEObj的意义同上
void removeObject(CCObject* object,bool bReleaSEObj = true);

//删除指定索引上的元素
void removeObjectAtIndex(unsigned int index,bool bReleaSEObj = true);

//删除数组中所有包含otherArray中元素的元素
void removeObjectsInArray(CCArray* otherArray);


//删除数组中所有的元素,但数组的内存没有释放
void removeAllObjects();

//fast删除,最快速的删除,原理其实就是把数组中的最后一个元素赋值给了object对应的位置。并且数组的当前元素个数减1
//使用此函数一定要注意,要删除的那个位置的值不存在了
//只是替换了数组的最后一个元素,很可能会造成内存泄露,因为并没有真正删除object
void fastRemoveObject(CCObject* object);

//原理同上
void fastRemoveObjectAtIndex(unsigned int index);


// Rearranging Content


//交换数组中两个元素,就是object1跑到object2的位置上了,同理,object2跑到object1的位置上了
void exchangeObject(CCObject* object1,CCObject* object2);

//交换数组中index1和index2两个索引对应的两个元素,其实上面的函数就是调用了此函数
void exchangeObjectAtIndex(unsigned int index1,unsigned int index2);


//将uIndex位置的元素替换为pObject
void replaceObjectAtIndex(unsigned int uIndex,CCObject* pObject,bool bReleaSEObject = true);


//翻转数组
void reverSEObjects();


//缩小数组的空间,让数组占用的内存符合元素的数量
void reduceMemoryFootprint();



//virtual函数,返回当前数组的一个副本
virtual CCObject* copyWithZone(CCZone* pZone);


/* override functions */
virtual void acceptVisitor(CCDataVisitor &visitor);


public:
ccArray* data;
};


转载来源:http://www.cnblogs.com/start1225/p/3530567.html

cocos2d-x 之 CCArray 源码分析的更多相关文章

  1. HTML实现代码雨源码及效果示例

    这篇文章主要介绍了HTML实现代码雨源码及效果示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. html5使用canvas实现弹幕功能示例

    这篇文章主要介绍了html5使用canvas实现弹幕功能示例的相关资料,需要的朋友可以参考下

  3. 前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)

    这篇文章主要介绍了前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. H5 canvas实现贪吃蛇小游戏

    本篇文章主要介绍了H5 canvas实现贪吃蛇小游戏,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. ios – parse.com用于键,预期字符串的无效类型,但是得到了数组

    我尝试将我的数据保存到parse.com.我已经预先在parse.com上创建了一个名为’SomeClass’的类.它有一个名为’mySpecialColumn’的列,其数据类型为String.这是我尝试使用以下代码保存数据的代码:如果我运行这个我得到:错误:密钥mySpecialColumn的无效类型,预期字符串,但得到数组这就是我在parse.com上的核心外观:有谁知道我为什么会收到这个错误?

  6. ios – 上下文类型’NSFastEnumeration’不能与数组文字一起使用

    斯威夫特3,你会这样做吗?解决方法正如您所发现的,您不能使用as-casting将数组文字的类型指定为NSFastEnumeration.您需要找到一个符合NSFastEnumeration的正确类,在您的情况下它是NSArray.通常写这样的东西:

  7. ios – 获取资产目录文件夹中所有图像的数组

    在iOS中,是否可以获取资产目录文件夹中的图像数组?我不确定为什么会对此进行投票.我真的不知道从哪里开始.我的另一种方法是创建文件夹中所有文件的plist,但它似乎是多余的.我无法添加任何代码,因为我会添加什么?

  8. ios – 来自调试器的消息:由于内存问题而终止

    我的应用程序使用Geojson文件.我使用MapBoxSDK将MGLpolyline添加到地图中.但问题是我的文件太大,以至于应用程序崩溃并收到错误:来自调试器的消息:由于内存问题而终止.我在第一次循环时面对66234个对象.我试图将数组块化为新数组,但没有成功.请帮我解决问题.这是我在地图上绘制的代码,这里是我的testprojectongithubuseXcode8.1如果有任何不同的第三方可

  9. ios – Swift – 使用字典数组从字典访问数据时出错

    我有一个非常简单的例子,说明我想做什么基本上,我有一个字典,其值包含[String:String]字典数组.我把数据填入其中,但当我去访问数据时,我收到此错误:Cannotsubscriptavalueoftype‘[([String:String])]?’withanindexoftype‘Int’请让我知道我做错了什么.解决方法您的常量数组是可选的.订阅字典总是返回一个可选项.你必须打开它.更

  10. ios – 在Swift中使用“Map”创建两个数组的超集

    假设我有两个数组:我想组合两个数组,以便我得到一个输出我该怎么做呢?

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部