2010-08-21 59 views
5

我正在研究一個基本的iPhone遊戲,需要單屏幕地圖。那裏沒什麼困難。我來自一個C的背景,所以我目前的解決方案看起來有點像這樣:Objective-C中的二維數組?

typedef struct _Tile { 
    NSString *type; 
} Tile; 

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

這工作得很好,但我不知道是否有一個稍微更「正確」的方式來處理通過Objective-C的東西。如果我採用Objective-C方法,我將如何看待情況:我會創建一個基本Tile類來保存基本的tile屬性,然後我可以對特定的tile類型進行子類化(例如,@interface Water : Tile {})。這將允許我也具有瓷磚特定的邏輯。例如:Tile類可以有一個'think'方法來執行任何必要的邏輯。在我的水子類中,如果玩家被淹沒,可能會產生連鎖反應。

我的問題,然後:

  1. 是否可以接受在這種情況下要使用C結構?如果沒有,我是否在正確的軌道上關於我的Obj-C方法?
  2. 如果我要創建一個基類Tile類併爲特定的Tile類型使用子類,我將如何動態實例化每個Tile子類(假設我有一個包含'water'類型的NSString,我需要實例化Water類)。

回答

1

你問題的第二部分是比較容易解決,所以我會接近,第一。

動態實例在運行任意類的對象可以使用NSClassFromString()

假設你WaterTile做的是UIView的(這似乎是有道理的,因爲它很可能要在屏幕上繪製)的一個子類

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

現在爲第一部分。

鑑於瓷磚是你想要在屏幕上繪製的東西,你將通過繼承UIView而受益於所有的OO善良,它將響應觸摸事件並且具有定位和繪圖所需的方法。這是與使用結構化瓷磚相比的主要優勢。

很可能,您正在考慮的抽象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

使用結構是我在這裏要做的,我喜歡使用它們,因爲它使我的代碼看起來很棒,而且易於使用。

Apple也使用它,關於NSRect NSPoint和NSSize。

此外,我將存儲類型,如:

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

開關((TileType)型) { 情況TileTypeDefault: [[TileDefault的alloc] initWithSize:尺寸]; 休息; }

等..如果你真的不得到什麼亞姆想說發表評論我:P

+0

我知道枚舉。但是你能證明這裏使用struct來代替類嗎?我對使代碼「非常棒」並不特別感興趣,我只是想讓它合適。 – ndg 2010-08-21 22:30:15