2010-08-21 16 views
5

Pracuję nad podstawową grą na iPhone'a, która wymaga tilemapu z jednym ekranem. Nic trudnego. Pochodzę z C tle, więc moje obecne rozwiązanie wygląda trochę tak:2-wymiarowe tablice w Objective-C?

typedef struct _Tile { 
    NSString *type; 
} Tile; 

@interface Map { 
    Tile mapData[MAP_TILE_MAX_X][MAP_TILE_MAX_Y]; 
} 

Działa to dobrze, ale zastanawiam się, czy jest nieco bardziej „poprawny” sposób obsłużyć rzeczy poprzez Objective-C. Oto, jak widzę sytuację, gdybym zastosował podejście Objective-C: utworzyłbym podstawową klasę Tile do przechowywania podstawowych właściwości płytek, które mogłem następnie podklasować dla konkretnych typów płytek (na przykład @interface Water : Tile {}). To pozwoliłoby mi również uzyskać logikę specyficzną dla Tile. Na przykład: klasa Tile może mieć metodę "myślenia", która wykonywałaby jakąkolwiek niezbędną logikę. W mojej podklasie Water może to oznaczać tworzenie efektu marszczenia, jeśli gracz był zanurzony.

Moje pytania wtedy:

  1. Czy dopuszczalne jest użycie struktur C w tej sytuacji? Jeśli nie, czy jestem na dobrej drodze w odniesieniu do mojego podejścia Obj-C?
  2. Gdybym miał utworzyć podstawową klasę Tile i użyć podklas dla konkretnych typów Tile, w jaki sposób dynamicznie tworzyłem podklasę każdej podklasy Tile (biorąc pod uwagę, że mam NSString zawierający typ "water", musiałbym utworzyć instancję klasy Water).

Odpowiedz

1

Druga część pytania jest łatwiejszy do rozwiązania, więc będę zbliżać, że w pierwszej kolejności.

Dynamicznie instancji przedmiotem arbitralnej klasy w czasie wykonywania można zrobić za pomocą NSClassFromString()

Zakładając, że WaterTile jest podklasą UIView (co wydaje się mieć sens, ponieważ jest prawdopodobne, aby być rysowane na ekranie)

UIView *newTile = [[NSClassFromString([NSString stringWithFormat:@"%@TileView", [@"water" capitalizedString]]) alloc] init]; 

Teraz za pierwszą część.

Biorąc pod uwagę, że dachówka jest czymś, co chcesz narysować na ekranie, będziesz czerpać korzyści z całego dobroci OO, dziedzicząc z UIView, które będą reagować na zdarzenia dotykowe i mają metody potrzebne do pozycjonowania i rysowania. Jest to główna przewaga nad wykorzystaniem struktury do płytek.

Są szanse, że abstrakcyjna klasa Tile, o której myślisz, nie będzie tak naprawdę potrzebna, ponieważ większość właściwości i metod dostarczonych przez UIView, która prowadzi mnie do myślenia, że ​​zamiast tego chcesz zdefiniować Tile @protocol.

@protocol TileViewDrawing 
- (void)drawThinking; 
@end 

@interface WaterTileView : UIView <TileViewDrawing> 
@end 

@implementation WaterTileView 
-(void)drawThinking 
{ 
    // Code to show rippling effect 
} 
@end 

Aby utworzyć tablice 2D w swoich Map Zdefiniuj NSArray (kolumny) NSArrays (wiersz)

-1

Korzystanie z structs jest tym, co bym tu zrobił .., uwielbiam ich używać, ponieważ sprawia, że ​​mój kod wygląda świetnie i jest łatwy w użyciu.

Apple też tego używa, co z NSRect NSPoint i NSSize.

także będzie przechowywać typów, na przykład:

typedef enum{ 
    TileTypeDefault = 0, 
    TileTypeSomething, 
    TileTypeLOL 
} TileType; 

przełącznika ((TileType) typu) { przypadku TileTypeDefault: [[TileDefault Alloc] initWithSize: rozmiar]; przerwa; }

i tak dalej .. jeśli nie naprawdę co iam próbuje powiedzieć mi komentować: P

+0

Jestem świadomy teksty stałe. Ale czy możesz uzasadnić użycie struktury zamiast klasy? Nie jestem szczególnie zainteresowany tym, aby mój kod był "niesamowity", chciałbym go uczynić właściwym. – ndg