たそがれブランチたそがれブランチcocos2d-xを使ったアプリ開発などやってます。@br_branchTweetPocketまあ、上の画像はとりあえず作って貼っとけ的な心の内を見透かされそうな匂いがぷんぷんしちゃってますが。本日二度目の投稿です。今いろいろとリファレンスを見ていじってるという状況なんで、やり方見つけたら忘れないうちに書きたくなっちゃうんで。cocos2d-xでのデータの保存方法って載ってるところがほとんどなくて、大抵が「プリファレンスやSQLiteを使えばいいよ」的な感じになってて、そこが気になって他の方法を調べてました。SQLiteは設定が面倒だし、わざわざデータベースを扱うほどのデータ量も(ぼくが作るゲームは)ないんで。́・ω・`)SQL文なんて見たくもない。プリファレンスを使えばぼくが作ってるようなのなら全然事足りるんですが、CCDicrionaryでも結構簡単に保存と読み込みができたので、それをまとめておきます。※記事の訂正(2014/06/30)記事「ファイルの書き込み」中で、CCDictionaryと書くところを一部CCDirectoryと書いていました。CCDirectoryというクラスはcocos2d-x内には存在しません。́・ω・`)※現在記事は訂正しています。プリファレンスデータからあちこちに載ってるんですが、一応。cocos2d-xはCCUserDefaultを使って非常に簡単にクロスプラットフォームでプリファレンスデータを扱うことができます。CCUserDefault::sharedUserDefault()->getBoolForKey("boolKey",false);どれも第一引数がキーで、第二引数が指定したデフォルト値となります。書き込み方法ほとんど変わりません。最後にflush()を行うくらいです。CCUserDefault::sharedUserDefault();user->setStringForKey("strKey","string1");user->setIntegerForKey("intKey",1);user->setFloatForKey("floatKey",1.0f);user->setDoubleForKey("doubleKey",1.0f);user->setBoolForKey("boolKey",1.0f);//最後に保存を反映させるuser->flush();これも第一引数がキーとなり、第二引数が値となります。CCDictionaryで保存と読み込みここからが今回の本題です。いつのバージョンからかはわかりませんけど、今年の4月くらいにCCDictionaryの中にwriteToFileというメソッドが追加され、結構簡単に保存ができるようになったぽいです。制約はあるんですけど、プリファレンスより多少(FOREACHできたりCCArrayも保存できる分)データとして扱いやすいかもしれません。プリファレンスはやっぱり設定だけに留めておきたいですし。CCDictionaryで保存するにあたっての制約その1.適切な場所に保存するセーブデータなどを扱う場合、iPhoneなんかは適切な場所におかないとリジェクトの対象になったりするそうです。保存場所のパスは以下のような感じで簡単に取得することができます。CCFileUtils::sharedFileUtils()->getWritablePath();一応、iPhoneの場合「Documents」というディレクトリに入ってたら大丈夫みたいです。Androidの場合よくわからないけど、以下のようになってたら大丈夫みたい。Cocos2dxHelper.sFileDirectory;}デフォルトではちゃんとなってるっぽいです。その2.CCArrayまたはCCDictionary、CCString以外は保存できないこの3つ以外ははじかれます。CCIntegerやCCFloatなども使えるといいのですが、CCString以外はないものにされちゃいます。スーパークラスにCCStringを実装しつつ、getCString()をオーバーライドしたら使えるようにできるかもしれません。その3.String型でしかキーは保存できない(追記:9月9日)。CCDictionaryといえば整数型でもキーを設定できるけど、保存する場合は全部文字列型に統一しておかないとできないみたい。制約はありますが、CCArrayとCCDictionaryが使えるというのがかなり強いですね。プリファレンス涙目です。ファイルの書き込み結構びっくりするくらい簡単です。中にいろいろ入れる(CCString、CCArray、CCDictionaryのみ)writeToFileメソッドを呼び出すちなみにplist形式で書き出されるらしいのですが、拡張子は何でもOKみたいです。CCString::createと同じです。CCString.h内で定義されています。savepath);}実行すると、iOS、androidそれぞれで以下のように出ました。Success:/data/data/(省略)/files/savadata.svd拡張子に特に意味はありません。ファイルの読み込みこれもとっても簡単です。フルパスでcreateWithContentsOfFileを呼び出せば、あとは普段のCCDictionaryと同じように扱えます。CCDictionary::create();}以上になります。データの格納が基本CCStringだけとなってしまう為、何かしら管理するクラスを作ったら更に使いやすくなるかもですね。:CCDirectory*というクラスが見つかりません。どのバージョンにありますか?宜しくお願い致します。:ご指摘ありがとうございます。CCDirectory*はぼくの脳内にしか存在しないポインタ及びクラスでしたので全てCCDictionaryに訂正しました。コメントをキャンセルメールアドレスが公開されることはありません。