- 精通Cocos2d-x游戲開發(進階卷)
- 王永寶
- 1047字
- 2020-11-28 22:36:56
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的實現。