読者です 読者をやめる 読者になる 読者になる

夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【Objective-C】.plistファイルの作り方と読み込み方

Objective-C cocos2d Xcode

追記:.plistファイルを経由せずに.csvファイルを直接プログラムから読み込む方法は、
【Objective-C】.plistファイルを経由せず直接.csvファイルからデータを読み込む方法 - 夏までにiPhone アプリつくってみっか!
をご参照ください。

現在作成中の縦スクロールシューティングゲームで敵の生成データをどういう形で管理しようか考えているのですが、やっぱりプログラムコードとしてデータを組み込むよりは外部ファイルから読み込むのが良いでしょう。
ということでplistファイルについて調べました。
plistファイルはXcodeのFile>New>FileからResourceを選んで出てくる選択肢の中からProperty Listを選んで作成するができます。そして、それをXcode上で編集することもできるのですが、結構編集に時間がかかります。何か便利な方法はないかと調べたところ、csvファイルをplstファイルにコンバートしてくれるサイトを発見しました。
http://www.mindsizzlers.com/case-studies/tools/csv-to-plist-online-conversion-tool/
f:id:takujidev:20130421195511p:plain
「ファイルを選択」ボタンを押してコンバートしたいcsvファイルを指定し、「Upload CSV」ボタンを押すと次の画面が表示されます。あまりにシンプルで不安になりますが、「here」の部分を右クリックしてリンク先のファイルをダウンロードをクリックすればすればダウンロードフォルダにplistファイルが作成されます。
f:id:takujidev:20130421195644p:plain
他にもCSV2Plistという変換アプリも試してみたのですが、何故か空のplistファイルができるだけなので使うのをあきらめました。

今回変換を試したのはこのcsvファイルです。無料表計算ソフトのLibreOffice Calcで作成しました。もちろんExcelでもテキストエディットでも作成できます。

type,positionX,positionY,interval
fly,-100,550,1.5
fly,100,550,1
ladybugL,-200,300,0
ladybugR,200,300,0

これをコンバートしたplistファイルがこちら。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">
        <array>
                <dict>
                        <key>type</key>
                        <string>fly</string>
                        <key>positionX</key>
                        <integer>-100</integer>
                        <key>positionY</key>
                        <integer>550</integer>
                        <key>interval</key>
                        <real>1.5</real>
                </dict>
                <dict>
                        <key>type</key>
                        <string>fly</string>
                        <key>positionX</key>
                        <integer>100</integer>
                        <key>positionY</key>
                        <integer>550</integer>
                        <key>interval</key>
                        <integer>1</integer>
                </dict>
                <dict>
                        <key>type</key>
                        <string>ladybugL</string>
                        <key>positionX</key>
                        <integer>-200</integer>
                        <key>positionY</key>
                        <integer>300</integer>
                        <key>interval</key>
                        <integer>0</integer>
                </dict>
                <dict>
                        <key>type</key>
                        <string>ladybugR</string>
                        <key>positionX</key>
                        <integer>200</integer>
                        <key>positionY</key>
                        <integer>300</integer>
                        <key>interval</key>
                        <integer>0</integer>
                </dict>
        </array>
</plist>

このplistファイルをObject-Cのプログラムから読み込む方法は次の通りです。tableにplistの全てのデータが読み込まれます。
(pathForResourceメソッドの第1引数にはにはファイル名の名前の部分、第2引数には拡張子の部分を入れて渡します。例えばtestfile.plistというファイル名の場合、第1引数は@"testfile"、第2引数は@"plist"とします。

NSBundle* bundle = [NSBundle mainBundle];
NSString* path = [bundle pathForResource:@"testfile" ofType:@"plist"];
NSArray* table = [NSArray arrayWithContentsOfFile:path];

そして、このtableアレイの中からindex行のDictionaryの値を取り出すやりかたはこんな感じになります。Dictionaryに入っている値をobjectForKeyで取り出すと文字列型になるので、元のfloat型にしたい場合は下記のようにfloatValueメソッドで変換します。

    NSDictionary* element = [table objectAtIndex:index];
    NSString* type = [element objectForKey:@"type"];
    float positionX = [[element objectForKey:@"positionX"] floatValue];
    float positionY = [[element objectForKey:@"positionY"] floatValue];
    float interval = [[element objectForKey:@"interval"] floatValue];

plistファイルから敵キャラを生成するデータを取り出す事ができるようになったので、次回はこれを現在のプログラムに組み込んで動作させてみたいと思います。