游戏存档——保存数据,在游戏过程中是很重要的一件事情,特别对于单机游戏。cocos2d-x中支持的游戏存档类CCUserDefault可以作为一个轻量化的数据库来使用。它支持存储的数据类型包括bool(布尔型)、 int(整型)、 float(浮点型)、 double(双精度浮点型)、 string(字符串型)。
1. CCUserDefault类的常用函数
CCUserDefault类的常用函数如下:
函数名 返回类型 描述
getBoolForKey 布尔型 根据传入的键值参数返回相应的布尔值,第二个参数为可选的默认值,
如果该键值的值不存在,将返回默认值
getIntegerForKey 整型 根据传入的键值参数返回相应的整型值,第二个参数为可选的默认值,
如果该键值的值不存在,将返回默认值
getFloatForKey 浮点型 根据传入的键值参数返回相应的浮点值,第二个参数为可选的默认值,
如果该键值的值不存在,将返回默认值
getDoubleForKey 双精度浮点型 根据传入的键值参数返回相应的双精度浮点型值,第二个参数为可选的
默认值,如果该键值的值不存在,将返回默认值
getStringForKey 字符串型 根据传入的键值参数返回相应的字符串值,第二个参数为可选的默认值,
如果该键值的值不存在,将返回默认值
setBoolForKey 空 第一个参数为键,第二个参数为对应的值,布尔型存档
setIntergerForKey 空 第一个参数为键,第二个参数为对应的值,整型存档
setFloatForKey 空 第一个参数为键,第二个参数为对应的值,浮点型存档
setDoubleForKey 空 第一个参数为键,第二个参数为对应的值,双精度浮点型存档
setStringForKey 空 第一个参数为键,第二个参数为对应的值,字符串型存档
flush 空 存储为XML文档
2. 实例代码
按照惯例,我们还是来看源代码。
运行TestCpp,打开UserDefaultTest,如下图所示:
让我们来看一下源代码,然后再解释一下:
UserDefaultTest.h
#ifndef _USERDEFAULT_TEST_H_
#define _USERDEFAULT_TEST_H_
#include "cocos2d.h"
#include "../testBasic.h"
class UserDefaultTest : public CCLayer
{
public:
UserDefaultTest();
~UserDefaultTest();
private:
void doTest();
};
class UserDefaultTestScene : public TestScene
{
public:
virtual void runThisTest();
};
#endif // _USERDEFAULT_TEST_H_
UserDefaultTest.cpp
// enable log
#define COCOS2D_DEBUG 1
#include "UserDefaultTest.h"
#include "stdio.h"
#include "stdlib.h"
UserDefaultTest::UserDefaultTest()
{
CCSize s = CCDirector::sharedDirector()->getWinSize();
CCLabelTTF* label = CCLabelTTF::create("CCUserDefault test see log", "Arial", 28);
addChild(label, 0);
label->setPosition( ccp(s.width/2, s.height-50) );
doTest();
}
void UserDefaultTest::doTest()
{
CCLOG("********************** init value ***********************");
// set default value
CCUserDefault::sharedUserDefault()->setStringForKey("string", "value1");
CCUserDefault::sharedUserDefault()->setIntegerForKey("integer", 10);
CCUserDefault::sharedUserDefault()->setFloatForKey("float", 2.3f);
CCUserDefault::sharedUserDefault()->setDoubleForKey("double", 2.4);
CCUserDefault::sharedUserDefault()->setBoolForKey("bool", true);
// print value
string ret = CCUserDefault::sharedUserDefault()->getStringForKey("string");
CCLOG("string is %s", ret.c_str());
double d = CCUserDefault::sharedUserDefault()->getDoubleForKey("double");
CCLOG("double is %f", d);
int i = CCUserDefault::sharedUserDefault()->getIntegerForKey("integer");
CCLOG("integer is %d", i);
float f = CCUserDefault::sharedUserDefault()->getFloatForKey("float");
CCLOG("float is %f", f);
bool b = CCUserDefault::sharedUserDefault()->getBoolForKey("bool");
if (b)
{
CCLOG("bool is true");
}
else
{
CCLOG("bool is false");
}
//CCUserDefault::sharedUserDefault()->flush();
CCLOG("********************** after change value ***********************");
// change the value
CCUserDefault::sharedUserDefault()->setStringForKey("string", "value2");
CCUserDefault::sharedUserDefault()->setIntegerForKey("integer", 11);
CCUserDefault::sharedUserDefault()->setFloatForKey("float", 2.5f);
CCUserDefault::sharedUserDefault()->setDoubleForKey("double", 2.6);
CCUserDefault::sharedUserDefault()->setBoolForKey("bool", false);
CCUserDefault::sharedUserDefault()->flush();
// print value
ret = CCUserDefault::sharedUserDefault()->getStringForKey("string");
CCLOG("string is %s", ret.c_str());
d = CCUserDefault::sharedUserDefault()->getDoubleForKey("double");
CCLOG("double is %f", d);
i = CCUserDefault::sharedUserDefault()->getIntegerForKey("integer");
CCLOG("integer is %d", i);
f = CCUserDefault::sharedUserDefault()->getFloatForKey("float");
CCLOG("float is %f", f);
b = CCUserDefault::sharedUserDefault()->getBoolForKey("bool");
if (b)
{
CCLOG("bool is true");
}
else
{
CCLOG("bool is false");
}
}
UserDefaultTest::~UserDefaultTest()
{
}
void UserDefaultTestScene::runThisTest()
{
CCLayer* pLayer = new UserDefaultTest();
addChild(pLayer);
CCDirector::sharedDirector()->replaceScene(this);
pLayer->release();
}
分析:
这个实例其实很简单,首先把一组值存入CCUserDefault类中,然后获得值并把它们输出,然后再修改之前存入的那组值,然后再次获得值并输出。
要注意的一点是,所有的存档操作在调用flush后才有效。
接下来我们来看一下程序的结果,也就是控制台的输出:
在Win32平台上,XML文件在cocos2d-x目录下的Debug.win32目录下,UserDefault.xml的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<userDefaultRoot>
<string>value2</string>
<integer>11</integer>
<float>2.500000</float>
<double>2.600000</double>
<bool>false</bool>
</userDefaultRoot>
很熟悉吧?没错,这就是最后修改的数据。