2009-07-22 24 views
1

私は、Objective-C/Cocoaを使用して詳細を調べるためにroguelikeに取り組んでいます。私は基本的な機能のほとんどを邪魔してきましたが、私はまだ私が把握しようとしている1つの問題があります。ここで Objective-C roguelike内で複数のレベルを実装する最良の方法は?

は、プロセスの内訳です:

まず、マップがロードされます。

NSString* mapPath = [[NSBundle mainBundle] pathForResource:mapFileName ofType:mapFileType]; 
NSURL* mapURL = [NSURL fileURLWithPath: mapPath]; 
currentMap_ = [[Map alloc] initWithContentsOfURL: mapURL]; 
worldArray = [[NSMutableArray alloc] init]; 
itemArray = [[NSMutableArray alloc] init]; 
[self populateMap]; 
return; 

その後、populateMap機能では、それはNSPointsと使用して、ロードされたマップの各セルを通過しますループを作成し、WorldArrayのマップからのデータに基づいてオブジェクトを作成します。アイテムの場合、アイテムがある場所に通常の床が置かれ、itemArrayでアイテムが作成されます。どちらの配列もマップの高さによって決まる30x30です。

- (void)populateMap 
{ 
NSPoint location; 

for (location.y = 0; location.y < [currentMap_ height]; location.y++) 
{ 
    for (location.x = 0; location.x < [currentMap_ width]; location.x++) 
    { 
     char mapData = [currentMap_ dataAtLocation: location]; 
     for (GameObject *thisObject in worldDictionary) 
     { 
      //NSLog(@"char: <%c>", [thisObject single]); 
      if (mapData == [thisObject single]) 
      { 
       NSString* world = [thisObject className]; 
       //NSLog(@"(%@) object created",thisObject); 
       [self spawnObject:world atLocation:location]; 
      } 
     } 
     for (Item *thisObject in itemDictionary) 
     { 
      //NSLog(@"char: <%c>", [thisObject single]); 
      if (mapData == [thisObject single]) 
      { 
       NSString* item = [thisObject className]; 
       NSString* floor = [NormalFloor className]; 
       //NSLog(@"(%@) object created",thisObject); 
       [self spawnItem:item atLocation:location]; 
       [self spawnObject:floor atLocation:location]; 
      } 
     } 
     if (mapData == '1' 
      && [player_ stepsTaken] <= 0) 
     { 
      //NSLog(@"player spawned at (%f, %f)",location.x,location.y); 
      player_ = [[Player alloc] initAtLocation: location]; 
     } 
     if (mapData == '1') 
     { 
      //NSLog(@"floor created at (%f, %f)",location.x,location.y); 
      [worldArray addObject:[[NormalFloor alloc] initAtLocation: location]]; 
     } 
    } 
} 
[self setNeedsDisplay:YES]; 
} 

これは物事が生み出されているときに呼び出されるものである:ここで

はpopulateMapコードです

- (void)spawnObject: (NSString*) object atLocation: (NSPoint) location 
{ 
    //NSLog(@"(%@) object created",thisObject); 
    [worldArray addObject:[[NSClassFromString(object) alloc] initAtLocation: location]]; 
} 
- (void)spawnItem: (NSString*) item atLocation: (NSPoint) location 
{ 
    //NSLog(@"(%@) object created",thisObject); 
    [itemArray addObject:[[NSClassFromString(item) alloc] initAtLocation: location]]; 
} 

worldArrayとitemArrayゲームを含む、以降その瞬間から、上のどのような作品ですお絵かき。プレーヤーはworldArrayの内側にもあります。私はそれほど遠くない将来にモンスターのようなものを追加すると、プレーヤーを別の配列のcharacterArrayに分割することを検討しています。

新しいレベルを読み込むと、最初にそれらをデータに保存して後で読み込む方法やsavestate関数などの方法が検討されました。それから、私は同時に複数の階にモンスターを追いかけることや、ランダムなテレポートをするなど、プレイヤーの現在の範囲外でも何かが起こる可能性があるので、同時にすべてに到達できる必要があることを認識しました。ですから、基本的には、worldArrayとitemArrayを、0から始まって次のレベルを持つことができるように格納する良い方法を見つけ出す必要があります。私は欲求不満機能が必要ですが、あなたが実際にゲームをロゲリクに保存することは許されないので、これを行うまでそれに触れることはありません。

これを繰り返すには、これらのアレイをレベルごとに1セット用意する必要があります。私は使いやすい方法で格納する必要があります。 0から上への数値のシステムは問題ありませんが、マップ名のように説明的なものを使うことができれば、長期的にははるかに良いでしょう。

私は自分の問題を理解しました。私はNSMutableDictionaryをそれぞれ使用し、各レベルに対応するキーを使ってそれらを保存しています。魅力のように動作します。今では他のところで大きな問題があります。

答えて

1

私はそれを理解しました。NSMutableDictionariesを使用しています。各アレイ(オブジェクト、アイテム、最終的には文字)に1つずつ使用しています。それらはレベルの名前を使用して保存されます。魅力のように動作します。

+1

http://sneakyness.com/GTFO/01.75.app.zipこれまでのことを試してみたければ、 OS Xのみ。 – Sneakyness

関連する問題