首页 > 代码库 > cocos2d-x中的简单的数据存储

cocos2d-x中的简单的数据存储

Cocos2d-x中的数据存储方式很多,下面我来简单的介绍几种,有说的不准确的地方,大家指出来吧,共同学习进步。谢谢!


首先介绍的是  UserDefault 这个类:

//用userdefault进行数据存储
	
	UserDefault::getInstance()->setStringForKey("testKey","testValue");//将String类型的数据存储起来
	//读取上面写入的数据
	std::string val = UserDefault::getInstance()->getStringForKey("testKey");//通过key来读取value
	log("%s",val.c_str());

	/************************************************************************/
	/*当然还有 int float 等等类型的存储,我就不多说了。                                                                     */
	/************************************************************************/
	
下面说一下简单的应用:保存游戏当前的状态,来个例子吧:

testUseDefault();

	/************************************************************************/
	/* 通过点击屏幕上面的精灵,移动精灵到新的位置,然后关闭程序,再次打开程序后,精灵在刚刚关闭前 移动后的位置                                                                     */
	/************************************************************************/

	//监听点击事件
	auto listen = EventListenerTouchOneByOne::create();
	listen->onTouchBegan =[=](Touch *t,Event *e){
		startPos = t->getLocation();//获取当前点击的位置的坐标
		auto spPos = sp->getPosition();
		//判断是否点击了屏幕上的精灵
		if (sp->getBoundingBox().containsPoint(startPos)){
			return true;//点击在精灵上面
		}else
		{
			return false;
		}

	};
	listen->onTouchMoved = [=](Touch *t,Event *e){
		endPos = t->getLocation();
		sp->setPosition(endPos);//时刻改变精灵的位置
	};
	listen->onTouchEnded = [=](Touch *t,Event *e){
		endPos = sp->getPosition();

		//将当前精灵的位置存储起来
		UserDefault::getInstance()->setFloatForKey("posx",endPos.x);
		UserDefault::getInstance()->setFloatForKey("posy",endPos.y);
		UserDefault::getInstance()->flush();//将数据立刻写入


	};
	//事件分发
	Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listen,this);
void DataSaveLayer::testUseDefault(){
		
		float posx = UserDefault::getInstance()->getFloatForKey("posx");
		float posy = UserDefault::getInstance()->getFloatForKey("posy");

		sp->setPosition(Vec2(posx,posy));
	
}

好了,UserDefault 这个类就说道这里吧。下面是 XML的读取

先来个XML文件吧,就按照这个读取(例子而已)

<Persons>  
    <Person ID="1" TYPE="W">
        <name>关羽</name>  
        <attack>120</attack>  
    </Person>  
    <Person ID="2" TYPE="R">
        <name>吕布</name>  
        <attack>160</attack>  
    </Person> 
	<Person ID="3" TYPE="Q">
        <name>马建杰</name>  
        <attack>260</attack>  
    </Person> 
</Persons>

/************************************************************************/
/* 解析XML文件的思路:
    1. 获取到文件路径,创建解析器xmlDoc
	2. 获取根节点Person
	3. 取到子节点,然后取子节点的属性
	
	
	*/
/************************************************************************/
void DataSaveLayer::testXML(){
	
	auto xmlFileName = FileUtils::getInstance()->fullPathForFilename("test.xml");//得到文件的位置
	log("%s",xmlFileName.c_str());//验证是否正确

	tinyxml2::XMLDocument xmlDoc;//声明一个解析器
	xmlDoc.LoadFile(xmlFileName.c_str());//将文件盒解析器。。

	XMLElement *root = xmlDoc.RootElement();//获取根节点

	XMLElement *person = root->FirstChildElement();//拿到根节点的子节点person
	
	XMLElement *name = person->FirstChildElement();//拿到根节点的子节点的子节点(关羽)    ps: 好绕口啊
		log("%s",name->GetText());
	XMLElement *attack = person->FirstChildElement("attack");
		log("%d",atoi(attack->GetText()));

	//取属性
	log("ID :%d",person->IntAttribute("ID"));//取根节点的子节点(Person)的属性
	log("TYPE :%s",person->Attribute("TYPE"));


	//取第二个 子节点
	XMLElement *person2 = person->NextSiblingElement("Person");

	XMLElement *name2 = person2->FirstChildElement();
	log("Name : %s",name2->GetText());
	XMLElement *attack2 = person2->FirstChildElement("attack");
	log("attack : %d",atoi(attack2->GetText()));

	log("ID :%d",person2->IntAttribute("ID"));
	log("TYPE : %s",person2->Attribute("TYPE"));


}


好了,下面介绍一下 怎么创建XML

//创建xml文件
/************************************************************************/
/* 创建XML文件的步骤:
	1.首先创建一个XML的解析器
	2.用解析器创建一个节点作为根节点,用解析器创建 值 作为 根节点的值
	3.用解析器创建一个节点作为根节点的子节点,用解析器创建 值 作为 根节点的子节点的值     好绕口。。
	4.设置子节点的属性
	5.同理。。。。创建第二个。。。第三个。。


*/
/************************************************************************/

tinyxml2::XMLDocument *doc = new tinyxml2::XMLDocument();

XMLElement *root = doc->NewElement("Role");//创建一个节点
doc->LinkEndChild(root);//添加这个子节点作为最后一个孩子节点

auto sf = doc->NewElement("SF");  //解析器创建一个节点
root->LinkEndChild(sf);//让这个子节点作为 root最后的孩子节点
auto text = doc->NewText("majianjie");//sf显示的
sf->LinkEndChild(text);
//添加属性
sf->SetAttribute("attack",43);
sf->SetAttribute("hujia",4);
sf->SetAttribute("speed",305);
sf->SetAttribute("hp",495);



auto dabaojian = doc->NewElement("dabaojian");
root->LinkEndChild(dabaojian);
auto text1 = doc->NewText("daboajian");
dabaojian->LinkEndChild(text1);
//为dabaojian 添加属性
dabaojian->SetAttribute("ada",342);
dabaojian->SetAttribute("ads",343);
dabaojian->SetAttribute("add",344);

//取得可写的路径
auto fileName = FileUtils::getInstance()->getWritablePath()+"Dota.xml";//创建的XML文件就是 Dota.xml

doc->SaveFile(fileName.c_str());//执行创建命令


执行创建命令后,会在proj.win32\Debug.win32目录下面创建 Dota.xml 的文件,显示如下:




 明天再介绍json的相关内容吧。谢谢!





cocos2d-x中的简单的数据存储