Cocos2d-x之数据的处理

|   版权声明:本文为博主原创文章,未经博主允许不得转载。

FileUtils

    在游戏中,用户要保存自己的偏好设置和玩家的信息,都需要涉及到游戏数据的处理。首先要想处理数据,则要找到文件,创建文件,读写文件...;在Cocos2d-x中有一个类FileUtils,FileUtils是Cocos2d-x引擎中封装的一个简单的文件操作类,该类几乎实现了所有文件操作的功能,类FileUtils并不只是一个文件,也不是两个文件。在每个平台都会有一个FileUtils的头文件和实现文件。在游戏的开始阶段,游戏的文件资源一般都是存放在硬盘中,在游戏开始的时候,文件操作模块就会将硬盘中的资源转移到内存中。

在游戏中文件的读取分为三个部分:

    1. 资源存放在硬盘中

    2. 资源存放在内存中

    3. 资源存放在缓存中

                 

 API常用函数介绍:

  1 /**  Gets the instance of FileUtils.获得文件模块的单例对象 */
  2 static FileUtils* getInstance();
  3 /**  Destroys the instance of FileUtils.释放文件模块*/
  4 static void destroyInstance(); 
  5 /**     清空缓存
  6 *  Purges full path caches.
  7 */
  8 virtual void purgeCachedEntries();
  9 /**     从文件中获取字符串。
 10 *  Gets string from a file.
 11 */
 12 virtual std::string getStringFromFile(const std::string& filename);
 13 /** 获得资源文件的内容
 14 *  Creates binary data from a file.
 15 *  @return A data object.
 16 */
 17 virtual Data getDataFromFile(const std::string& filename);
 18 /** 获取资源文件数据
 19 *  Gets resource file data
 20 *  @param[in]  filename The resource file name which contains the path.
 21 *  @param[in]  mode The read mode of the file.
 22 *  @param[out] size If the file read operation succeeds, it will be the data size, otherwise 0.
 23 *  @return Upon success, a pointer to the data is returned, otherwise NULL.
 24 *  @warning Recall: you are responsible for calling free() on any Non-NULL pointer returned.
 25 */
 26 CC_DEPRECATED_ATTRIBUTE virtual unsigned char* getFileData(const std::string& filename, const char* mode, ssize_t *size);
 27 /**     从zip文件中获得资源文件的内容
 28 *  Gets resource file data from a zip file.
 29 *  @param[in]  filename The resource file name which contains the relative path of the zip file.
 30 *  @param[out] size If the file read operation succeeds, it will be the data size, otherwise 0.
 31 *  @return Upon success, a pointer to the data is returned, otherwise nullptr.
 32 *  @warning Recall: you are responsible for calling free() on any Non-nullptr pointer returned.
 33 */
 34 virtual unsigned char* getFileDataFromZip(const std::string& zipFilePath, const std::string& filename, ssize_t *size);
 35 /** 获得一个文件的绝对路径,返回值为文件的绝对路径(通过文件名查找文件,并将它所在的路径返回)
 36 *       Returns the fullpath for a given filename.
 37 */
 38 virtual std::string fullPathForFilename(const std::string &filename) const;
 39 /** 通过一个文件名在字典容器中查找文件
 40 * Loads the filenameLookup dictionary from the contents of a filename.
 41 * @note The plist file name should follow the format below:
 42 */
 43 virtual void loadFilenameLookupDictionaryFromFile(const std::string &filename);
 44 /** 设置一个按文件名查找的字典。
 45 *  Sets the filenameLookup dictionary.
 46 *  @param pFilenameLookupDict The dictionary for replacing filename.
 47 */
 48 virtual void setFilenameLookupDictionary(const ValueMap& filenameLookupDict);
 49 /**     获得一个文件的绝对路径包含文件名
 50 *  Gets full path from a file name and the path of the relative file.
 51 */
 52 virtual std::string fullPathFromRelativeFile(const std::string &filename, const std::string &relativeFile);
 53 /**     设置数组容器内所包含的资源的搜索顺序。
 54 *  Sets the array that contains the search order of the resources.
 55 *  @param searchResolutionsOrder The source array that contains the search order of the resources.
 56 *  @see getSearchResolutionsOrder(), fullPathForFilename(const char*).
 57 */
 58 virtual void setSearchResolutionsOrder(const std::vector<std::string>& searchResolutionsOrder);
 59 /**     追加资源的搜索顺序。
 60 * Append search order of the resources.
 61 * @see setSearchResolutionsOrder(), fullPathForFilename().
 62 */
 63 virtual void addSearchResolutionsOrder(const std::string &order,const bool front=false);
 64 /**     获取数组中所包含的资源的搜索顺序
 65 *  Gets the array that contains the search order of the resources.
 66 *  @see setSearchResolutionsOrder(const std::vector<std::string>&), fullPathForFilename(const char*).
 67 */
 68 virtual const std::vector<std::string>& getSearchResolutionsOrder() const;
 69 /**     设置资源路径
 70 *  Sets the array of search paths.
 71 */
 72 virtual void setSearchPaths(const std::vector<std::string>& searchPaths);
 73 /**     设置默认资源的根路径。
 74 * Set default resource root path.
 75 */
 76 void setDefaultResourceRootPath(const std::string& path);
 77 /**     添加搜索路径。
 78 * Add search path.
 79 */
 80 void addSearchPath(const std::string & path, const bool front=false);
 81 /** 获取的搜索路径的数组。
 82 *  Gets the array of search paths.
 83 */
 84 virtual const std::vector<std::string>& getSearchPaths() const;
 85 /**     获取可写的路径。
 86 *  Gets the writable path.
 87 *  @return  The path that can be write/read a file in
 88 */
 89 virtual std::string getWritablePath() const = 0;
 90 /**     设置可写的路径。
 91 *  Sets writable path.
 92 */
 93 virtual void setWritablePath(const std::string& writablePath);
 94 /**     设置在无法加载图像时候是否弹出一个消息框。
 95 *  Sets whether to pop-up a message box when failed to load an image.
 96 */
 97 virtual void setPopupNotify(bool notify);
 98 /** 检查在无法加载图像的时候是否弹出一个消息框。
 99 *       Checks whether to pop up a message box when failed to load an image.
100 *  @return True if pop up a message box when failed to load an image, false if not.
101 */
102 virtual bool isPopupNotify() const;
103 /**     文件到ValueMap的内容转换。(将文件中的内容转换成ValueMap类型)
104 *  Converts the contents of a file to a ValueMap.
105 *  @param filename The filename of the file to gets content.
106 *  @return ValueMap of the file contents.
107 *  @note This method is used internally.
108 */
109 virtual ValueMap getValueMapFromFile(const std::string& filename);
110 /** Converts the contents of a file to a ValueMap.
111 *  This method is used internally.
112 */
113 virtual ValueMap getValueMapFromData(const char* filedata, int filesize);
114 /**     写一个内容为ValueMap类型的plist文件
115 * write a ValueMap into a plist file
116 *@param dict the ValueMap want to save
117 *@param fullPath The full path to the file you want to save a string
118 *@return bool
119 */
120 virtual bool writeToFile(ValueMap& dict, const std::string& fullPath);
121 /** 写一个内容为String类型的.plist文件
122 *  write a string into a file
123 * @param dataStr the string want to save
124 * @param fullPath The full path to the file you want to save a string
125 * @return bool True if write success
126 */
127 virtual bool writeStringToFile(std::string dataStr, const std::string& fullPath);
128 /**
129 * write Data into a file
130 *@param retData the data want to save
131 *@param fullPath The full path to the file you want to save a string
132 *@return bool
133 */
134 virtual bool writeDataToFile(Data retData, const std::string& fullPath);
135 /**
136 * write ValueMap into a plist file
137 *@param dict the ValueMap want to save
138 *@param fullPath The full path to the file you want to save a string
139 *@return bool
140 */
141 virtual bool writeValueMapToFile(ValueMap& dict, const std::string& fullPath);
142 /**
143 * write ValueVector into a plist file
144 *@param vecData the ValueVector want to save
145 *@param fullPath The full path to the file you want to save a string
146 *@return bool
147 */
148 virtual bool writeValueVectorToFile(ValueVector vecData, const std::string& fullPath);
149 /**
150 * Windows fopen can't support UTF-8 filename
151 * Need convert all parameters fopen and other 3rd-party libs
152 * @param filename std::string name file for conversion from utf-8
153 * @return std::string ansi filename in current locale
154 */
155 virtual std::string getSuitableFOpen(const std::string& filenameUtf8) const;
156 // Converts the contents of a file to a ValueVector.
157 // This method is used internally.
158 virtual ValueVector getValueVectorFromFile(const std::string& filename);
159 /**     判断文件是否存在
160 *  Checks whether a file exists.
161 *  @note If a relative path was passed in, it will be inserted a default root path at the beginning.
162 *  @param filename The path of the file, it could be a relative or absolute path.
163 *  @return True if the file exists, false if not.
164 */
165 virtual bool isFileExist(const std::string& filename) const;
166 /** 获取文件的扩展名是在较低的情况下的后缀(由点从基本文件名隔开)。
167 *  Gets filename extension is a suffix (separated from the base filename by a dot) in lower case.
168 *  Examples of filename extensions are .png, .jpeg, .exe, .dmg and .txt.
169 *  @param filePath The path of the file, it could be a relative or absolute path.
170 *  @return suffix for filename in lower case or empty if a dot not found.
171 */
172 virtual std::string getFileExtension(const std::string& filePath) const;
173 /**     检查路径是否是绝对路径。
174 *  Checks whether the path is an absolute path.t.
175 */
176 virtual bool isAbsolutePath(const std::string& path) const;
177 /**检查路径是否是一个目录。
178 *  Checks whether the path is a directory.
179 *  @param dirPath The path of the directory, it could be a relative or an absolute path.
180 *  @return True if the directory exists, false if not.
181 */
182 virtual bool isDirectoryExist(const std::string& dirPath) const;
183 /**     创建一个字典目录
184 *  Creates a directory.
185 *  @param dirPath The path of the directory, it must be an absolute path.
186 *  @return True if the directory have been created successfully, false if not.
187 */
188 virtual bool createDirectory(const std::string& dirPath);
189 /**     移除一个目录
190 *  Removes a directory.
191 *  @param dirPath  The full path of the directory, it must be an absolute path.
192 *  @return True if the directory have been removed successfully, false if not.
193 */
194 virtual bool removeDirectory(const std::string& dirPath);
195 /**     移除一个文件
196 *  Removes a file.
197 *  @param filepath The full path of the file, it must be an absolute path.
198 *  @return True if the file have been removed successfully, false if not.
199 */
200 virtual bool removeFile(const std::string &filepath);
201 /**     给指定目录下的文件重命名
202 *  Renames a file under the given directory.
203 *  @param path     The parent directory path of the file, it must be an absolute path.
204 *  @param oldname  The current name of the file.
205 *  @param name     The new name of the file.
206 *  @return True if the file have been renamed successfully, false if not.
207 */
208 virtual bool renameFile(const std::string &path, const std::string &oldname, const std::string &name);
209 /** 给指定目录下的文件重命名
210 *  Renames a file under the given directory.
211 *  @param oldfullpath  The current fullpath of the file. Includes path and name.
212 *  @param newfullpath  The new fullpath of the file. Includes path and name.
213 *  @return True if the file have been renamed successfully, false if not.
214 */
215 
216 virtual bool renameFile(const std::string &oldfullpath, const std::string &newfullpath);
217 /**     检索文件的大小
218 *  Retrieve the file size.
219 *  @note If a relative path was passed in, it will be inserted a default root path at the beginning.
220 *  @param filepath The path of the file, it could be a relative or absolute path.
221 *  @return The file size.
222 */
223 virtual long getFileSize(const std::string &filepath);
224 /** 返回的完整路径缓存。
225 *       Returns the full path cache.
226 */
227 const std::unordered_map<std::string, std::string>& getFullPathCache() const { return _fullPathCache; }
228 
229 protected CONUT:
230 
231 /** 在字典中使用一个文件的密钥来查找文件名
232 *       Dictionary used to lookup filenames based on a key.
233 *  It is used internally by the following methods:基于下面的方法在内部使用
234 *  std::string fullPathForFilename(const char*);
235 */
236 ValueMap _filenameLookupDict;
237 /** 该Vector容器包含有分辨率文件夹。元素在此向量的低指数,该决议目录优先级越高。
238 *  The vector contains resolution folders.
239 *  The lower index of the element in this vector, the higher priority for this resolution directory.
240  */
241 std::vector<std::string> _searchResolutionsOrderArray;
242 /**Vector容器包含的搜索路径。
243 * The vector contains search paths.
244 * The lower index of the element in this vector, the higher priority for this search path.
245 */
246 std::vector<std::string> _searchPathArray;
247 /**     资源的默认根路径。
248 *  The default root path of resources.
249 *  If the default root path of resources needs to be changed, do it in the `init` method of FileUtils's subclass.
250 *  For instance:
251 *  On Android, the default root path of resources will be assigned with "assets/" in FileUtilsAndroid::init().
252 *  Similarly on Blackberry, we assign "app/native/Resources/" to this variable in FileUtilsBlackberry::init().
253 */
254 std::string _defaultResRootPath;
255 /**     完整路径缓存。当一个文件被发现,它将被添加到该高速缓存。
256 *  The full path cache. When a file is found, it will be added into this cache.
257 *  This variable is used for improving the performance of file search.
258 */
259 mutable std::unordered_map<std::string, std::string> _fullPathCache;
260 /**可写路径。
261 * Writable path.
262 */
263 std::string _writablePath;
264 /**     文件实用的单指针。
265 *  The singleton pointer of FileUtils.
266 */
267 static FileUtils* s_sharedFileUtils;
View Code

实例:

.h files

#ifndef _FILEUTILSTEST_SCENE_H_
#define _FILEUTILSTEST_SCENE_H_
#include "cocos2d.h"
class fileUtil : public cocos2d::Layer
{
private:
public:
        static cocos2d::Scene* createScene();
        virtual bool init();
        void fileUtil::testResolutionDirectories(Ref* sender);
        void fileUtil::testSearchPath(Ref* sender);
        void fileUtil::testFilenameLookup(Ref* sender);
        void fileUtil::testIsFileExist(Ref* sender);
        void fileUtil::testWritePlist(Ref* sender);
        CREATE_FUNC(fileUtil);
};
#endif // _FILEUTILSTEST_SCENE_H_



.cpp files

#include "fileUtilsTest.h"

USING_NS_CC;

Scene* fileUtil::createScene()
{
        auto scene = Scene::create();
        auto layer = fileUtil::create();
        scene->addChild(layer);
        return scene;
}

bool fileUtil::init()
{
        if (!Layer::init())
        {
               return false;
        }

        Size visibleSize = Director::getInstance()->getVisibleSize();
        Vec2 origin = Director::getInstance()->getVisibleOrigin();

        auto item1 = MenuItemFont::create("testResolutionDirectories", CC_CALLBACK_1(fileUtil::testResolutionDirectories, this));
        auto item2 = MenuItemFont::create("testSearchPath", CC_CALLBACK_1(fileUtil::testSearchPath, this));
        auto item3 = MenuItemFont::create("testFilenameLookup", CC_CALLBACK_1(fileUtil::testFilenameLookup, this));
        auto item4 = MenuItemFont::create("testIsFileExist", CC_CALLBACK_1(fileUtil::testIsFileExist, this));
        auto item5 = MenuItemFont::create("testWritePlist", CC_CALLBACK_1(fileUtil::testWritePlist, this));

        auto menu = Menu::create(item1, item2, item3, item4, item5, NULL);
        menu->setPosition(Vec2(250, visibleSize.height - 200));
        menu->alignItemsVerticallyWithPadding(20);
        this->addChild(menu);

        return true;
}

//设置和获得分辨率的路径;获取某个文件的路径
void fileUtil::testResolutionDirectories(Ref* sender)
{
//不同的平台的不同的设备它们的分辨率也存在着某些差异
        //实例化
        auto fileUtil = FileUtils::getInstance();
        //清除缓存,清空所有的缓存
        fileUtil->purgeCachedEntries();
        
        //默认搜索路径,第一次的默认搜索路径是Resource那个文件夹
        std::vector<std::string> _defaultSearchPathArray;
        _defaultSearchPathArray = fileUtil->getSearchPaths();
        std::vector<std::string> searchPath = _defaultSearchPathArray;
        
        //在默认的搜索路径下在添加一个我们自己的搜索路径
        searchPath.insert(searchPath.begin(), "Misc");
        //设置新的搜索路径为"Misc"
        fileUtil->setSearchPaths(searchPath);

        //获得搜索分辨率资源路径
        std::vector<std::string> _defaultResolutionsOrderArray = fileUtil->getSearchResolutionsOrder();
        std::vector<std::string> resolutionsOrder = _defaultResolutionsOrderArray;

        //添加分辨率资源路径
        //在依次的在下面的文件名路径下依次的查找所要查找的内容
        resolutionsOrder.insert(resolutionsOrder.begin(), "resources-ipadhd");
        resolutionsOrder.insert(resolutionsOrder.begin() + 1, "resources-ipad");
        resolutionsOrder.insert(resolutionsOrder.begin() + 2, "resources-widehd");
        resolutionsOrder.insert(resolutionsOrder.begin() + 3, "resources-wide");
        resolutionsOrder.insert(resolutionsOrder.begin() + 4, "resources-hd");
        resolutionsOrder.insert(resolutionsOrder.begin() + 5, "resources-iphone");

        //重新设置路径
        fileUtil->setSearchResolutionsOrder(resolutionsOrder);

        for (int i = 1; i < 7; i++)
        {
               //创建6个文件名:text~.txt
               auto filename = String::createWithFormat("test%d.txt", i);
               //fullPathForFilename(filename->getCString())取得当前对象文件的一个绝对路径;如何查找,它会在上面所有设定好的文件名称下,依次的来查找
               std::string ret = fileUtil->fullPathForFilename(filename->getCString());
               log("%s --> %s", filename->getCString(), ret.c_str());
        }
}

//搜索路径
void fileUtil::testSearchPath(Ref* sender)
{
//实例化
        auto fileUtil = FileUtils::getInstance();
        std::string ret;
        //清除缓存,清空所有的缓存
        fileUtil->purgeCachedEntries();
        std::vector<std::string> _defaultSearchPathArray = fileUtil->getSearchPaths();
        std::vector<std::string> searchPaths = _defaultSearchPathArray;
        //getWritablePath();获得一个可写的路径
        std::string writablePath = fileUtil->getWritablePath();

        std::string fileName = writablePath + "external.txt";
        char szBuf[100] = "Hello Cocos2d-x!";
        FILE* fp = fopen(fileName.c_str(), "wb");
        if (fp)
        {
               size_t ret = fwrite(szBuf, 1, strlen(szBuf), fp);
               CCASSERT(ret != 0, "fwrite function returned zero value");
               fclose(fp);
               if (ret != 0)
                       log("Writing file to writable path succeed");
        }
//下面是设置或者添加几个可写分辨路径
        searchPaths.insert(searchPaths.begin(), writablePath);
        searchPaths.insert(searchPaths.begin() + 1, "Misc/searchpath1");
        searchPaths.insert(searchPaths.begin() + 2, "Misc/searchpath2");
        fileUtil->setSearchPaths(searchPaths);
//取得分辨路径
        std::vector<std::string> _defaultResolutionsOrderArray = fileUtil->getSearchResolutionsOrder();
        std::vector<std::string> resolutionsOrder = _defaultResolutionsOrderArray;
//添加一个路径resources-ipad
        resolutionsOrder.insert(resolutionsOrder.begin(), "resources-ipad");
        fileUtil->setSearchResolutionsOrder(resolutionsOrder);

        for (int i = 1; i<3; i++)
        {
               auto filename = String::createWithFormat("file%d.txt", i);
               ret = fileUtil->fullPathForFilename(filename->getCString());
               log("%s --> %s", filename->getCString(), ret.c_str());
        }

        // Gets external.txt from writable path
        std::string fullPath = fileUtil->fullPathForFilename("external.txt");
        log("external file path = %s", fullPath.c_str());
        if (fullPath.length()>0)
        {//rb是一个只读的权限
               fp = fopen(fullPath.c_str(), "rb");
               if (fp)
               {
                       char szReadBuf[100] = { 0 };
                       int read = fread(szReadBuf, 1, strlen(szBuf), fp);
                       if (read>0)
                       {
                               log("The content of file from writable path: %s", szReadBuf);
                       }
                       fclose(fp);
               }
        }
}

//文件查找
//测试文件名查找
void fileUtil::testFilenameLookup(Ref* sender)
{
//实例化
        auto sharedFileUtils = FileUtils::getInstance();
        ValueMap dict;
        dict["grossini.bmp"] = Value("Images/grossini.png");
        dict["grossini.xcf"] = Value("Images/grossini.png");
//设置一个按文件名查找的字典
        sharedFileUtils->setFilenameLookupDictionary(dict);

        // Instead of loading carlitos.xcf, it will load grossini.png
        auto sprite = Sprite::create("grossini.png");
        this->addChild(sprite);

        auto s = Director::getInstance()->getWinSize();
        sprite->setPosition(Vec2(s.width / 2, s.height / 2));
}

//判断文件是否存在
//测试文件是否存在
void fileUtil::testIsFileExist(Ref* sender)
{
        auto s = Director::getInstance()->getWinSize();
        auto sharedFileUtils = FileUtils::getInstance();

        Label* pTTF = nullptr;
        bool isExist = false;

        isExist = sharedFileUtils->isFileExist("Images/grossini.png");

        pTTF = Label::createWithSystemFont(isExist ? "Images/grossini.png exists" : "Images/grossini.png doesn't exist", "", 20);
        pTTF->setPosition(Vec2(s.width / 2, s.height / 3));
        this->addChild(pTTF);
}

//写plist配置文件
//测试写plist文件
void fileUtil::testWritePlist(Ref* sender)
{
//创建一个字典
        auto root = Dictionary::create();
//设置字典的key-》String element value
        auto string = String::create("String element value");
        root->setObject(string, "string element key");
//创建一个数组
        auto array = Array::create();
//在数组里面添加一个字典
        auto dictInArray = Dictionary::create();
//往字典里面添加两个对象
        dictInArray->setObject(String::create("string in dictInArray value 0"), "string in dictInArray key 0");
        dictInArray->setObject(String::create("string in dictInArray value 1"), "string in dictInArray key 1");
//再将字典添加到数组里面去
        array->addObject(dictInArray);

        array->addObject(String::create("string in array"));
//在数组中在添加一个数组
        auto arrayInArray = Array::create();
        arrayInArray->addObject(String::create("string 0 in array"));
        arrayInArray->addObject(String::create("string 1 in array"));
        array->addObject(arrayInArray);
        
        root->setObject(array,"array");
//在字典中在嵌套字典   
        auto dictInDict = Dictionary::create();
        dictInDict->setObject(String::create("string in dictInDict value"), "String in dictInDict key");

        //add booleans to the plist
        auto booleanObject = Bool::create(true);
        dictInDict->setObject(booleanObject, "bool");

        //add integer to the plist
        auto intObject = Integer::create(624);
        dictInDict->setObject(intObject, "integer");

        //add float to the plist
        auto floatObject = Float::create(524.2);
        dictInDict->setObject(floatObject, "float");

        //add double to the plist
        auto doubleObject = Double::create(524.2);
        dictInDict->setObject(doubleObject, "double");
        root->setObject(dictInDict, "dictInDict, hello world!");

        //end with
        //在拿到一个可写的路径getWritablePath();-——》writablePath
        std::string writablePath = FileUtils::getInstance()->getWritablePath();
        //在拿到的可写路径下添加一个text.plist文件
        std::string fullPath = writablePath + "text.plist";
        //调用writeToFile方法进行写操作
        if (root->writeToFile(fullPath.c_str()))
               log("see the plist file at %s", fullPath.c_str());
        else
               log("write plist file failed");

        auto label = LabelTTF::create(fullPath.c_str(), "Arial", 12);
        this->addChild(label);
        auto winsize = Director::getInstance()->getWinSize();
        label->setPosition(Vec2(winsize.width / 2, winsize.height / 3));
//根据文件的内容来创建一个字典
        auto loadDict = __Dictionary::createWithContentsOfFile(fullPath.c_str());
        auto loadDictInDict = (__Dictionary*)loadDict->objectForKey("dictInDict,hello world");
        auto boolValue = (__String*)loadDictInDict->objectForKey("bool");
        CCLOG("%s", boolValue->getCString());
        auto floatValue = (__String*)loadDictInDict->objectForKey("float");
        CCLOG("%s", floatValue->getCString());
        auto doubleValue = (__String*)loadDictInDict->objectForKey("double");
        CCLOG("%s", doubleValue->getCString());
        auto integerValue = (__String*)loadDictInDict->objectForKey("int");
        CCLOG("%s", integerValue->getCString());
}

 

 

UserDefault

    在上面实现了数据的读写等一些操作,但是游戏的某些数据时要实现持久化的,因此Cocos2d-x引擎中有提供了一个类UserDefault来让我们来实现数据的持久化。UserDefault可以实现数据的存储,但是它不宜储存大量的数据,一般的情况下,用于保存一些游戏设置和玩家偏好设置;数据持久化就是数据能够存储起来,然后在需要的时候可以查找回来,即使设备从新启动也可以查找回来。在UserDefault提供了对int, double, bool和string等数据类型的读写。

UserDefault所支持的数据类型:

在Cocos2d-x中能够多种持久化的方式;

1. 普通文本文件的持久化。

2. UserDefault.可以设置用户的偏好设置等一些少量的数据

3. 属性列表。

4. SQL数据库

 

API中的常用函数:

  1 // get value methods
  2 /**根据键值取出布尔值
  3 * Get bool value by key, if the key doesn't exist, will return false.
  4 * You can set the default value, or it is false.
  5 * @param key The key to get value.
  6 * @return Bool value by `key`.
  7 */
  8 bool getBoolForKey(const char* key);    
  9 /**根据键值取出布尔值,如果键不存在,返回defaultValue
 10 * Get bool value by key, if the key doesn't exist, will return passed default value.
 11 * @param key The key to get value.
 12 * @param defaultValue The default value to return if the key doesn't exist.
 13 */
 14 virtual bool getBoolForKey(const char* key, bool defaultValue);    
 15 /**根据键值取出int类型的数据
 16 * Get integer value by key, if the key doesn't exist, will return 0.
 17 * You can set the default value, or it is 0.
 18 * @param key The key to get value.
 19 * @return Integer value of the key.
 20 */
 21 int getIntegerForKey(const char* key);    
 22 /**根据键值取出int类型的数据,如果键不存在,返回defaultValue
 23 * Get bool value by key, if the key doesn't exist, will return passed default value.
 24 * @param key The key to get value.
 25 * @param defaultValue The default value to return if the key doesn't exist.
 26 * @return Integer value of the key.
 27 */
 28 virtual int getIntegerForKey(const char* key, int defaultValue);    
 29 /**根据键值取出float类型的数据
 30 * Get float value by key, if the key doesn't exist, will return 0.0.
 31 * @param key The key to get value.
 32 * @return Float value of the key.
 33 */
 34 float getFloatForKey(const char* key);    
 35 /**根据键值取出float类型的数据,如果键不存在,返回defaultValue
 36 * Get float value by key, if the key doesn't exist, will return passed default value.
 37 * @param key The key to get value.
 38 * @param defaultValue The default value to return if the key doesn't exist.
 39 * @return Float value of the key.
 40 */
 41 virtual float getFloatForKey(const char* key, float defaultValue);    
 42 /**根据键值取出double类型的数据
 43 * Get double value by key, if the key doesn't exist, will return 0.0.
 44 * @param key The key to get value.
 45 * @return Double value of the key.
 46 */
 47 double getDoubleForKey(const char* key);    
 48 /**根据键值取出double类型的数据,如果键不存在,返回defaultValue
 49 * Get double value by key, if the key doesn't exist, will return passed default value.
 50 * @param key The key to get value.
 51 * @param defaultValue The default value to return if the key doesn't exist.
 52 * @return Double value of the key.
 53 */
 54 virtual double getDoubleForKey(const char* key, double defaultValue);    
 55 /**根据键值取出string类型的数据
 56 * Get string value by key, if the key doesn't exist, will return an empty string.
 57 * @param key The key to get value.
 58 * @return String value of the key.
 59 */
 60 std::string getStringForKey(const char* key);    
 61 /**根据键值取出string类型的数据,如果键不存在,返回defaultValue
 62 * Get string value by key, if the key doesn't exist, will return passed default value.
 63 * @param key The key to get value.
 64 * @param defaultValue The default value to return if the key doesn't exist.
 65 * @return String value of the key.
 66 */
 67 virtual std::string getStringForKey(const char* key, const std::string & defaultValue);    
 68 /**根据键值取出Data类型的数据
 69 * Get Data value by key, if the key doesn't exist, will return an empty Data.
 70 * @param key The key to get value.
 71 * @return Data value of the key.
 72 */
 73 Data getDataForKey(const char* key);    
 74 /**根据键值取出Data类型的数据,如果键不存在,返回defaultValue
 75 * Get Data value by key, if the key doesn't exist, will return an empty Data.
 76 * @param key The key to get value.
 77 * @param defaultValue The default value to return if the key doesn't exist.
 78 * @return Data value of the key.
 79 */
 80 virtual Data getDataForKey(const char* key, const Data& defaultValue);
 81 // set value methods
 82 /**根据键写入布尔值
 83 * Set bool value by key.
 84 * @param key The key to set.
 85 * @param value A bool value to set to the key.
 86 */
 87 virtual void setBoolForKey(const char* key, bool value);
 88 /**根据键写入int类型数据
 89 * Set integer value by key.
 90 * @param key The key to set.
 91 * @param value A integer value to set to the key.
 92 */
 93 virtual void setIntegerForKey(const char* key, int value);
 94 /**根据键写入float类型数据
 95 * Set float value by key.
 96 * @param key The key to set.
 97 * @param value A float value to set to the key.
 98 */
 99 virtual void setFloatForKey(const char* key, float value);
100 /**根据键写入double类型数据
101 * Set double value by key.
102 * @param key The key to set.
103 * @param value A double value to set to the key.
104 */
105 virtual void setDoubleForKey(const char* key, double value); 
106 /**根据键写入String类型数据
107 * Set string value by key.
108 * @param key The key to set.
109 * @param value A string value to set to the key.
110 */
111 virtual void setStringForKey(const char* key, const std::string & value);   
112 /**根据键写入Data类型数据
113 * Set Data value by key.
114 * @param key The key to set.
115 * @param value A Data value to set to the key.
116 */
117 virtual void setDataForKey(const char* key, const Data& value);      
118 /**调用此函数会将我们所改变的数据保存在.xml文件中去。
119 * You should invoke this function to save values set by setXXXForKey().
120 */
121 virtual void flush();
122 /**
123 * delete any value by key,
124 * @param key The key to delete value.
125 */
126 virtual void deleteValueForKey(const char* key);    
127 /** 
128 * Returns the singleton.
129 */
130 static UserDefault* getInstance();    
131 /**
132 * 
133 */
134 static void destroyInstance();
135 /**
136 * You can inherit from platform dependent implementation of UserDefault, such as UserDefaultAndroid,
137 * and use this function to set delegate, then UserDefault will invoke delegate's implementation.
138 * For example, your store native data base or other format store.
139 * If you don't want to system default implementation after setting delegate, you can just pass nullptr
140 * to this function.
141 * @warm It will delete previous delegate
142 */
143 static void setDelegate(UserDefault *delegate);
144 /** @deprecated Use getInstace() instead.
145 */
146 CC_DEPRECATED_ATTRIBUTE static UserDefault* sharedUserDefault();
147 /**@deprecated Use destroyInstance() instead.
148 */
149 CC_DEPRECATED_ATTRIBUTE static void purgeSharedUserDefault();
150 /** All supported platforms other iOS & Android use xml file to save values. This function is return the file path of the xml path.
151 */
152 static const std::string& getXMLFilePath();
153 /** All supported platforms other iOS & Android and CC_PLATFORM_WINRT use xml file to save values. This function checks whether the xml file exists or not.
154 * @return True if the xml file exists, false if not.
155 */
156 static bool isXMLFileExist();
View Code

实例:

.h files 

#ifndef _USERDEFAULTTEST_SCENE_H_
#define _USERDEFAULTTEST_SCENE_H_
#include "cocos2d.h"
class userDefault : public cocos2d::Layer
{
private:
public:
        static cocos2d::Scene* createScene();
        virtual bool init();
        void testUserDefault(Ref* sendef);
        CREATE_FUNC(userDefault);
};

#endif // _USERDEFAULTTEST_SCENE_H_

.cpp files

#include "UserDefaultTest.h"

USING_NS_CC;

Scene* userDefault::createScene()
{
        auto scene = Scene::create();
        auto layer = userDefault::create();
        scene->addChild(layer);
        return scene;
}

bool userDefault::init()
{
        if (!Layer::init())
        {
               return false;
        }

        Size visibleSize = Director::getInstance()->getVisibleSize();
        Vec2 origin = Director::getInstance()->getVisibleOrigin();

        auto item = MenuItemFont::create("Test", CC_CALLBACK_1(userDefault::testUserDefault, this));
        auto menu = Menu::create(item, NULL);
        this->addChild(menu);

        return true;
}

void userDefault::testUserDefault(Ref* sendef)
{
        //set default value
        UserDefault::getInstance()->setStringForKey("String", "value1");
        UserDefault::getInstance()->setIntegerForKey("Integer", 100);
        UserDefault::getInstance()->setFloatForKey("Float", 5.326f);
        UserDefault::getInstance()->setDoubleForKey("Double", 3.1415967);
        UserDefault::getInstance()->setBoolForKey("Bool", false);

        //printf value
        std::string ret = UserDefault::getInstance()->getStringForKey("String");
        CCLOG("string is %s", ret.c_str());

        int intValue = UserDefault::getInstance()->getIntegerForKey("Integer");
        CCLOG("Integer value is %d", intValue);

        float floValue = UserDefault::getInstance()->getFloatForKey("Float");
        CCLOG("Float value is %f", floValue);

        double douValue = UserDefault::getInstance()->getDoubleForKey("Double");
        CCLOG("Double value is %f", douValue);

        bool boolValue = UserDefault::getInstance()->getBoolForKey("Bool");
        if (boolValue)
               CCLOG("bool value is true");
        else
               CCLOG("bool value is false");


        //CCUserDefault::getInstance()->flush();
        CCLOG("改变后的数据:");
        UserDefault::getInstance()->setStringForKey("String", "value2");
        UserDefault::getInstance()->setIntegerForKey("Integer", 10);
        UserDefault::getInstance()->setFloatForKey("Float", 15.326f);
        UserDefault::getInstance()->setDoubleForKey("Double", 2 * 3.1415967);
        UserDefault::getInstance()->setBoolForKey("Bool", true);

        UserDefault::getInstance()->flush();

        //after change value
        ret = UserDefault::getInstance()->getStringForKey("String");
        CCLOG("string is %s", ret.c_str());

        intValue = UserDefault::getInstance()->getIntegerForKey("Integer");
        CCLOG("Integer value is %d", intValue);

        floValue = UserDefault::getInstance()->getFloatForKey("Float");
        CCLOG("Float value is %f", floValue);

        douValue = UserDefault::getInstance()->getDoubleForKey("Double");
        CCLOG("Double value is %f", douValue);

        boolValue = UserDefault::getInstance()->getBoolForKey("Bool");
        if (boolValue)
               CCLOG("bool value is true");
        else
               CCLOG("bool value is false");
}

原文地址:https://www.cnblogs.com/geore/p/5799570.html