2009-07-24 5 views
0

私の質問には、2-4人がプレイできる簡単なゲームが含まれています。これは、1つのiPhone/iPodタッチで再生されるので、ネットワークは必要ありません。ゲームが開始されると、ユーザーは再生するプレイヤーの数を選択します。オンザフライで複数のクラスインスタンスを作成する

各プレーヤーについて、Playerクラスのインスタンスとインスタンスを作成する必要があります。私の質問は、どのようにして必要な数のクラスのみが作成され、すべてがdifferenlyという名前になるようにコード化するかです。私は次のことを考えましたが、これはうまくいきません。

「playerNames」という名前の配列があり、ゲーム内のプレーヤーの名前が格納されているとします。

for (int i = 0; i < [playerNames count]; i++) { 

    Player *playeri = [[Player alloc] init]; 

    //other code 

} 

私はforループカウンタとしての「i」そこにを入れて、名前のplayer1を4つのインスタンスを取得することはできません、player2など私はこれをどのように行うのですか?

ご協力いただきありがとうございます。

答えて

2

その場で変数インスタンスを作成することはできません。結果のプレーヤーを格納するコレクションが必要です。 C配列またはNSMutableArrayはうまくいくでしょう。このコレクションをコントローラまたはビューに追加して、プレイヤーがゲームを通じてアクセスできるようにすることができます。

また、autoreleaseを使用して、プレーヤーを自動的に解放するか、またはコレクション内のアイテムをdealloc方法で解放して、メモリリークを防ぐことができます。ここで

は、あなたが正確にプログラム的にそのようなあなたの変数に名前を付けることができない私は、あなたのクラスインターフェイスに追加すると仮定(と一般的にviewDidLoadに、どこかで初期化)したことNSMutableArrayのを使用していくつかのコード

-(void) CreatePlayers:(int)playerCount 
{ 
    for(int i = 0; i < [playerNames count]; i++) 
    { 
     [playersArray insertObject:[[[Player alloc] init] autorelease] 
         atIndex:i]; 
    } 
} 
0

です。

ただし、これらのオブジェクトを作成してNSMutableArrayに追加し、後で呼び出すことができます。

"PlayerN"という名前を各オブジェクトに関連付ける場合は、NSMutableDictionaryを使用します。キー@ "PlayerN"(NSString)の値としてプレーヤーオブジェクトを格納します。キーを作成する

は、次のように行うことができる:

NSString *key = [NSString stringWithFormat:@"Player%d", i]; 
0

このための最も基本的な解決策は、配列または(選手名をキー)辞書のいずれかでプレイヤーを保存することです。配列のアプローチを取る:

// assume we have an NSArray property, players 
NSMutableArray *tempPlayers = [NSMutableArray arrayWithCapacity:[playerNames count]]; 
for (NSString *name in playerNames) { 
    Player *player = [[Player alloc] init]; 
    [tempPlayers addObject:player]; 
    [player release]; 
} 
self.players = tempPlayers; 

あなたは今objectAtIndex:を呼び出すことでplayersプロパティから各プレイヤーにアクセスすることができます。

あなたのPlayerクラスにnameプロパティを追加することを検討しましたか?これはあなたがそれを撮影した後にこの情報を保存する自然な場所のようです。例:

for (NSString *name in playerNames) { 
    // you might also have a designated initializer 
    // e.g. [[Player alloc] initWithName:name] 

    Player *player = [[Player alloc] init]; 
    player.name = name; 
    [tempPlayers addObject:player]; 
    [player release]; 
} 

全体的にこれは機能する最も簡単なもので、今のところ私がやることです。しかし、将来...

ある時点で、ユーザーが作成する新しいゲームを表すある種のGameクラスが導入されています。これは、プレイヤーのあなたの配列を格納するための自然な場所になり、インスタンスのために、あなたはより多くの凝集インターフェイスを構築できるようになる:あなたのGameクラスは選手のアレイとプロセスをカプセル化しますaddPlayerNamed方法をカプセル化します

Game *newGame = [[Game alloc] init]; 
for(NSString *name) in playerNames) { 
    [newGame addPlayerNamed:name]; 
} 

新しいPlayerを作成し、それをその配列に格納することで、コントローラコードをプロセス内ではるかに簡単に(そして意図を明らかにするように)作ることができます。

この特典のもう1つの利点は、この特定のコントローラーに縛られるのではなく、アプリ全体でこのデータにアクセスできる方法を提供することです。あなたは "currentGame"へのシングルトンのようなアクセスを実装することができます。ていないこのような真のコースのシングルトンが、何かがうまく動作します:

Game *newGame = [[Game alloc init]; 
.. // configure game as above 
[Game setCurrentGame:newGame]; 

をだから今、あなたは現在のゲーム(またはプレーヤー)にアクセスする必要がある時はいつでも情報:

// in some other controller 
Game *currentGame = [Game currentGame]; 
for(Player *player in currentGame.players) { 
    // etc... 
} 
関連する問題