游戏存档——保存数据,在游戏过程中是很重要的一件事情,特别对于单机游戏。cocos2d-x中支持的游戏存档类CCUserDefault可以作为一个轻量化的数据库来使用。它支持存储的数据类型包括bool(布尔型)、 int(整型)、 float(浮点型)、 double(双精度浮点型)、 string(字符串型)。
CCUserDefault类的常用函数如下:
函数名 返回类型 描述
getBoolForKey 布尔型 根据传入的键值参数返回相应的布尔值,第二个参数为可选的默认值,
如果该键值的值不存在,将返回默认值
getIntegerForKey 整型 根据传入的键值参数返回相应的整型值,第二个参数为可选的默认值,
如果该键值的值不存在,将返回默认值
getFloatForKey 浮点型 根据传入的键值参数返回相应的浮点值,第二个参数为可选的默认值,
如果该键值的值不存在,将返回默认值
getDoubleForKey 双精度浮点型 根据传入的键值参数返回相应的双精度浮点型值,第二个参数为可选的
默认值,如果该键值的值不存在,将返回默认值
getStringForKey 字符串型 根据传入的键值参数返回相应的字符串值,第二个参数为可选的默认值,
如果该键值的值不存在,将返回默认值
setBoolForKey 空 第一个参数为键,第二个参数为对应的值,布尔型存档
setIntergerForKey 空 第一个参数为键,第二个参数为对应的值,整型存档
setFloatForKey 空 第一个参数为键,第二个参数为对应的值,浮点型存档
setDoubleForKey 空 第一个参数为键,第二个参数为对应的值,双精度浮点型存档
setStringForKey 空 第一个参数为键,第二个参数为对应的值,字符串型存档
flush 空 存储为XML文档
按照惯例,我们还是来看源代码。
运行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_
// 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>