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));
}
先来个XML文件吧,就按照这个读取(例子而已)
关羽
120
吕布
160
马建杰
260
/************************************************************************/
/* 解析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文件的步骤:
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 的文件,显示如下: