1.1 使用UserDefault

UserDefault是Cocos2d-x提供的一个用于游戏存档的工具类,以Key-Value的形式存储字符串Key对应的各种Value,可以存储bool、int、float、double、字符串以及二进制数据。UserDefault底层的存储使用了XML文件格式,对于二进制数据,是通过base64编码转成字符串之后存储,读取内存数据时,通过base64解码将存储在XML中的base64字符串解析为内存数据。

XML存储的路径位于FileUtils::getInstance()->getWritablePath路径下,getWritablePath会返回一个可写路径,这个路径的位置视操作系统而定,并不是随便哪个路径都可以写入文件。默认的文件名为UserDefault.xml,可以将getWritablePath获得的路径打印出来,然后在该路径下找到存档文件,进行修改。

cpp-tests示例中的UserDefaultTest演示了UserDefault的用法,通过UserDefault::getInstance()获取单例对象,然后调用各种get()、set()方法来进行操作,大多数的get()方法支持传入一个默认值,当不能获取这个Key时,自动写入默认值,并返回这个默认值,如果该Key已经存在,则直接返回该Key对应的值。set()方法可以设置一个Key的值,当调用完set()方法之后,应该再调用一下UserDefault的flush方法来确保写入的内容进入磁盘中(多次set操作对应一次flush操作)。接下来简单了解一下UserDefault提供的接口。

        //传入指定的Key,获取一个bool值
        bool getBoolForKey(const char* key);
        //传入指定的Key和默认值,获取一个bool值,如果获取不到,则设置Key为默认值,并返回
        默认值
        virtual bool getBoolForKey(const char* key, bool defaultValue);
        //传入指定的Key,获取一个int值
        int getIntegerForKey(const char* key);
        //传入指定的Key和默认值,获取一个int值,如果获取不到,则设置Key为默认值,并返回默
        认值
        virtual int getIntegerForKey(const char* key, int defaultValue);
        //传入指定的Key,获取一个float值
        float getFloatForKey(const char* key);
        //传入指定的Key和默认值,获取一个float值,如果获取不到,则设置Key为默认值,并返回
        默认值
        virtual float getFloatForKey(const char* key, float defaultValue);
        //传入指定的Key,获取一个double值
        double getDoubleForKey(const char* key);
        //传入指定的Key和默认值,获取一个double值,如果获取不到,则设置Key为默认值,并返
        回默认值
        virtual double getDoubleForKey(const char* key, double defaultValue);
        //传入指定的Key,获取一个字符串
        std::string getStringForKey(const char* key);
        //传入指定的Key和默认值,获取一个字符串,如果获取不到,则设置Key为默认值,并返回默
        认值
        virtual std::string getStringForKey(const char* key, const std::string &
        defaultValue);
        //传入指定的Key,获取一个Data值
        Data getDataForKey(const char* key);
        //传入指定的Key和默认值,获取一个Data值,如果获取不到,则设置Key为默认值,并返回
        默认值
        virtual Data getDataForKey(const char* key, const Data& defaultValue);

        //设置指定的Key为传入的bool值
        virtual void setBoolForKey(const char* key, bool value);
        //设置指定的Key为传入的int值
        virtual void setIntegerForKey(const char* key, int value);
        //设置指定的Key为传入的float值
        virtual void setFloatForKey(const char* key, float value);
        //设置指定的Key为传入的double值
        virtual void setDoubleForKey(const char* key, double value);
        //设置指定的Key为传入的字符串
        virtual void setStringForKey(const char* key, const std::string & value);
        //设置指定的Key为传入的Data值
        virtual void setDataForKey(const char* key, const Data& value);

        //当调用了setXXXForKey之后,需要调用该方法进行刷新
        virtual void flush();
        //删除指定的Key
        virtual void deleteValueForKey(const char* key);
        //获取单例对象
        static UserDefault* getInstance();
        //释放单例对象
        static void destroyInstance();

具体的实现中,UserDefault使用了tinyxml这个库来进行XML文件的读写操作,对具体细节感兴趣的读者可以自行查看UserDefault的实现。