2011-02-06 7 views
4

iPhoneゲームを作成していて、レベルデータがハードコードされていますが、レベルデータをplistに保存したいのですがそれは打ち上げ時。私はplistsを使用したことがなく、私のデータモデルに基づいてどのようにplistを設定すべきかを理解するのに問題があります。iPhoneゲームのアプリケーションデータ(設定ではない)を格納するplistの設定

(私のappDelegateに)

- (void)loadLevels { 
    //setup NSNumber objects to load into sequences 
    NSNumber * rID = [[[NSNumber alloc] initWithInt:0] autorelease]; 
    NSNumber * bID = [[[NSNumber alloc] initWithInt:1] autorelease]; 
    NSNumber * gID = [[[NSNumber alloc] initWithInt:2] autorelease]; 
    NSNumber * yID = [[[NSNumber alloc] initWithInt:3] autorelease]; 
    NSNumber * rbID = [[[NSNumber alloc] initWithInt:4] autorelease]; 
    NSNumber * rgID = [[[NSNumber alloc] initWithInt:5] autorelease]; 
    NSNumber * ryID = [[[NSNumber alloc] initWithInt:6] autorelease]; 
    NSNumber * bgID = [[[NSNumber alloc] initWithInt:7] autorelease]; 
    NSNumber * byID = [[[NSNumber alloc] initWithInt:8] autorelease]; 
    NSNumber * gyID = [[[NSNumber alloc] initWithInt:9] autorelease]; 

    //Level One's Sequence 
    NSMutableArray * aSequence = [[[NSMutableArray alloc] initWithCapacity:1] autorelease]; 

    [aSequence addObject: rID]; 
    [aSequence addObject: bID]; 
    [aSequence addObject: gID]; 
    [aSequence addObject: yID]; 
    [aSequence addObject: rbID]; 
    [aSequence addObject: rgID]; 
    [aSequence addObject: ryID]; 
    [aSequence addObject: bgID]; 
    [aSequence addObject: byID]; 
    [aSequence addObject: gyID]; 

    // Load level One 
    _levels = [[[NSMutableArray alloc] init] autorelease]; 

    Level *level1 = [[[Level alloc] initWithLevelNum:1 levelSpeed:1.0 levelSequence:aSequence] autorelease]; 

    [_levels addObject:level1]; 
//do the same thing for subsequent levels// 
} 

#import "Level.h" 

@implementation Level 

@synthesize levelNum = _levelNum; 
@synthesize levelSpeed = _levelSpeed; 
@synthesize levelSequence = _levelSequence; 

- (id)initWithLevelNum:(int)levelNum levelSpeed:(float)levelSpeed levelSequence:(NSMutableArray *)levelSequence { 
    if ((self = [super init])) { 
     self.levelNum = levelNum; 
     self.levelSpeed = levelSpeed; 
     self.levelSequence = [[[NSMutableArray alloc] initWithArray:levelSequence] autorelease]; 
    } 
    return self; 
} 

- (void)dealloc { 
    [_levelSequence release]; 
    _levelSequence = nil; 
    [super dealloc]; 
} 

@end 

I」は(これは私が私のレベルのクラスが実装している方法です):ここでは

は、私はそれが難しい今コーディングされてきた方法です私のモデルと一致するようにデータを保存するためのplistの設定方法を知りません。誰か私に助言をお願いしますか?

追加: (ここで、私はplistをセットアップする必要があると思います - データモデルは単に私のレベルを初期化する3つの変数です(上記)。セットアップは、しかし各レベルはで構成されています。レベル番号、レベルのスピード、そしてそのレベルに必要な順序を表す数値の配列)

My current plist setup

さて、私は正確にどのようにこのセットアップを持っている場合プログラムに値をロードするのですか?

+0

あなたのモデルは何ですか?ここに私たちを見せてはいけません。 –

+0

@Jonathan Grynspan私は自分のデータに関するより詳細な質問を更新しました。これが私が何をしようとしているのか理解するのに役立ちます。 – Mark7777G

答えて

11
  • plistファイルをプロジェクトのリソースファイルとして追加します。名前はconfig.plistです。

  • リソースファイルのパスを取得します。 (しかし、それは、ユニットテストの単位テストバンドルを返さないようNSBundle mainBundle]のように注意してください。)

 
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"config" ofType:@"plist"]; 
  • ルートオブジェクトは、レベルの配列です。それをNSArrayにロードします。
 
// this is autoreleased. you can retain it if needed 
NSArray *levelArray = [NSArray arrayWithContentsOfFile:plistPath]; 
  • 今、あなたはレベルの配列を持っています。各レベルは辞書です。レベルiを読み込みます(0から数えます)。
 
NSDictionary *level = [levelArray objectAtIndex:i]; 
  • 今、あなたは、メソッドを使用してobjectForKeyレベルの辞書からオブジェクトを取得することができます。
 
NSArray *seq = [level objectForKey:@"levelSequence"]; 
  • は、あなたがのalloc、initにlevelArrayをループし、すべてのレベルのレベルアレイに追加することができます。たとえば、シーケンス配列を取得します。

希望します。私はコードをコンパイルしていないので、いくつかのタイプミスがあるかもしれないことに注意してください。

+0

明確で簡潔な回答に感謝します。 @ Alexsanderの答えに留意したように、このplistではデータを更新する必要はありません。静的なので、このアプローチは私のニーズに最適です! KVCについての1つの質問:私のplistは辞書の配列なので、KVCに準拠していないということですか?または、辞書部分に最初のキーとして文字列があるという事実により、KVCに準拠していますか? (これは実際に私のアプリケーションのための要件ではありませんが、私はこの議論に含めることが洞察になると思いました) – Mark7777G

+1

@マーク、plistを使った静的な設定データはNSUserDefaultsより優れていると思います。あなたのように、私はまた、ゲームでユーザーの好みやベストスコアのように変更できるデータのためにNSUserDefaultsを好むでしょう。しかし静的な設定のために私はplistを好むでしょう。他のプラットフォーム用にXML設定ファイルを使用するのと同じように。 plistは特定の要素を持つXMLでもあります。 KVCについて、私はあまり経験がないと申し訳ありません。だから私はKVCについてコメントしてはいけません。他のメンバーの提案を見てみましょう。 – taskinoor

1

あなたがする必要があるのは、適用可能なすべてのデータを含むNSDictionaryを作成し、そこから読み取ってNSUserDefaultsに書き込むことです。

+0

@Alexsander Akers私はNSUserDefaultsを見ていましたが、私が読んでいたところからは、アプリケーションデータの代わりにアプリケーション設定を保存する方が適切だと思いました。私が間違っている? – Mark7777G

+1

@ Mark7777G:それはその意図された目的ですが、あなたはそれにplistに保存することができます何でも保存することができます。ストアしたいような静的なデータの場合、アプリケーションのバンドル内のplistに格納することは、これまでよりもずっと一般的なアプローチです。 – arrtchiu

+1

私の最後のコメントに加えて、NSUserDefaultsはディスクに定期的に同期されています。大量のデータがあれば、不要なオーバーヘッドが発生する可能性があります。 – arrtchiu

関連する問題