cocos2dx中提供了三种基本的数据类型:CCString(字符串),CCArray(数组),CCDictionary(数据字典(哈希的功能))
2.CCString的用法
class CCString : public CCObject,可见CCString本质是一个CCObject,因此支持create方法和其他CCObject的特性
a.CCString的创建:
CCString *str=CCString("abc");
CCString *str=CCString::create("1234");//CCObject的特性
CCString *str=CCString::createwithformat("id%d",3);//格式化初始化
static CCString* createWithData(const unsigned char* pData, unsigned long nLen);//使用二进制数据里创建一个字符串
static CCString* createWithContentsOfFile(const char* pszFileName);//根据文件来创建一个字符串
b.CCString与其他数据类型的转换:
int intValue() const;
unsigned int uintValue() const;
float floatValue() const;
double doubleValue() const;
bool boolValue() const;
2.CCArray是一个数组容器,用来盛放CCObject类型的对象
a.CCArray的创建方法:
/** 创建一个数组*/
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);
b.CCArray中的删除操作
需要注意的是,CCArray中的remove是把后续的整块数据全部一次性往前移动一个元素的内存距离,而fastremove只是把最后一个元素的内容替换当前要删除的元素的内容,会产生重复的数据:
unsigned int remaining = arr->num - index;
if(remaining>0)
{
memmove((void *)&arr->arr[index], (void *)&arr->arr[index+1],
remaining * sizeof(CCObject*));
}
c.CCARRAY_FOREACH和CCARRAY_FOREACH_REVERSE在删除数据的遍历中,反向遍历不会出错,而前向遍历会报错,因为在本次遍历中,指针的位置是固定的,而中间有remove操作会移动整块数据块,导致末尾的指针置空,从而出错.故在可能需要删除数据的遍历中,应尽量使用CCARRY_FOREACH_REVEARE
3.CCDictionary,数据字典
a.数据字典里存储的都是键值对,且key的类型只支持int,或者string中的一种
b.对于某部数据字典,其键值的类型只能唯一确定一种,不能既有int,又有string
c.内部采用了哈希的原理,查找速度和数组差不多
使用方法:
CCDictionary *dict = CCDictionary::create(); //创建数据字典
dict->retain();
/*设置键值对*/
dict->setObject(&str, "id"); //数据字典中存放的都是CCObject对象
dict->setObject(&path, 222);//报错,一个数据字典中,key值必须一致,要么全是int,要么全是string,这里上面是string,这里是int,不行
/*根据键名来获取值*/
CCString *id=(CCString*)dict->objectForKey("id");
//CCString *ph = (CCString*)dict->objectForKey("path");
CCString *ph = (CCString*)dict->objectForKey(2);
CCLog("%s", id->getCString());
CCLog("%s", ph->getCString());
d.使用CCDictionary和xml文件来显示中文
CCDictionary *file = CCDictionary::createWithContentsOfFile("chinese.xml");//通过文件来创建数据字典
CCString *pep = (CCString *)file->objectForKey("people1");//该key是xml文件中已有的,否则报错
CCLog("%s", pep->getCString());
CCLabelTTF * ttf = CCLabelTTF::create(pep->getCString(), "Courier New", 30);
ttf->setPosition(ccp(240, 160));
addChild(ttf);