您的位置:首页 > 移动开发 > Cocos引擎

Cocos2dx3.0过渡篇(二十二)各种遍历与范围for语句的使用

2014-09-16 23:38 429 查看
http://www.it165.net/pro/html/201404/11330.html

----------------

遍历这东西,我的理解就是for语句的加强版啦。本来这种小技巧类型的博文应该放到Cocos2dx 小技巧这一栏里,但因为涉及到3.0的一些知识与C++ 11的新特性,所以就大胆的放这了。

下面介绍一些常用的遍历。

1、CCArray的遍历

看到这里,有些人又按耐不住的要举起西瓜刀了:你不是说3.0beta后已经没有CCArray这货了吗?现在又拿出来作甚?

其实我也很无辜,CCArray确实是没了,但在某个不为人知的角落里却藏着__Array这货,我大胆猜测它是CCArray同父异母的兄弟,因为它有着和CCArray一样的功能。可惜的是,因为Vector的崛起,__Array注定只会埋没。

CCArray的遍历宏是CCARRAY_FOREACH(_array,_object),这种遍历方式是正想遍历,用for语句来解释就是从int i=0开始。用法如下:



view
sourceprint?

01.
auto
 sp = Sprite::create(
"close.png"
);
//建立俩精灵


02.
sp->setPosition(Point(
200
,
300
));


03.
this
->addChild(sp,
2
);


04.


05.
auto
 sp2 = Sprite::create(
"close.png"
);


06.
sp2->setPosition(Point(
300
,
300
));


07.
this
->addChild(sp2,
2
);


08.


09.
__Array*
 m_array = __Array::create();
//用__Array创建一个数组


10.
m_array->addObject(sp);
//将sp与sp2放入数组中


11.
m_array->addObject(sp2);


12.


13.
Ref*
 obj = nullptr;


14.
CCARRAY_FOREACH(m_array,obj)


15.
{


16.
auto
 sp_obj = static_cast<Sprite*>(obj);
//将obj强制转换成Sprite


17.
sp_obj->runAction(MoveBy::create(
3
.0f,Point(
250
,
250
)));
//运动


18.
}


当然了,有些人喜欢更刺激的方式,从后面来!有没有这种遍历呢?当然,CCARRAY_FOREACH_REVERSE(_array,_object)满足你所有的幻想。用某人的话来说就是:从后面来就是.痛!快!。事实真有这么痛快吗?赶紧试下不就知道了(前提是你要有一个女朋友...奇怪,我为什么会说到女朋友??)。



2、CCDictionary的遍历

我再次恳求你放下手里愤怒的西瓜刀!如果CCArray与__Array是同父异母,那么CCDictionary与__Dictionary就是同母异父了!

CCDictionary的遍历宏:CCDICT_FOREACH(_dic,_ele),用法如下:

view
sourceprint?

01.
__Dictionary*
 dic = __Dictionary::create();


02.
dic->setObject(sp,
"sp"
);
//将sp与sp2放入字典中,键分别为sp与sp2


03.
dic->setObject(sp2,
"sp2"
);


04.


05.
DictElement*
 ele;


06.
CCDICT_FOREACH(dic,ele)


07.
{


08.
auto
 sp_obj = static_cast<Sprite*>(ele->getObject());
//将ele强制转换成Sprite


09.
sp_obj->runAction(MoveBy::create(
3
.0f,Point(
250
,
250
)));


10.
}


3、Vector的"遍历"

Vector的遍历就涉及到C++11了,而一跟C++ 11扯上关系,意味着代码可以写的更简便,不信?看下面。





view
sourceprint?

1.
Vector<Sprite*>
 sp_vec;
//创建一个容器


2.
sp_vec.pushBack(sp);
//将俩精灵扔进去


3.
sp_vec.pushBack(sp2);


4.


5.
for
(
 auto sp_obj : sp_vec)


6.
{


7.
sp_obj->runAction(MoveBy::create(
3
.0f,Point(
250
,
250
)));
//每次for循环都从sp_vec容器中取出一个精灵


8.
}


一步到位有木有!如果对Vector的用法还不是很熟悉的童鞋,猛戳这里:http://blog.csdn.net/start530/article/details/19170853
4、Map的"遍历"

与Vector的遍历方式类似,但又有那么一些不一样的:





view
sourceprint?

01.
Map<std::string,Sprite*>
 sp_map;
//创建一个Map容器,键值分别为string型与Sprite类型


02.
sp_map.insert(
"sp"
,sp);
//将sp扔进去,


03.
sp_map.insert(
"sp2"
,sp2);


04.


05.
for
(
 auto e : sp_map)


06.
{


07.
auto
 sp_obj = e.second;
//e.first获得的是e的键值,e.second获得对象


08.
sp_obj->runAction(MoveBy::create(
3
.0f,Point(
250
,
250
)));


09.
}


对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对象中的字符每行一个输出出来:



view
sourceprint?

1.
std::string
 str(
"star530
 is so cool"
);


2.
//每行输出str中的一个字符


3.
for
(auto
 c : str)
//对于str中的每个字符


4.
cout
 << c << endl;
//输出当前字符,后面紧跟一个换行符


通过使用auto来确定c的类型(c的类型为char)。每次循环时,str的下一个字符被拷贝给c。



恩,就这样。

来源:http://blog.csdn.net/start530/article/details/22697167
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: