2010-08-21 16 views
5

मैं एक बुनियादी आईफोन गेम पर काम कर रहा हूं जिसके लिए एक सिंगल-स्क्रीन टाइलमैप की आवश्यकता है। वहां कुछ भी मुश्किल नहीं है। मैं एक सी पृष्ठभूमि से आते हैं, इसलिए मेरे वर्तमान समाधान इस तरह एक सा दिखता है:2-आयामी सरणी?

typedef struct _Tile { 
    NSString *type; 
} Tile; 

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

यह ठीक काम करता है, लेकिन वहाँ है कि अगर एक से थोड़ा अधिक 'सही' जिस तरह से ऑब्जेक्टिव-सी के माध्यम से चीजों को संभालने के लिए मैं सोच रहा हूँ। यहां बताया गया है कि अगर मैं ऑब्जेक्टिव-सी दृष्टिकोण को अपनाना चाहता हूं तो मैं स्थिति को कैसे देख सकता हूं: मैं मूल टाइल गुणों को रखने के लिए बेस टाइल क्लास तैयार करूंगा, जिसे मैं विशिष्ट टाइल प्रकारों (@interface Water : Tile {}, उदाहरण के लिए) के लिए उपclass कर सकता हूं। इससे मुझे टाइल-विशिष्ट तर्क भी मिल जाएगा। उदाहरण के लिए: टाइल क्लास में 'सोच' विधि हो सकती है जो किसी आवश्यक तर्क को निष्पादित करेगी। मेरे पानी के उप-वर्ग में, यदि खिलाड़ी डूबे हुए हों तो इसमें एक लहर प्रभाव पैदा हो सकता है।

मेरे सवालों का तो:

  1. यह इस स्थिति में सी structs उपयोग करने के लिए स्वीकार्य है? यदि नहीं, तो क्या मैं अपने ओब्जे-सी दृष्टिकोण के संबंध में सही रास्ते पर हूं?
  2. यदि मैं बेस टाइल क्लास बनाना चाहता हूं और विशिष्ट टाइल प्रकारों के लिए उप-वर्गों का उपयोग करना चाहता हूं, तो मैं प्रत्येक टाइल सबक्लास को गतिशील रूप से कैसे चालू करूं (यह देखते हुए कि मेरे पास एनएसटीटींग है जिसमें 'पानी' है, मुझे जल वर्ग को तुरंत चालू करना होगा)।

उत्तर

1

अपने प्रश्न के दूसरे भाग को संबोधित करने के लिए आसान है, इसलिए मैं पहले कि से संपर्क करेगा।

गतिशील रूप से UIView (जो समझ बनाने के लिए है, क्योंकि यह संभावना है स्क्रीन पर तैयार हो रहा है) के एक उपवर्ग instantiating रनटाइम पर एक मनमाना वर्ग की एक वस्तु अपने WaterTile मान लिया जाये कि NSClassFromString()

उपयोग किया जा सकता है

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

अब पहले भाग के लिए।

यह देखते हुए कि टाइल कुछ ऐसी चीज है जिसे आप स्क्रीन पर आकर्षित करना चाहते हैं, आपको UIView से विरासत में सभी ओओ भलाई से लाभ होगा जो टच इवेंट्स का जवाब देगा और स्थिति और ड्राइंग के लिए आवश्यक विधियों का होगा। आपके टाइल्स के लिए एक स्ट्रक्चर का उपयोग करने पर यह मुख्य लाभ है।

संभावनाएं हैं, अमूर्त टाइल क्लास जिसे आप सोच रहे हैं, वास्तव में इसकी आवश्यकता नहीं होगी क्योंकि UIView द्वारा प्रदान की जाने वाली अधिकांश संपत्तियों और विधियों के कारण मुझे लगता है कि आप Tile @protocol को इसके बजाय परिभाषित करना चाहते हैं।

@protocol TileViewDrawing 
- (void)drawThinking; 
@end 

@interface WaterTileView : UIView <TileViewDrawing> 
@end 

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

NSArrays (पंक्ति) के अपने Map परिभाषित एक NSArray (कॉलम) में एक 2 डी सरणियों

-1

structs का उपयोग करना मैं यहां क्या करूँगा .., मुझे उनका उपयोग करना अच्छा लगता है क्योंकि यह मेरा कोड शानदार दिखता है और इसका उपयोग करना आसान बनाता है।

ऐप्पल इसका भी उपयोग करता है, एनएसआरईटी एनएसपीओएन और एनएसएसआईएस के बारे में क्या।

इसके अलावा, मैं जैसे प्रकार के स्टोर होगा:

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

स्विच ((TileType) टाइप) { मामले TileTypeDefault: [[TileDefault alloc] initWithSize: आकार]; ब्रेक; }

और इतने पर .. तुम सच में iam कि मुझे क्या टिप्पणी कहने की कोशिश कर मिलता है नहीं: पी

+0

मैं enums के बारे में पता कर रहा हूँ बनाने के लिए। लेकिन क्या आप कक्षा के बदले यहां एक संरचना के उपयोग को औचित्य दे सकते हैं? मैं विशेष रूप से अपना कोड "कमाल" बनाने में रूचि नहीं रखता, मैं इसे उचित बनाना चाहता हूं। – ndg