Cocos2dx3.0过渡篇 各种遍历与范围for语句的使用【转】

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。

时间: 2024-10-12 16:25:07

Cocos2dx3.0过渡篇 各种遍历与范围for语句的使用【转】的相关文章

Cocos2dx 3.0 过渡篇(三十一)ValueVector和Vector不得不说的故事

本文投票地址:http://vote.blog.csdn.net/Article/Details?articleid=37834689 前天看到一个颇为纠结的选择题:有一天你遇到一个外星人,这时外星人很热情的邀请你到他们星球去玩,你如何选 1:去,但是你有可能永远不能在回来.2:不去,但是外星人会消去你的记忆 这问题很刺激有木有?!看似简单的一个问题,不同的答案却隐藏着不同的含义.------------------鱼与熊掌不可兼得,类似这种例子生活中会经常碰到.同样的,如果你有去了解过Coco

Cocos2dx 3.0 过渡篇(二十九)globalZOrder()与localZOrder()

前天很难得的加班到八点...为什么说难得呢?因为平时我几乎就没加班过.六点下班后想走就走,想留就留.率直洒脱,不拘一格,尽显男儿本色.程序员,就是这么自信! -----------这篇博客的标题本想叫"...3.0新的渲染...介绍",最后还是拉不下这个脸.为啥?觉得自己对渲染的认识还是过于表面,谈不上理解.当然了,这并不影响这篇博客继续写下去.下面看一段3.0Release Notes 对于新渲染器的一段介绍: Node 增加了新的函数 setGlobalZOrder() / get

Cocos2dx 3.0 过渡篇(二十八)C++11强类型枚举

一朋友在微信朋友圈晒了张照片,随手点开大图,带着欣赏的眼光扫了下,恩,几个月不见,又漂亮了...咦?等等,她戴的这是什么?酷炫的造型!金属边框!微型摄像头!这不是传说中的谷歌眼镜么?土豪啊,还好我们已经是朋友了...我先给了她一个赞,然后直奔主题,霸气回复道:我过几天去找你,你戴的是谷歌眼镜吧,哼哼小样,不想死的话...就让我...摸一下下可以么,我不奢求戴,摸一下就满足了...(哎,丢人啊). ------------------- 在cocos2dx 3.0的文档里有这么一句话:以 k 开头

Cocos2dx 3.0 过渡篇(二十七)C++11多线程std::thread的简单使用(下)

本篇接上篇继续讲:上篇传送门:http://blog.csdn.net/star530/article/details/24186783 简单的东西我都说的几乎相同了,想挖点深的差点把自己给填进去. 以下实际演练一下.请同意我參考偶尔E往事的一篇线程的博客, 他用的是pThread.这里我就用std::thread. 1.售票孙鑫老师的C++和Java多线程售票也一直让我念念不忘(好吧,我承认我没看过).这里用cocos2d-x3.0和C++11的std::thread实现一个吧.总共同拥有10

Cocos2dx 3.0 过渡篇(二十五)死不了的贪食蛇(触摸版)

上一篇写的贪食蛇的重力感应控制版,这一篇就讲下触摸控制版吧.额,也不知道写了那个贪食蛇教程究竟有没有获得沈老师的书,假设没有的话,看我不拿西瓜刀砍掉 偶尔E往事 的那啥! 重力版链接:http://blog.csdn.net/start530/article/details/23707985 触摸版与重力版的代码大部分都一样,不一样的地方就是要将打开重力感应换成创建一个触摸监听.步骤例如以下: 1.在GameLayer的init()中创建一个触摸监听事件 [cpp] view plaincopy

Cocos2dx 3.0 过渡篇(三十二)话说ValueMap的一般使用

周末到厦门找死党聚聚,晚上一伙人杀到一还算凑合的大排档准备来个不醉不归.菜都点完了朋友突然说这里没有洗手间...尼玛,当时我们就不乐意了:喝五六个小时的啤酒,没有洗手间你是打算憋死谁?二话不说直接换一家,不过这次一定要谨慎选择,最终看到一家看起来还算正宗的大排档,我下意识拨了下头发,走到前台MM面前,轻声问道:你们这...有洗手间吗? 声音低沉且性感,语调中还夹带着些许的忧伤. 前台MM瞪大眼睛,好一会才反应过来说道:洗手间?肯定有啊! ----------------------------

Cocos2d-x3.0游戏实例之《别救我》第九篇——从tmx文件中加载关卡怪物

上一篇我们已经制作好tg1.tmx文件了,现在就要使用它了. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www.benmutou.com/blog/archives/944 文章来源:笨木头与游戏开发 很抱歉,我们又要新建2个类了,我已经尽力少新建类了,毕竟是教程,类越多越容易混乱. 我们要新建一个Monster类,以及一个MonsterLayer类,专门添加Monster对象. Monster类 来看看Monster.h文件: #ifndef Monste

Cocos2d-x3.0游戏实例之《别救我》第十篇(完结)——用Json配置各类型怪物数据

现在我们有2种类型的怪物,而且创建的时候是写死在代码里的,这是要作死的节奏~ 所以,必须可配置,不然会累死人的. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www.benmutou.com/blog/archives/949  文章来源:笨木头与游戏开发 Json文件 什么是Json文件?说白了,它就是一个文本文档,只不过它的内容是按照一定的规则填写的. 于是,我们就可以按照那个规则去读取这份文档. 这,就是配置文件产生的缘由(才怪). (小若:才怪是什么意

Cocos2d-x3.0游戏实例之《别救我》第一篇——前言

我们能学到什么? 这是一个很简单的游戏,但是用到的东西比较多(对新手而言),起码,对于一个实例来说,它涉及的确实有点多. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址:http://www.benmutou.com/blog/archives/797 文章来源:笨木头与游戏开发 通过这个游戏实例,可爱的你(小若:那不可爱的人呢?),可以学到以下知识点: 1. Cocos2d-x3.0物理引擎的简单使用 2. 读取Json文件作为怪物和物品配置 3. 利用Tiled地图实现可视化