【amazing cocos2d-x 3.0之二十】游戏存档之CCUserDefault,XML

游戏存档——保存数据,在游戏过程中是很重要的一件事情,特别对于单机游戏。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>

很熟悉吧?没错,这就是最后修改的数据。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值