CCArray的遍历宏是CCARRAY_FOREACH(_array,_object),这种遍历方式是正想遍历,用for语句来解释就是从int i=0开始。用法如下:
auto sp = Sprite::create("close.png");//建立俩精灵 sp->setPosition(Point(200,300)); this->addChild(sp,2); auto sp2 = Sprite::create("close.png"); sp2->setPosition(Point(300,300)); this->addChild(sp2,2); __Array* m_array = __Array::create();//用__Array创建一个数组 m_array->addObject(sp);//将sp与sp2放入数组中 m_array->addObject(sp2); Ref* obj = nullptr; CCARRAY_FOREACH(m_array,obj) { auto sp_obj = static_cast<Sprite*>(obj);//将obj强制转换成Sprite sp_obj->runAction(MoveBy::create(3.0f,Point(250,250)));//运动 }当然了, 有些人喜欢更刺激的方式,从后面来!有没有这种遍历呢?当然,CCARRAY_FOREACH_REVERSE(_array,_object)满足你所有的幻想。用某人的话来说就是:从后面来就是.痛!快!。事实真有这么痛快吗?赶紧试下不就知道了(前提是你要有一个女朋友...奇怪,我为什么会说到女朋友??)。
2、CCDictionary的遍历
我再次恳求你放下手里愤怒的西瓜刀!如果CCArray与__Array是同父异母,那么CCDictionary与__Dictionary就是同母异父了!
CCDictionary的遍历宏:CCDICT_FOREACH(_dic,_ele),用法如下:
__Dictionary* dic = __Dictionary::create(); dic->setObject(sp,"sp");//将sp与sp2放入字典中,键分别为sp与sp2 dic->setObject(sp2,"sp2"); DictElement* ele; CCDICT_FOREACH(dic,ele) { auto sp_obj = static_cast<Sprite*>(ele->getObject());//将ele强制转换成Sprite sp_obj->runAction(MoveBy::create(3.0f,Point(250,250))); }3、Vector的"遍历"
Vector<Sprite*> sp_vec;//创建一个容器 sp_vec.pushBack(sp);//将俩精灵扔进去 sp_vec.pushBack(sp2); for( auto sp_obj : sp_vec) { sp_obj->runAction(MoveBy::create(3.0f,Point(250,250)));//每次for循环都从sp_vec容器中取出一个精灵 }
一步到位有木有!如果对Vector的用法还不是很熟悉的童鞋,猛戳这里:http://blog.csdn.net/start530/article/details/19170853
Map<std::string,Sprite*> sp_map;//创建一个Map容器,键值分别为string型与Sprite类型 sp_map.insert("sp",sp);//将sp扔进去, sp_map.insert("sp2",sp2); for( auto e : sp_map) { auto sp_obj = e.second;//e.first获得的是e的键值,e.second获得对象 sp_obj->runAction(MoveBy::create(3.0f,Point(250,250))); }
对Map不熟悉?猛戳这里:http://blog.csdn.net/start530/article/details/19284301
5、使用范围for语句
上面Vector与Map的使用过程都用到一个新鲜玩意:范围for语句。既然都写到这了,我就继续扯点内容凑字数吧。
范围for语句是C++11新提供的一种语句,它的形式如下:
for(declaratio : expression)
{
//statement;
}
expression是一个对象,例如Vector这种容器,declarationo负责定义一个变量,该变量每次循环都会被初始为expression中的下一个元素之。
那么什么类型的对象可以使用范围for语句呢?目前我知道的可以使用的有:vector,map,std::string,还有cocos2dx中的Vector,Map。这些的共同特点都是拥有能返回迭代器的begin和end成员。
下面用std::string来举个例子:使用范围for语句把string对象中的字符每行一个输出出来:
std::string str("star530 is so cool"); //每行输出str中的一个字符 for(auto c : str) //对于str中的每个字符 cout << c << endl; //输出当前字符,后面紧跟一个换行符通过使用auto来确定c的类型(c的类型为char)。每次循环时,str的下一个字符被拷贝给c。
恩,就这样。
尊重原创,转载请注明来源:http://blog.csdn.net/start530/article/details/22697167