2011-01-01 22 views
6

संपादित करें: मैंने एक साफ, नई परियोजना बनाई है, लेकिन फिर भी यह काम नहीं कर सकती है। कृपया इसे डाउनलोड करें, देखने के लिए एक छोटा सा कोड है और संभवतः किसी पेशेवर के लिए आसान है या किसी को भी यह देखने के लिए दूरस्थ रूप से अनुभव है कि मैं क्या गलत कर रहा हूं। बस उस पूर्णांक को भेजने की कोशिश कर रहा है।खेल केंद्र - डेटा भेजना और प्राप्त करना

http://www.2shared.com/file/fPOCLlg5/gkTest.html

हाय

मैं अपने iphone खेल में खेल केंद्र मल्टीप्लेयर लागू करने के लिए कोशिश कर रहा हूँ और नमूने मैं एप्पल डॉक्स में हाथ में और तीसरे भेजने और डेटा प्राप्त करने के विषय में पार्टियों से है समझने में कोई परेशानी हो रही है।

किसी को यहाँ कृपया आधिकारिक एप्पल डॉक्स में कोड नमूने समझा सकते हैं तो कृपया: http://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/GameKit_Guide/MatchesandVoice/MatchesandVoice.html#//apple_ref/doc/uid/TP40008304-CH10-SW4

या मुझे इस नमूना कोड के साथ मैं आपूर्ति की गई थी यह पता लगाने में मदद। यह एक पहले से बनाए गए वर्ग, भेजने और प्राप्त डेटा होगा के लिए यह से सभी खेल केंद्र कार्यों और एक नमूना को संभालने के लिए बनाया यह:

- (void) sendPosition 
{ 
    NSError *error; 
    PositionPacket msg; 
    msg.messageKind = PositionMessage; 
    msg.x = currentPosition.x; 
    msg.y = currentPosition.y; 
    NSData *packet = [NSData dataWithBytes:&msg length:sizeof(PositionPacket)]; 
    [match sendDataToAllPlayers: packet withDataMode: GKMatchSendDataUnreliable error:&error]; 
    if (error != nil) 
    { 
     // handle the error 
    } 
} 

और प्राप्त:

- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID 
{ 
    Packet *p = (Packet*)[data bytes]; 
    if (p.messageKind == PositionMessage) 
     // handle a position message. 
} 

मेरे लिए इस कोड के बारे में बड़ा सवाल आधिकारिक दस्तावेज़ बनाएं:

PositionPacket/Packet कहां से आता है? और यह सोचते हैं जब आप भेजें/आप उन्हें तो जैसे फोन डेटा प्राप्त करना चाहते हैं:

[self sendPosition]; 

या

[self match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID]; 

क्या मैं मैच, डेटा और playerID के रूप में प्रवेश करते हैं?

उदा। मेरे पास 'स्कोर' नामक एक int है लेकिन क्या कोई विशेष कुंजी नहीं है जिसे मुझे कुछ उपयोग करने की ज़रूरत है?

उत्तर

18

इस उदाहरण में, स्थितिपैकेट केवल एक संरचना है। निम्नलिखित पंक्ति तब उस संरचना को एनएसडीटा में रखती है जो सिर्फ "बाइट बाल्टी" वस्तु है।

NSData *packet = [NSData dataWithBytes: &msg length: sizeof(PositionPacket)]; 

तो अगर आप सिर्फ एक पूर्णांक स्कोर भेजना चाहते थे, तो आप एक sendScore विधि है कि इस तरह देखा हो सकता है:

- (void) sendScore 
{ 
    NSError *error; 
    int myScore = self.score; 
    NSData *packet = [NSData dataWithBytes:&myScore length:sizeof(myScore)]; 
    [match sendDataToAllPlayers: packet withDataMode: GKMatchSendDataUnreliable error: &error]; 
    if (error != nil) 
    { 
     // handle the error 
    } 
} 

आमतौर पर, आप एक struct चाहता हूँ वहाँ इतना है कि कुछ अतिरिक्त जानकारी जो रिसीवर को यह जानने देता है कि यह किस प्रकार का डेटा है।

msg.messageKind = PositionMessage; 

सामान्य तौर पर, आप, कुछ भी आप एक NSData वस्तु में समाहित करना चाहते हैं भेज सकते हैं के बाद से यह सिर्फ एक बाइट बाल्टी है: उदाहरण में, कि इस लाइन के प्रयोजन हो गया होता। उदाहरण के रूप में, या यहां तक ​​कि एनएसओब्जेक्ट्स (जब तक वे एनएससीओडी लागू करते हैं) के रूप में आदिम प्रकार जैसे इंक, या structs भेज सकते हैं। इस तरह एनएसओब्जेक्ट्स भेजने और प्राप्त करने के बारे में अधिक जानकारी के लिए आपको NSKeyedArchiver, NSCoding, और NSData पर पढ़ना चाहिए। यहां Archving पर ऐप्पल का संदर्भ दस्तावेज़ है।

प्राप्त करने के लिए, आप विधि को कॉल नहीं करते हैं, यह आपको किट द्वारा बुलाया जाता है।इसे "प्रतिनिधि विधि" (कोको पैरालांस में) या "कॉलबैक विधि" कहा जाता है। आप इसे "फोन कॉल" की तरह सोच सकते हैं कि आपका ऐप असीमित रूप से प्राप्त कर सकता है। हस्ताक्षर के साथ एक विधि को लागू करने से:

- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID; 

... आप कह रहे हैं "मैं फोन कॉल के इस प्रकार प्राप्त कर सकते हैं।" इसलिए जब गेमकिट किसी अन्य खिलाड़ी से आपकी तरफ से डेटा प्राप्त करता है, तो यह देखेगा कि आप उस तरह के कॉलबैक प्राप्त करना चाहते हैं और फिर उस विधि को कॉल करेंगे - फिर प्राप्त होने के आधार पर आपके आंतरिक एप्लिकेशन स्थिति को अपडेट करना आपके ऊपर निर्भर है।

इस उदाहरण के साथ जारी रखने के लिए, यदि आप सरल "कुछ भी नहीं लेकिन एक पूर्णांक" संदेश में ऊपर वर्णित भेजा था, तो आप इस तरह है कि विधि लागू हो सकता है:

- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID 
{ 
    int* receivedScorePtr = (int*)[data bytes]; 
    int receivedScore = *receivedScorePtr; 
    [self updateScore: received forPlayer: playerID]; 
} 

कि निश्चित रूप से है, यह है कि आप यह सोचते हैं UpdateScore नामक एक विधि है: forplayer: जो स्कोर की एक तालिका अद्यतन करेगा।

आप एक अधिक सामान्य चर्चा/कैसे प्रतिनिधियों और प्रतिनिधि तरीकों इस ब्लॉग प्रविष्टि पर काम का विवरण प्राप्त कर सकते हैं: http://mohrt.blogspot.com/2010/01/cocoa-and-delegates.html

जोड़ा: कोड प्रश्नकर्ता पोस्ट का उपयोग करना, मैं कुछ सुधार किए हैं और एक संस्करण का उत्पादन किया है कि इस नंगे हड्डियों के मामले के लिए "काम करता है"। Working Version of Test App To Send One Integer Through GameCenter मैं कोड की गुणवत्ता, या इसकी उपयुक्तता के बारे में कोई दावा नहीं करता, ठीक है, कुछ भी। मैंने 99.9% लिख नहीं लिया - कृपया इसमें मेरी पोस्टिंग न करें जो इसमें दिखाई देने वाली किसी भी चीज़ का समर्थन करता है।

एक सबक सीखा (जिसे मैं नहीं जानता था, इसलिए मैं आशा करता हूं कि यह दूसरों की मदद करे) यह है कि आप सिम्युलेटर के साथ मिलमेकिंग सेवा का उपयोग नहीं कर सकते हैं। इसका मतलब है कि इस परिदृश्य का परीक्षण करने के लिए आपको दो विकास-प्रावधान आईओएस डिवाइसों की आवश्यकता है, और संभवतः, गैर-तुच्छ कार्यक्रमों के लिए, दो विकास मशीनों को एक साथ दोनों उपकरणों को डीबग करने के लिए। इस समस्या को मुझे समझते समय मुझे सबसे अधिक समय लगता है।

+0

यह बहुत अच्छा है, बहुत बहुत धन्यवाद! अधिक समझ में आता है, हालांकि 'मैच' के लिए यह सिर्फ एक नया जीकेमैच है जिसे मैं घोषित कर सकता हूं या इसे किसी विशिष्ट स्थान से होने की आवश्यकता है? –

+0

इस विधि के मामले में, मैच आपके पास पास हो जाता है। मुझे संदेह है कि साधारण मामले में (यानी एक समय में केवल एक ही गेम चल रहा है) कि आपको इन तरीकों से इसके बारे में चिंता करने की ज़रूरत नहीं है/इसके साथ कुछ भी करने की आवश्यकता नहीं है। यदि आप आम तौर पर मैचों पर अधिक जानकारी की तलाश में हैं, तो वे मैचमेकिंग सेवा से आते हैं। विवरण यहां: http://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/GameKit_Guide/MatchesandVoice/MatchesandVoice.html#//apple_ref/doc/uid/TP40008304-CH10-SW9 – ipmcc

+0

मैं समझता हूं कि प्राप्त डेटा विधि हमें जीकेमैच 'मैच' देती है लेकिन प्रेषण विधि में 'मिलान' कहां से आती है? –

संबंधित मुद्दे