Objective-C中的二维数组?

ndg*_*ndg 5 iphone struct objective-c nsarray

我正在开发一款需要单屏平面图的基本iPhone游戏.那里没什么难的.我来自C背景,所以我目前的解决方案看起来有点像这样:

typedef struct _Tile {
    NSString *type;
} Tile;

@interface Map {
    Tile mapData[MAP_TILE_MAX_X][MAP_TILE_MAX_Y];
}
Run Code Online (Sandbox Code Playgroud)

这很好,但我想知道是否有一种更"正确"的方式来处理Objective-C的事情.如果我采用Objective-C方法,我会看到情况如何:我将创建一个基本的Tile类来保存基本的tile属性,然后我可以为特定的tile类型(@interface Water : Tile {}例如)创建子类.这将允许我也具有特定于Tile的逻辑.例如:Tile类可以有一个'think'方法来执行任何必要的逻辑.在我的Water子类中,如果玩家被淹没,这可能会产生涟漪效应.

我的问题是:

  1. 在这种情况下使用C结构是否可以接受?如果没有,我的Obj-C方法是否正确?
  2. 如果我要创建一个基本Tile类并使用特定Tile类型的子类,我将如何动态实例化每个Tile子类(假设我有一个包含类型'water'的NSString,我需要实例化Water类).

fal*_*eek 1

你问题的第二部分更容易解决,所以我将首先解决这个问题。

在运行时动态实例化任意类的对象可以使用NSClassFromString()

假设你的 WaterTile 是 UIView 的子类(这似乎是有道理的,因为它很可能被绘制在屏幕上)

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

现在是第一部分。

鉴于图块是您想要在屏幕上绘制的东西,您将通过继承 UIView 受益于所有 OO 优点,UIView 将响应触摸事件并具有定位和绘制所需的方法。这是与使用图块结构相比的主要优点。

有可能,您正在考虑的抽象 Tile 类实际上并不需要,因为 UIView 提供的大多数属性和方法都使我认为您可能需要定义 a Tile @protocol

@protocol TileViewDrawing 
- (void)drawThinking;
@end

@interface WaterTileView : UIView <TileViewDrawing>
@end

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

Map要在定义NSArray(行)的NSArrays(列)中创建二维数组