Cocos2dx 3.0 过渡篇(八)浅谈容器Vector
来源:互联网 发布:php在线客服系统源码 编辑:程序博客网 时间:2024/05/22 17:38
下面我就以创建 Sprite 精灵对象的容器为例介绍吧
1、创建
先创建两个精灵:
- auto sp1 = Sprite::create("CloseNormal.png");
- sp1->setPosition(Point(100,100));
- this->addChild(sp1,1);
- auto sp2 = Sprite::create("CloseSelected.png");
- sp2->setPosition(Point(100,200));
- this->addChild(sp2,1);
创建容器
- Alpha:
- auto sp_array = Array::create();
- beta:
- Vector<Sprite*> sp_vec;
2、将创建好的精灵添加进容器中
- Alpha:
- sp_array->addObject(sp1);
- sp_array->addObject(sp2);
- beta:
- sp_vec.pushBack(sp1);//和 堆栈 一样一样的
- sp_vec.pushBack(sp2);
3、获得容器中的大小
- Alpha:
- int count = sp_array->count();
- beta:
- int count = sp_vec.size();
4、获得容器中的精灵,并让这些元素都做统一的动作
- Alpha:
- for(int i=0;i<sp_array->count();i++)
- {
- auto sp = (Sprite*)sp_array->getObjectAtIndex(i);
- sp->runAction(MoveTo::create(0.2f,Point(100,100)));
- }
- beta:
- for( auto& e : sp_vec)
- {
- e->runAction(MoveTo::create(0.2f,Point(100,100)));//这种for写法是C++ 11的新特性
- }
5、删除容器中的精灵
- //如果是要删除容器中最后一个精灵的话:
- Alpha:
- sp_array->removeLastObject();
- beta:
- sp_vec.popBack();
- //如果是直接删除对象:
- Alpha:
- sp_array->removeObject(sp1);
- beta:
- sp_vec.eraseObject(sp1);
- //如果是要删除容器中全部的对象:
- Alpha:
- sp_array->removeAllObject();
- beta:
- sp_vec.clear();
6、其他
”说破不值钱“,其实Vector也就那样啦,恩,那样...最后补充一些其他的用法:
- //a 在容器中的任何一个位置插入对象:
- sp_vec.pushBack(sp1);
- sp_vec.pushBack(sp2);
- //目前的情况是,sp1在容器的第一个位置,sp2在容器的第二个位置,这时候我们要将sp3放入第一个位置:
- sp_vec.insert(0,sp3);//ok
- //b 查找容器中的对象:
- //1、假设不知道容器中是否有sp3这个精灵,这时候可以这样:
- sp_vec.contains(sp3);//如果有,返回true,无返回false;
- //2、已知容器中有sp3这个精灵,想获得它在容器中的位置:
- int pos_int = sp_vec.find(sp3);
- //上面的方法可以获得sp3的位置,但返回的其实是迭代器的地址,你得到的结果可能是45214等等,如果想获得正常需要的位置,可以这样:
- int pos_int = sp_vec.find(sp3) - sp_vec.begin();//ok
下面介绍一些常用的遍历。
1、CCArray的遍历看到这里,有些人又按耐不住的要举起西瓜刀了:你不是说3.0beta后已经没有CCArray这货了吗?现在又拿出来作甚?
其实我也很无辜,CCArray确实是没了,但在某个不为人知的角落里却藏着__Array这货,我大胆猜测它是CCArray同父异母的兄弟,因为它有着和CCArray一样的功能。可惜的是,因为Vector的崛起,__Array注定只会埋没。
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)));//运动
- }
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)));
- }
Vector的遍历就涉及到C++11了,而一跟C++ 11扯上关系,意味着代码可以写的更简便,不信?看下面。
- 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
与Vector的遍历方式类似,但又有那么一些不一样的:
- 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; //输出当前字符,后面紧跟一个换行符
- Cocos2dx 3.0 过渡篇(八)浅谈容器Vector
- Cocos2dx 3.0 过渡篇(八)浅谈容器Vector
- Cocos2dx 3.0 过渡篇(八)浅谈容器Vector
- Cocos2dx 3.0 过渡篇(八)浅谈容器Vector
- Cocos2dx 3.0 过渡篇(八)浅谈容器Vector
- Cocos2dx 3.0 过渡篇(八)浅谈容器Vector
- Cocos2dx 3.0 过渡篇(八)浅谈容器Vector
- Cocos2dx 3.0 提高篇(八)浅谈容器Vector
- Cocos2dx 3.0 过渡篇(九)浅谈容器Map
- Cocos2dx 3.0 过渡篇(九)浅谈容器Map
- Cocos2dx 3.0 过渡篇(九)浅谈容器Map
- Cocos2dx 3.0 过渡篇(九)浅谈容器Map
- 浅谈容器Vector ,话说ValueMap的一般使用。Cocos2dx 3.0 过渡篇
- Cocos2dx 3.0 过渡篇(三十一)ValueVector和Vector不得不说的故事
- Cocos2dx 3.0 过渡篇(三十一)ValueVector和Vector不得不说的故事
- Cocos2dx 3.0 过渡篇
- Cocos2dx 3.0 提高篇(九)浅谈容器Map
- cocos2dx 2.0-3.0 过渡篇
- 【VC++】如何最大化对话框
- C++之动态绑定和静态绑定
- C#字符串压缩&解压
- WinCE注册表--创建、打开、读写、关闭
- Emacs 键绑定的格局
- Cocos2dx 3.0 过渡篇(八)浅谈容器Vector
- CXF+Spring+Tomcat简明示例
- 关于UITableViewCell的方法及属性
- js
- vi中查找和替换文字
- sqlserver数据库置疑解决
- phonegap登录功能
- 分组对称加密模式:ECB/CBC/CFB/OFB
- hive调优