<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                本站文章均為[?李華明Himi?](http://www.himigame.com/about-himi)原創,轉載務必在明顯處注明: 轉載自[【黑米GameDev街區】](http://www.himigame.com/)?原文鏈接:?[http://www.himigame.com/iphone-cocos2dx/653.html](http://www.himigame.com/iphone-cocos2dx/653.html "【iOS-cocos2d-X") 本篇跟大家分享下Cocos2dX中的存儲,其中也介紹些細節容易犯錯的問題; 在Cocos2dX中提供了自帶存儲類:CCUserDefault ?,當然了這里Himi強調一點,如果你的數據量比較大,建議使用SQL存儲比較適合,另外一點要注意的是,盡可能不要在Cocos2dX中使用與平臺相關的api進行開發,例如Xcode使用Cocos2dX進行開發游戲時不小心使用了iOS的控件/組件在項目中,那么當移植到Android等平臺的時候就肯定異常費勁,估計連正常運行都不可能,因為其他平臺不可能正好有iOS的這些控件,即使有也肯定底層實現不一樣!換句話而言,神馬功能都使用Cocos2dX api實現,盡量都向X靠攏吧,所以這里的存儲我也使用X自帶的CCUserDefault;至少使用Cocos2dX自帶的對于跨平臺這一塊肯定支持的比較好啦; 言歸正傳,先大致介紹一下這個類的API: ~~~ Public Member Functions ~CCUserDefault () bool getBoolForKey (const char *pKey, bool defaultValue=false) Get bool value by key, if the key doesn't exist, a default value will return. int getIntegerForKey (const char *pKey, int defaultValue=0) Get integer value by key, if the key doesn't exist, a default value will return. float getFloatForKey (const char *pKey, float defaultValue=0.0f) Get float value by key, if the key doesn't exist, a default value will return. double getDoubleForKey (const char *pKey, double defaultValue=0.0) Get double value by key, if the key doesn't exist, a default value will return. std::string getStringForKey (const char *pKey, const std::string &defaultValue="") Get string value by key, if the key doesn't exist, a default value will return. void setBoolForKey (const char *pKey, bool value) Set bool value by key. void setIntegerForKey (const char *pKey, int value) Set integer value by key. void setFloatForKey (const char *pKey, float value) Set float value by key. void setDoubleForKey (const char *pKey, double value) Set double value by key. void setStringForKey (const char *pKey, const std::string &value) Set string value by key. void flush () Save content to xml file. Static Public Member Functions static CCUserDefault * sharedUserDefault () static void purgeSharedUserDefault () static const std::string & getXMLFilePath () ~~~ 從以上可以一目了然CCUserDefault的使用和功能,哈希表結構,Key -Value,key索引Value值; 提供的存儲都是些基礎類型,bool,int,string,double,float,方法很容易懂:存儲使用set ,獲取使用get ? ! 那么最后static方法中可以看到CCUserDefault類留出了一個sharedUserDefault作為接口供開發者使用,那么大概介紹后,下面我們來寫幾段代碼驗證下: ~~~ //我們這里簡單存儲條數據 CCUserDefault::sharedUserDefault()->setStringForKey("key", "himi"); CCUserDefault::sharedUserDefault()->flush();//這里一定要提交寫入哦,否則不會記錄到xml中,下次啟動游戲你就獲取不到value了。 //這里隨便定義一個string為了驗證我們的存儲 string str= "wahaha"; //取出我們剛存儲的himi,然后賦值給str驗證下; str= CCUserDefault::sharedUserDefault()->getStringForKey("key"); CCLog("打印str=:%s",str.c_str()); ~~~ 這里要注意, ? ?CCUserDefault中有個 ?flush()的函數,這個用來將數據寫入xml文件中,也就是說當你使用setXX的一些函數后記得提交(調用一下flush函數) OK,下面是控制臺輸入的結果: ~~~ Cocos2d: cocos2d: cocos2d-1.0.1-x-0.12.0 Cocos2d: cocos2d: GL_VENDOR: Imagination Technologies Cocos2d: cocos2d: GL_RENDERER: PowerVR SGX 543 Cocos2d: cocos2d: GL_VERSION: OpenGL ES-CM 1.1 IMGSGX543-63.14.2 Cocos2d: cocos2d: GL_MAX_TEXTURE_SIZE: 4096 Cocos2d: cocos2d: GL_MAX_MODELVIEW_STACK_DEPTH: 16 Cocos2d: cocos2d: GL supports PVRTC: YES Cocos2d: cocos2d: GL supports BGRA8888 textures: NO Cocos2d: cocos2d: GL supports NPOT textures: YES Cocos2d: cocos2d: GL supports discard_framebuffer: YES Cocos2d: cocos2d: compiled with NPOT support: NO Cocos2d: cocos2d: compiled with VBO support in TextureAtlas : NO Cocos2d: 打印str=:himi ~~~ 最后一句驗證了我們的存儲沒問題,那么我們現在驗證是否真的存在xml中了,首先停止當前運行的項目,然后刪除剛才代碼替換如下代碼: ~~~ CCLog("打印str=:%s",CCUserDefault::sharedUserDefault()->getStringForKey("key").c_str()); ~~~ 然后重新運行此項目,觀察控制臺打印如下: ~~~ Cocos2d: cocos2d: cocos2d-1.0.1-x-0.12.0 Cocos2d: cocos2d: GL_VENDOR: Imagination Technologies Cocos2d: cocos2d: GL_RENDERER: PowerVR SGX 543 Cocos2d: cocos2d: GL_VERSION: OpenGL ES-CM 1.1 IMGSGX543-63.14.2 Cocos2d: cocos2d: GL_MAX_TEXTURE_SIZE: 4096 Cocos2d: cocos2d: GL_MAX_MODELVIEW_STACK_DEPTH: 16 Cocos2d: cocos2d: GL supports PVRTC: YES Cocos2d: cocos2d: GL supports BGRA8888 textures: NO Cocos2d: cocos2d: GL supports NPOT textures: YES Cocos2d: cocos2d: GL supports discard_framebuffer: YES Cocos2d: cocos2d: compiled with NPOT support: NO Cocos2d: cocos2d: compiled with VBO support in TextureAtlas : NO Cocos2d: 打印str=:himi ~~~ 通過剛才的key->”key”,正常獲取到“himi”這個字符串了,OK,監測沒問題; 那么一般情況下我們會需要一個方法就是判定當前項目是否已經有存儲數據的xml文件存在了,那么Himi這里說下,Cocos2dX默認源碼中有這個方法,但是并沒有提供給開發者使用,因為此函數被private私有了,此函數源碼如下圖所示: [![](https://box.kancloud.cn/2016-03-31_56fcd020f09a3.png "111")](http://www.himigame.com/wp-content/uploads/2012/03/1111.png)? ? ? ?那么既然如此Himi這里就自定義了一個檢測是否已存在數據xml的函數提供大家使用:(提醒:很多童鞋該說啦,為什么不直接修改源碼將其public呢?!其實Himi也這么想,但是如果你后期使用了新的Cocos2dX的版本,或者同事機器的Cocos2dX并沒有這么修改源碼都會產生錯誤,反過來說,既然能很容易的寫出一個判斷的方法何必去動它呢,不是么?哈哈!) ~~~ .h文件: bool isHaveSaveFile(); .cpp文件: //當前項目是否存在存儲的xml文件 bool HelloWorld::isHaveSaveFile(){ if(!CCUserDefault::sharedUserDefault()->getBoolForKey("isHaveSaveFileXml")) { CCUserDefault::sharedUserDefault()->setBoolForKey("isHaveSaveFileXml", true); CCUserDefault::sharedUserDefault()->flush();//提交 // CCLog("存儲文件不存在,頭次開始加載游戲"); return false; }else{ // CCLog("存儲文件已存在"); return true; } } ~~~ 備注:當存儲數據的xml不存在的時候,你的第一次存儲數據的時候默認會創建,路徑在你的app下的documents,如下圖所示: [![](https://box.kancloud.cn/2016-03-31_56fcd021136d5.png "2222")](http://www.himigame.com/wp-content/uploads/2012/03/22221.png) 那么這里Himi強調一點!大家要注意setXX的函數的參數,例如以下這個函數: setStringForKey (const char *pKey, const std::string &value) 第一個參數是const char*類型,不是string!!!!(Himi因為這個原因浪費不少時間,悲劇阿。) Himi當時存儲寫了如下代碼,造成錯誤,如下: ~~~ CCUserDefault::sharedUserDefault()->setStringForKey(""+823, sKey); ~~~ 錯誤截圖如下:(存儲的key變成了路徑。。。。《數據是Himi加密后的》) [![](https://box.kancloud.cn/2016-03-31_56fcd0212cae1.png "error")](http://www.himigame.com/wp-content/uploads/2012/03/error.png) 哎,郁悶,這里Himi犯錯希望童鞋們不要再范此錯誤,之前Himi一直想找 itoa 找個函數,但是怎么都找不到!(c++ ?應該存在的整形轉字符串),但是Cocos2dX中沒有,并且最后Himi使用了與Cocos2dX引擎中的實現itoa的源碼,發現如下: [![](https://box.kancloud.cn/2016-03-31_56fcd0214653e.png "33333")](http://www.himigame.com/wp-content/uploads/2012/03/33333.png) Cocos2dX自帶的這個CCUserDefault并不是加密的,而是明文并且是.xml格式的,所以后續Himi準備寫一篇使用base64來進行加密的文章供大家參考; 本篇源碼下載: [SaveDataForCocos2dx.zip](http://www.himigame.com/?dl_id=62)?(667 字節, 1 次) ?
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看