獅子さんのアプリ開発日記
cocos2d-x / XCode によるスマートフォンのアプリ開発(c++)
Tuesday, September 24, 2013
c++でCSVファイルを読み込む
いま、ドラクエ風ターン制RPGの戦闘場面を作っている。モンスターの実データを自作すると大変なので、とりあえず試験的にWebの各所で公開されているドラクエ2のモンスターデータを使わせてもらっている。 データはCSV形式でMacのローカルフォルダに置いてあり、プログラム実行時に読み込んで実際のモンスターのパラメータとして使っている。これまでc++でファイル操作をしたことがなかったが、昨今は有難いことにWebに良いサンプルが多数あるため、それらを改変して思ったより簡単に実装できた。 なお、私のソースではクラス名の頭にcocosの"CC〜"に習って、"SS"(ShishiSan)という接頭語を付けている。 <pre class="prettyprint"> // モンスターデータCSV読込関数 bool SSBattleManager::readAllMonstersCSV() { ifstream ifs(SS_CSV_MONSTER); // 入力ストリーム string csvLine; // csv1行 if(!ifs) return false; // 読込エラー int number=1; // モンスター識別番号(画像ファイル名と連携) // 1行ごとに順次読込 while ( getline(ifs, csvLine) ) { istringstream csvStream(csvLine); string csvCol; // 1項目(列の項目) int cntCol=1; // 項目番号 ParamCreature tmpParam; tmpParam.number = number; number++; // 1項目ごとに分解して構造体に追加 while ( getline(csvStream, csvCol, ',') ) { switch(cntCol){ case 1: tmpParam.name = csvCol; break; case 2: tmpParam.hp = atoi(csvCol.c_str()); break; case 3: tmpParam.mp = atoi(csvCol.c_str()); break; case 4: tmpParam.atk = atoi(csvCol.c_str()); break; case 5: tmpParam.def = atoi(csvCol.c_str()); break; : // 中略 default: break; } ++cntCol; } m_AllMonsters.push_back(tmpParam); // 列の終端で1行分をvectorに追加 } return true; } </pre> 簡単に解説。 SS_CSV_MONSTER はcsvファイルへのフルパスです。Macなのでスラッシュ区切りでパスを書き(winなら¥)、たとえば "/Users/shishisan/monsters.csv"のようにdefineしておく。ifstream でファイルを開き、getline で1行読み込んで、さらにカンマ区切りに分割する。 ParamCreature というのは、生物(勇者やモンスター)を表す、Creature クラスのパラメータ構造体。名前、HP、MP、攻撃力、守備力といったおなじみの属性を持たせるもので、Creature クラスのヘッダに定義されている。CSVの項目をカンマで分割し、おのおのパラメータに読み込む、というシンプルな構造。 なお「モンスター識別番号」というのはモンスターに通し番号がふってあり、画像スプライトを表示するために使っている。画像スプライトに連番でたとえばスライムは01みたいにしてあり、表示時に使っている。 CSVファイルで注意したいのは、文字コードをUTF-8にしておくこと。CSVファイルのみならず、アプリで日本語を使うさいにはソースの文字コードをUTF-8にしておく。
No comments:
Post a Comment
Newer Post
Older Post
Home
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment