这次来看一下这几个容器类都是怎么用的,我先整体说下自己对他们的理解吧。CCArray就像一个数组,里边存放的是CCObject的子类,我们在取元素的时候也是通过下标来获取的,比如我们的那个例子忍者飞镖,子弹都是存放在这个CCArray数组中的,也就是说当我们要向数组中存放东西的时候就可以把这些对象存放到CCArray中,具体的一些函数可以看代码。CCDictionary存放的是键值对,每个key对应一个value,我们获取元素也是通过这个key来的,它是通过哈希表实现的。CCSet这个就不太了解了,只是在多点触摸的时候接触过,有知道的人请留言,以及他们三者的区别欢迎讨论!下面通过代码来看具体的用法。

CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();

    //创建array
	CCArray * arr = CCArray::create();
	for(int i=0;i<10;i++)
	{
		CCSprite * sprite = CCSprite::create("HelloWorld.png");
		//添加元素
		arr->addObject(sprite);
	}
	//在CCArray容器中可以添加不同类型的对象
	CCRotateTo * action = CCRotateTo::create(1.0,360);
	arr->addObject(action);

	//遍历CCArray中的元素
	CCObject * obj;
	//CCARRRAY_FOREACH是一个宏定义,第一个参数代表的是要遍历的CCArray容器,第二个参数传入CCObject的类型
	//可以去看看这个宏定义是怎么实现的,其实这里代替CCARRAY_FOREACH()的是一个for循环,但是没有循环体,所以
	//我们加上{},每次这个循环都会将arr指向的值赋给obj,然后循环一次增加一次arr这个索引
	CCARRAY_FOREACH(arr,obj)
	{
		if(obj == arr->lastObject())
		{
			continue;
		}
		//用的时候一般都是转化为我们添加进去的类型,然后进行一些操作
		CCSprite * sprite = (CCSprite *)obj;
		sprite->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));
		this->addChild(sprite);
	}
	//可以通过整数的下标来获取某一个元素
	arr->objectAtIndex(0);

关于其他一些函数的使用可以看看这篇文章数据结构CCArray 。

//CCDictionary的创建
	CCDictionary * dic = CCDictionary::create();

	CCString * str = CCString::create("zaojiahua");
	CCInteger * integer = CCInteger::create(5);
	//向容器中添加元素,第一个参数是CCObject类型的,第二个是string或者是int类型的
	//使用的时候要注意在同一个CCDictionary中key类型必须要一致,value可以不一致
	dic->setObject(str,"key1");
	dic->setObject(integer,"key2");

	//从容器中获得元素
	CCLog("%s",((CCString *)dic->objectForKey("key1"))->getCString());
	//我们可以将内容写入plist文件,但是整形是无法写入的
	if(dic->writeToFile("dictionary.plist"))
	{
		CCLog("write success!");
	}
	else
	{
		CCLog("write error!");
	}

	//创建CCDictionary也可以使用plist文件
	CCDictionary * dic2 = CCDictionary::createWithContentsOfFile("dictionary.plist");
	CCLog("%s",((CCString *)dic->objectForKey("key1"))->getCString());

	//遍历CCDictionary中的元素
	//CCDictElement的定义是一个key和一个object
	CCDictElement * element;
	CCDICT_FOREACH(dic,element)
	{
		//CCString * str = (CCString *)element->getObject();
		//CCLog("%s",str->getCString());

		//获得你的key类型,如果你的key类型是string就用函数getStrKey,如果你的key类型是int就用getIntKey
		const char * str = element->getStrKey();
		CCLog("%s",((CCString *)dic->objectForKey(str))->getCString());
	}

关于其他一些函数的使用可以看看这篇文章数据结构CCDictionary 。CCSet的使用就是在多点触摸的时候遇到过,遍历的时候用的是迭代器,关于迭代器的用法可以看看c++的基础教程。

void HelloWorld::ccTouchesBegan(CCSet * set,CCEvent * pEvent)
	{
		//CCSetIterator是一个迭代器
		CCSetIterator iterator;
		//以下的方法就是从CCSet中获得对象的方法
		for(iterator = set->begin();iterator != set->end();iterator++)
		{
			//将元素强制转化为CCTouch *类型
			CCTouch * touch = (CCTouch *)(*iterator);
			CCPoint point = touch->getLocation();

			CCSprite * sprite = CCSprite::create("image.png");
			sprite->setPosition(point);
			this->addChild(sprite);
		}
	}