iphone - Objective-C 中的二维数组?

标签 iphone objective-c struct nsarray

我正在开发一款需要单屏图 block map 的基本 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 的逻辑。例如:Tile 类可以有一个“think”方法来执行任何必要的逻辑。在我的 Water 子类中,这可能涉及在玩家被淹没时产生涟漪效应。

我的问题是:

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

最佳答案

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

可以使用 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 中创建一个二维数组,请定义 NSArrays(列)的 NSArrays(行)

关于iphone - Objective-C 中的二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3539160/

相关文章:

ios - 如何在IOS中打印出当前连接的蓝牙配件列表

php - 如何将我自己的日历与我的手机(iPhone、Android 等)同步

ios - 如何指定本地化Info.plist文件的路径

ios - UICollectionView 和它的 collectionViewLayout 之间是否存在保留周期?

c++ - 我的 C++ 函数在不应该的时候破坏了变量

iphone - 在 iPhone 应用程序中验证用户身份的最简单方法?

ios - 应用程序关闭时是否可以运行某些任务?

iphone - UIView 动画结果不一致

JSON omitempty 带 time.Time 字段

arrays - 在由可变结构元素组成的数组中的数据中使用 findmin() - Julia