我正在开发一款需要单屏图 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 子类中,这可能涉及在玩家被淹没时产生涟漪效应。
我的问题是:
- 在这种情况下使用 C 结构是否可以接受?如果不是,我的 Obj-C 方法是否走在正确的轨道上?
- 如果我要创建一个基础 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/