Objective-C中的二维数组?

5

我正在开发一个基础的iPhone游戏,需要一个单屏幕瓦片图。这部分内容并不复杂。由于我有C语言的背景,所以我的当前解决方案类似于:

typedef struct _Tile {
    NSString *type;
} Tile;

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

这个方法可以正常工作,但我想知道是否有一种更加“正确”的方式来通过Objective-C处理。如果我采用Objective-C的方法,情况将如下:我会创建一个基本的Tile类来保存基本瓷砖属性,然后为特定的瓷砖类型(例如@interface Water : Tile {})创建子类。这将允许我还拥有特定于瓷砖的逻辑。例如:Tile类可以有一个“think”方法,该方法将执行任何必要的逻辑。在我的Water子类中,如果玩家被淹没,这可能涉及创建涟漪效果。

那么我的问题是:

  1. 在这种情况下使用C结构是否可行?如果不行,我的Obj-C方法是否正确?
  2. 如果我创建一个基本的Tile类,并使用子类来表示特定的Tile类型,那么我如何动态地实例化每个Tile子类(假设我有一个包含类型“water”的NSString,我需要实例化Water类)?
2个回答

1

你的问题的第二部分比较容易解决,所以我会先处理它。

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

假设你的WaterTile是UIView的子类(因为它很可能会在屏幕上绘制),那么就可以这样做。

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

现在是第一部分。

假设你想要在屏幕上绘制的瓦片,通过继承UIView获得了所有OO的好处。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(行)。

-1

在这里,我会使用结构体。我喜欢使用它们,因为它使我的代码看起来很棒,而且易于使用。

苹果也使用它,比如NSRect、NSPoint和NSSize。

此外,我会存储像以下类型的数据:

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

switch((TileType)type) { case TileTypeDefault: [[TileDefault alloc] initWithSize:size]; break; }

等等...如果你不太明白我在说什么,请评论告诉我:P


我知道枚举。但是你能为什么要使用结构体而不是类来进行辩解吗?我并不特别想让我的代码变得“棒极了”,我只是想让它变得正确。 - ndg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接