2010-10-07 10 views
13

मैं यह नहीं समझ सकता कि यह कैसे काम करता है। जो मैं करने की कोशिश कर रहा हूं वह है कि यदि कोई तीसरा खिलाड़ी इसमें शामिल हो जाता है तो दो खिलाड़ी एक खेल खेल सकते हैं, यदि चौथा और आखिरी खिलाड़ी इसमें शामिल हो जाता है तो तुरंत खेल में शामिल हो सकता है। वे किसी भी कारण से गेम को किसी भी समय छोड़ सकते हैं, अगर ऐसा होता है तो किसी अन्य व्यक्ति के लिए या उसी व्यक्ति के लिए फिर से कनेक्ट करने के लिए एक जगह खुली होनी चाहिए। ये तो कमाल की सोच है।गेम सेंटर प्रोग्रामिंग एक मैच ढूँढना

अब मुझे जो मिला वह निम्नलिखित है। मैं स्पष्ट कारणों से स्थानीय खिलाड़ी को प्रमाणित करता हूं। तब मैं तो जैसे एक मैच के लिए खोज: यदि मैं तीन अलग-अलग उपकरणों पर इस हिस्से पर अमल

if (matchRequest) [matchRequest release]; 
matchRequest   = [[GKMatchRequest alloc] init]; 
matchRequest.minPlayers = 2; 
matchRequest.maxPlayers = 4; 

[[GKMatchmaker sharedMatchmaker] findMatchForRequest:matchRequest withCompletionHandler:^(GKMatch *match, NSError *error) { 
    if (error) { 
     // An error occured 
    } else { 
     if (matchCurrent) [matchCurrent release]; 
     matchCurrent   = [match retain]; 
     matchCurrent.delegate = self; 
    } 
}]; 

, उनमें से दो एक दूसरे को मिलेगा और तीसरे अभी भी लग रही है। इसलिए मैंने पाया कि अनुरोध के लिए खोज मैच के बाद कम से कम खिलाड़ियों को एक बार निष्पादित किया जाएगा। तो मुझे जो चाहिए वह एक ऐसी विधि थी जिसने मैचकंटेंट का उपयोग किया जो मैंने और अधिक खिलाड़ियों को जोड़ने के लिए बनाए रखा। सौभाग्य से वह विधि मौजूद थी, लेकिन यह कैसे काम करेगा? आप इसे इस मामले में कब कहते हैं? मैंने इसे एक बटन के नीचे रखने का फैसला किया ताकि एक मैच मिलने पर मैन्युअल रूप से इसे निष्पादित कर सके।

मुझे पता चला कि जब मैंने इसे पहली डिवाइस पर दबाया था, अंत में तीसरा डिवाइस मैच को पहला और दूसरा डिवाइस मिल सकता था। असल में दूसरे और तीसरे डिवाइस में शामिल प्रत्येक डिवाइस के प्लेयर आईडी शामिल थे। कौन - सी एक अच्छी बात है। लेकिन दो समस्याएं हैं।

  1. कौन सा डिवाइस वास्तव में addPlayersToMatch विधि को कॉल करना चाहिए? और आप इसे उस विधि को निष्पादित करने वाले डिवाइस पर कैसे प्रतिबंधित कर सकते हैं? इसके अलावा आपको इसे कब कॉल करना चाहिए?
  2. क्यों, उस विधि को कॉल करने वाले डिवाइस पर, प्लेयर आईडी अपडेट नहीं है?

    [[GKMatchmaker sharedMatchmaker] addPlayersToMatch:matchCurrent matchRequest:matchRequest completionHandler:^(NSError *error) { 
        //matchCurrent.playerIDs is not updated?! 
    }]; 
    

    असल में वे अपडेट किए गए हैं। जब मैं प्लेयर और दूसरी और तीसरी डिवाइस पर दिखाई देता हूं तो मैं मैन्युअल रूप से matchCurrent.playerIDs को डिवाइस पर अपडेट करता हूं और अचानक यह प्लेयर को पहचानता है। हालांकि खिलाड़ी के लिए 'didChangeState' भी नहीं कहा जाता है जब डिवाइस पर नया प्लेयर खोजा जाता है।

+0

इस एक सर्वर ग्राहक मॉडल या एक पी 2 पी मॉडल के आधार पर है? कनेक्शन, टीसीपी, udp, http प्रारंभ करने के लिए क्या उपयोग किया जा रहा है? वर्तमान में जुड़े हुए खिलाड़ियों के लिए डेटा कहां रखा गया है? –

+3

"जो मैं करने की कोशिश कर रहा हूं वह है कि यदि कोई तीसरा खिलाड़ी जुड़ता है तो दो खिलाड़ी एक गेम खेल सकते हैं" - क्या आप अपने दूसरे और तीसरे वाक्यों में कुछ अर्धविराम और अल्पविराम जोड़ सकते हैं? जैसा कि है, रन-ऑन वाक्यों में, यह बताने में मुश्किल है कि प्रत्येक अगर क्लॉज पिछले या निम्नलिखित स्वतंत्र खंड को संशोधित करता है या नहीं। – LarsH

उत्तर

0

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

ऐसा लगता है कि आप बहु-खिलाड़ी ढांचे के लिए कुछ और दस्तावेज और/या नमूना कोड ढूंढना चाहते हैं।

1

कौन सा डिवाइस वास्तव में addPlayersToMatch विधि को कॉल करना चाहिए? और कैसे आप इसे एक डिवाइस पर उस विधि को निष्पादित कर सकते हैं?

डिवाइस "ड्रॉ ​​स्ट्रॉ" रखने से आप इस समस्या को हल कर सकते हैं। प्रत्येक डिवाइस एक यादृच्छिक संख्या उत्पन्न करता है, फिर इसे दूसरों को भेजता है। सबसे बड़ी संख्या वाला डिवाइस नेता है, और यह वह है जिसे addPlayersToMatch को कॉल करना होगा। यदि दो डिवाइस एक ही संख्या चुनते हैं, तो संख्याओं को फेंक दें और शुरू करें।

2

आप ऐप्पल आईओएस गेम सेंटर जीकेमैचमेकर क्लास का उपयोग कर रहे हैं। मुझे लगता है कि आप सहकर्मी कनेक्शन के लिए एक सहकर्मी का उपयोग कर रहे हैं, होस्ट नहीं किया।

जीकेमैच क्लास आपको प्लेयर आईडीएस सरणी देता है।

@property(nonatomic, readonly) NSArray *playerIDs 

ताकि आप पहले खिलाड़ी कॉल addPlayersToMatch चयन करने के लिए इसका इस्तेमाल करने में सक्षम हो सकता यह एक आदेश दिया सूची है।

नीचे लिंक कुछ दस्तावेज है।

http://developer.apple.com/library/ios/#documentation/GameKit/Reference/GKMatchmaker_Ref/Reference/Reference.html

http://developer.apple.com/library/ios/#documentation/GameKit/Reference/GKMatch_Ref/Reference/Reference.html

http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/GameKit_Guide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008304