2010-08-21 36 views
5

Tôi đang làm việc trên một trò chơi iPhone cơ bản yêu cầu sơ đồ trang web một màn hình. Không có gì khó khăn ở đó. Tôi đến từ một nền C, vì vậy giải pháp hiện tại của tôi trông hơi như thế này:mảng 2 chiều trong Objective-C?

typedef struct _Tile { 
    NSString *type; 
} Tile; 

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

này hoạt động tốt, nhưng tôi đang tự hỏi nếu có một cách nhẹ hơn 'đúng' để xử lý mọi thứ qua Objective-C. Đây là cách tôi thấy tình hình sẽ xảy ra nếu tôi áp dụng cách tiếp cận Objective-C: Tôi muốn tạo một lớp Tile cơ bản để giữ các thuộc tính tile cơ bản, sau đó tôi có thể phân lớp cho các loại gạch cụ thể (ví dụ: @interface Water : Tile {}). Điều này sẽ cho phép tôi cũng có logic cụ thể Tile. Ví dụ: lớp Tile có thể có phương thức 'suy nghĩ' sẽ thực hiện bất kỳ logic cần thiết nào. Trong lớp con Water của tôi, điều này có thể liên quan đến việc tạo hiệu ứng gợn sóng nếu người chơi bị nhấn chìm.

Câu hỏi của tôi thì:

  1. Có thể chấp nhận sử dụng C struct trong tình huống này? Nếu không, tôi có đi đúng hướng liên quan đến cách tiếp cận Obj-C của tôi không?
  2. Nếu tôi tạo lớp Gạch nền và sử dụng các lớp con cho các loại Tile cụ thể, tôi sẽ tự động khởi tạo từng lớp con Tile như thế nào (tôi đã có NSString chứa loại 'water', tôi sẽ cần phải khởi tạo lớp Water).

Trả lời

1

Phần thứ hai của câu hỏi của bạn là dễ dàng hơn để giải quyết vấn đề, vì vậy tôi sẽ tiếp cận đầu tiên.

động instantiating một đối tượng của một lớp tùy ý trong thời gian chạy có thể được thực hiện bằng NSClassFromString()

Giả sử WaterTile của bạn là một lớp con của UIView (mà dường như có ý nghĩa vì nó có khả năng được vẽ trên màn hình)

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

Bây giờ cho phần đầu tiên.

Cho rằng lát là thứ bạn muốn vẽ trên màn hình, bạn sẽ được hưởng lợi từ tất cả sự tốt lành của OO bằng cách kế thừa từ UIView, sẽ phản hồi các sự kiện chạm và có phương pháp cần thiết để định vị và vẽ. Đây là lợi thế lớn hơn bằng cách sử dụng một cấu trúc cho gạch của bạn.

Rất có thể, lớp Gạch trừu tượng mà bạn đang nghĩ đến sẽ không thực sự cần thiết vì hầu hết các thuộc tính và phương pháp do UIView cung cấp dẫn tôi nghĩ rằng bạn có thể muốn xác định Tile @protocol.

@protocol TileViewDrawing 
- (void)drawThinking; 
@end 

@interface WaterTileView : UIView <TileViewDrawing> 
@end 

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

Để tạo một mảng 2D trong bạn Map xác định một NSArray (cột) của NSArrays (hàng)

-1

Sử dụng cấu trúc là những gì tôi sẽ làm ở đây .., tôi thích sử dụng chúng vì nó làm cho mã của tôi trông tuyệt vời và dễ sử dụng.

Apple cũng sử dụng nó, điều gì về NSPoint và NSSize của NSRect.

Ngoài ra tôi sẽ lưu trữ các loại như:

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

switch ((TileType) gõ) { trường hợp TileTypeDefault: [[TileDefault alloc] initWithSize: size]; ngắt; }

và vân vân .. nếu bạn không thực sự có được những gì iam cố gắng để nói bình luận tôi: P

+0

Tôi nhận thức được sự đếm. Nhưng bạn có thể biện minh cho việc sử dụng một cấu trúc ở đây thay cho một lớp học không? Tôi không đặc biệt quan tâm đến việc làm cho mã của tôi "tuyệt vời", tôi chỉ muốn làm cho nó thích hợp. – ndg

Các vấn đề liên quan