2-мерные массивы в Objective-C? - PullRequest
       14

2-мерные массивы в Objective-C?

5 голосов
/ 22 августа 2010

Я работаю над базовой игрой для iPhone, для которой требуется одноэкранная карта тайлов. Ничего сложного там нет. Я пришел из C фона, поэтому мое текущее решение выглядит примерно так:

typedef struct _Tile {
    NSString *type;
} Tile;

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

Это прекрасно работает, но мне интересно, есть ли немного более «правильный» способ обработки вещей через Objective-C. Вот как я вижу ситуацию, если бы я принял подход Objective C: я бы создал базовый класс плиток для хранения базовых свойств плиток, которые я мог бы затем создать подкласс для определенных типов плиток (например, @interface Water : Tile {}). Это позволило бы мне также иметь логику, специфичную для тайлов. Например: класс Tile может иметь метод think, который будет выполнять любую необходимую логику. В моем подклассе Water это может включать создание эффекта ряби, если игрок погружен в воду.

Тогда мои вопросы:

  1. Допустимо ли использовать структуры C в этой ситуации? Если нет, то я на правильном пути в отношении моего подхода к Obj-C?
  2. Если бы я должен был создать базовый класс Tile и использовать подклассы для определенных типов Tile, как бы я динамически создавал каждый подкласс Tile (учитывая, что у меня есть NSString, содержащая тип 'water', мне нужно было бы создать экземпляр класса Water ).

Ответы [ 2 ]

1 голос
/ 22 августа 2010

Ко второй части вашего вопроса проще обратиться, поэтому я подойду к первому.

Динамическое создание экземпляра объекта произвольного класса во время выполнения можно выполнить с помощью NSClassFromString()

Предполагая, что ваш WaterTile является подклассом UIView (что, кажется, имеет смысл, так как он, вероятно, будет нарисован на экране)

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

Теперь для первой части.

Учитывая, чтоПлитка - это то, что вы хотите нарисовать на экране, вы извлечете выгоду из всего совершенства ОО, унаследовав от UIView, который будет реагировать на сенсорные события и иметь методы, необходимые для позиционирования и рисования.Это основное преимущество перед использованием структуры для ваших плиток.

Скорее всего, абстрактный класс Tile, о котором вы думаете, действительно не понадобится, так как большинство свойств и методов, предоставляемых UIView, заставляет меня думать, что вы, возможно, захотите определить Tile @protocol вместо.

@protocol TileViewDrawing 
- (void)drawThinking;
@end

@interface WaterTileView : UIView <TileViewDrawing>
@end

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

Чтобы создать двумерные массивы в вашем Map, определите NSArray (столбцы) NSArrays (строка)

0 голосов
/ 22 августа 2010

Использование структур это то, что я хотел бы сделать здесь ..., я люблю их использовать, так как мой код выглядит потрясающе и его легко использовать.

Apple также использует его, как насчет NSRect NSPoint и NSSize.

Также я хотел бы хранить типы как:

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

переключатель ((TileType) типа) { case TileTypeDefault: [[TileDefault alloc] initWithSize: size]; перерыв; }

и так далее ... если вы не понимаете, что я пытаюсь сказать, прокомментируйте меня: P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...