2013-08-07 4 views
5

मैं [[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:] का उपयोग कर गेमकिट में स्थानीय मिलमेकिंग काम करने की कोशिश कर रहा हूं। अनिवार्य रूप से, मैं इंटरफ़ेस-कम स्थानीय मैचों को लागू करने की कोशिश कर रहा हूं: जब तक मेरे स्थानीय आसपास के एक खिलाड़ी के रूप में, मैं एक मैच कनेक्ट करना और शुरू करना चाहता हूं। महत्वपूर्ण बात यह है कि, मैं केवल स्थानीय खिलाड़ियों के लिए ऐसा करना चाहता हूं: I कभी भी इंटरनेट पर स्वचालित रूप से मिलान नहीं करना चाहता।कुछ स्टार्टब्रोइंगफोरनियरप्लेयर विथरिएबल हैंडलर प्रश्न

मैंने आईट्यून्स में अपने ऐप के लिए गेम सेंटर को सक्षम किया है और परीक्षण के लिए उपयोग किए जा रहे प्रत्येक डिवाइस पर एक अलग सैंडबॉक्स खाते के लिए साइन अप किया है।

मैं GKMatchmakerViewController के साथ दोनों विवाह की कोशिश की है startBrowsingForNearbyPlayersWithReachableHandler: साथ और कार्यक्रम संबंधी जीवनसाथी का चुनाव एक iPhone 4 और एक 4 पीढ़ी आइपॉड टच मेरी मेज पर एक दूसरे के बगल में बैठे पर एक ही कोड चलाने (स्थानीय खिलाड़ी के सत्यापन के बाद)। न तो कभी दूसरा पाता है; आस-पास के खिलाड़ियों को खोजने के लिए इंटरफ़ेस जब GKMatchmakerViewController का उपयोग कर

ढूँढना खिलाड़ियों पर बनी हुई है ...

स्पिनर, और जब startBrowsingForNearbyPlayersWithReachableHandler: का उपयोग कर, अधिसूचना ब्लॉक कभी नहीं कहा जाता हो जाता है।

यहां परीक्षण के कोड के अपने वर्तमान ब्लॉक है:

-(void)connectLocal 
{ 
    if(![GKLocalPlayer localPlayer].isAuthenticated) 
    { 
     // authenticateLocalPlayer calls connectLocal again after authentication is complete 
     [ self authenticateLocalPlayer ]; 
     return; 
    } 
    [[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:^(NSString *playerID, BOOL reachable) { 
      NSLog(@"Reachability changed for player %@", playerID); 
     } ]; 
} 

डॉक्स एक छोटे से विरल &, इस विषय पर भ्रामक है, खासकर जब यह स्थानीय mulitplayer के बीच अंतर करने के लिए आता है और इंटरनेट पर मेल खाता है। उदाहरण के लिए, स्थानीय खिलाड़ी को प्रमाणित करना और खिलाड़ियों को उस मैच में शामिल होने से पहले एक मैच बनाना आवश्यक लगता है (Creating Any Kind of Match Starts with a Match Request)। हालांकि this little nugget अन्यथा सुझाव देने के लिए लगता है:

मानक यूजर इंटरफेस खिलाड़ियों अन्य आसपास के खिलाड़ियों की खोज करने की अनुमति देता है, तब भी जब न तो खिलाड़ी वर्तमान में सीधे खेल केंद्र से जुड़ा है।

साथ ही, प्रवाह Searching For Nearby Players में वर्णित में, एक मैच अनुरोध नोटिफिकेशन startBrowsingForNearbyPlayersWithReachableHandler: के लिए पारित ब्लॉक के माध्यम से खोजने खिलाड़ियों के बाद चरण 3, तक नहीं बनाया गया है। दुर्भाग्यवश, मुझे अब तक कभी नहीं मिला है।

तो, सवाल:

1) क्या मैं सही हूँ सोच मैं स्थानीय खिलाड़ी के सत्यापन से पहले startBrowsingForNearbyPlayersWithReachableHandler: कॉल कर सकते हैं में? गेमकिट एक त्रुटि नहीं फेंकता है, इसलिए मुझे लगता है कि यह ठीक है। यह एक दांत धारणा हो सकती है। चाहे मैं प्रमाणित करता हूं या नहीं, ऐसा लगता है कि इसमें कोई फर्क नहीं पड़ता है।

2) क्या किसी ने [GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler: का उपयोग करके स्थानीय ऑटो-मिलान सफलतापूर्वक कार्यान्वित किया है? क्या वहां कोई अच्छा उदाहरण कोड है जो पूर्ण प्रवाह को दिखाता है, खिलाड़ियों के लिए एक मैच शुरू करने के लिए ब्राउज़ करने से, सभी प्रोग्रामेटिक रूप से?

3) वेब पर विवादित रिपोर्ट प्रतीत होती है कि गेमकिट-सक्षम ऐप्स को आईओएस सिम्युलेटर में परीक्षण किया जा सकता है या नहीं। आम सहमति नहीं है, और आईओएस हार्डवेयर पर परीक्षण करना बेहतर है। मैं एक आईफोन 4 & एक चौथा जीन आइपॉड टच का उपयोग कर रहा हूं। उन लोगों के लिए जिन्होंने स्थानीय मल्टीप्लेयर का सफलतापूर्वक परीक्षण किया है, आप किस परीक्षण सेटअप & पद्धति का उपयोग करते थे?

+0

हम्म। कोई जवाब नहीं। मेरे पास एक ही समस्या है। – bobmoff

+0

मैंने इस बारे में ऐप्पल तकनीकी सहायता से पूछा है, .. उम्मीद है कि वे जवाब जानते हैं। – bobmoff

उत्तर

1

आप इस क्रम में इन बातों को क्या करने की जरूरत:

  1. स्थानीय खिलाड़ी के लिए प्रमाणीकृत
  2. एक हैंडलर पास के खिलाड़ियों

प्रमाणीकरण की आवश्यकता है के लिए

  • प्रारंभ ब्राउज़िंग को आमंत्रित स्थापित करें - यह गेम एप के साथ अपने ऐप को पंजीकृत करता है और प्लेयर को लॉग इन करता है। ज्यादातर मामलों में, आपको ऐसा करने के लिए इंटरनेट एक्सेस की भी आवश्यकता नहीं होगी।

    आमंत्रण हैंडलर स्थापित करना भी आवश्यक है, और मुझे लगता है कि यह वह चरण है जिसे आप याद कर रहे हैं। यह आपके ऐप को यह जानने देता है कि इनबाउंड आमंत्रण कब प्राप्त होता है। यदि आप ऐसा नहीं करते हैं, तो डिवाइस पास के रूप में पंजीकृत नहीं होगा।

    उपर्युक्त दो करने के बाद ही ब्राउज़ करना प्रारंभ करें।

    यहां जाने के लिए कुछ नमूना कोड यहां दिए गए हैं। एप्लिकेशन लॉन्च होने के बाद इस विधि कॉल करें:

    - (void) authenticateLocalPlayer 
    { 
    
        static BOOL gcAuthenticationCalled = NO; 
        if (!gcAuthenticationCalled) { 
         GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
    
         void (^authenticationHandler)(UIViewController*, NSError*) = ^(UIViewController *viewController, NSError *error) { 
          NSLog(@"Authenticating with Game Center."); 
          GKLocalPlayer *myLocalPlayer = [GKLocalPlayer localPlayer]; 
          if (viewController != nil) 
          { 
           NSLog(@"Not authenticated - storing view controller."); 
           self.authenticationController = viewController; 
          } 
          else if ([myLocalPlayer isAuthenticated]) 
          { 
           NSLog(@"Player is authenticated!"); 
    
           //iOS8 - register as a listener 
           [localPlayer unregisterAllListeners]; 
           [localPlayer registerListener:self]; 
    
           [[GKLocalPlayer localPlayer] loadFriendPlayersWithCompletionHandler:^(NSArray *friendPlayers, NSError *error) { 
    
            //Do something with the friends 
    
           }]; 
    
           //iOS7 - install an invitation handler 
           [GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite) { 
            // Insert game-specific code here to clean up any game in progress. 
            if (acceptedInvite) 
            { 
             //This player accepted an invitation. 
             //If doing programmatic matchmaking, call GKMatchmaker's matchForInvite:completionHandler 
             //to get a match for the invite. Otherwise you need to allocate a GKMatchmakerViewController 
             //instance and present it with the invite. 
    
            } 
            else if (playersToInvite) 
            { 
             //Your game was launched from the GameCenter app to host a match. 
            } 
           }; 
    
           //Now you can browse. Note this is the iOS8 call. The iOS7 call is slightly different. 
           [[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithHandler:^(GKPlayer *player, BOOL reachable) { 
    
            NSLog(@"Player Nearby: %@", player.playerID); 
    
           }]; 
    
    
    
          } 
          else 
          { 
           //Authentication failed. 
           self.authenticationController = nil; 
           if (error) { 
            NSLog([error description], nil); 
           } 
          } 
    
    
         }; 
    
         localPlayer.authenticateHandler = authenticationHandler; 
         gcAuthenticationCalled = YES; 
        } 
    } 
    

    * महत्वपूर्ण निमंत्रण हैंडलर * आप iOS8 का उपयोग कर रहे हैं, तो आप स्थापित नहीं करते। आप के बजाय प्रोटोकॉल GKLocalPlayerListener के लिए सुन के रूप में एक वस्तु रजिस्टर, और इन तरीकों को लागू:

    -player:didAcceptInvite: 
    -player:didRequestMatchWithRecipients: 
    

    आप iOS8 पर इन तरीकों को लागू नहीं करते हैं, यह काम नहीं करेगा!

    फिर आप स्थानीय खिलाड़ी के सत्यापन के बाद इस फोन करके उस वस्तु को GKMatchmaker लिंक:

    [localPlayer registerListener:self]; 
    

    यकीन उद्देश्य यह है कि प्रोटोकॉल को लागू किया गया है ताकि में की तरह घोषित किया गया है।ज फ़ाइल:

    @interface MyImplementingObject : NSObject <GKMatchDelegate, GKLocalPlayerListener> 
    

    आप यह सब करते हैं और यह अभी भी काम नहीं कर रहा है, तो सुनिश्चित करें कि आपके बंडल आईडी अपने अनुप्रयोग में ठीक से सेट है कि आप कर (, ऐप पर क्लिक करें क्लिक करें 'लक्ष्य', सुनिश्चित करें कि बंडल पहचानकर्ता और संस्करण भर चुके हैं), फिर 'क्षमताओं' टैब (एक्सकोड 6) पर क्लिक करें, और सुनिश्चित करें कि गेम सेंटर चालू है।

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

    सुनिश्चित करें कि GameCenter के तहत आपकी सेटिंग्स में सैंडबॉक्स स्विच चालू है, और यह भी सुनिश्चित करें कि 'आमंत्रणों को अनुमति दें' और 'आस-पास के खिलाड़ी' स्विच चालू हैं।

    अंत में, सुनिश्चित करें कि आप आईट्यून्स कनेक्ट पर जाएं और सत्यापित करें कि आपके ऐप के लिए गेम सेंटर भी सक्षम है।

  • +0

    गेम सेंटर के लिए नए लोगों के लिए, आप गिटहब पर अपना नमूना गेम सेंटर ऐप भी देख सकते हैं - यह एक वेनिला ऐप है जो गेम सेंटर को प्रमाणित करता है, पास के खिलाड़ियों से जुड़ता है और वॉयस चैट शुरू करता है। आईओएस 8 में वॉयस चैट के साथ कुछ मौजूदा बग हैं, और यह ऐप उन मुद्दों को प्रदर्शित करने के लिए बनाया गया था - https://www.github.com/sbudhram/GameCenterDemo –

    2

    1) क्या मैं सोच रहा हूं कि मैं स्टार्टब्रोइंगफोरनियरबी प्लेयर्स के साथ कॉल कर सकता हूं, स्थानीय खिलाड़ी को प्रमाणित करने से पहले?

    सं startBrowsingForNearbyPlayersWithReachableHandler दोनों अन्य खिलाड़ियों लेकिन, सबसे महत्वपूर्ण बात के लिए मौजूदा खिलाड़ी और ब्राउज़िंग का विज्ञापन देकर काम करता है, जानकारी खिलाड़ियों की पहचान करने का उपयोग करता है playerID ... जो उपलब्ध है जब तक खिलाड़ी प्रमाणित करता है नहीं होगा।

    3) वेब पर विवादित रिपोर्ट प्रतीत होती है कि गेमकिट-सक्षम ऐप्स को आईओएस सिम्युलेटर में परीक्षण किया जा सकता है या नहीं। आम सहमति नहीं है, और आईओएस हार्डवेयर

    गेम सेंटर प्रमाणीकरण, उपलब्धियां, और लीडरबोर्ड सिम्युलेटर में काम करना बेहतर है, बाकी सब कुछ वास्तविक हार्डवेयर पर परीक्षण किया जाना चाहिए। मैं वास्तव में प्रमाणीकरण परीक्षण के लिए सिम्युलेटर की अनुशंसा करता हूं, क्योंकि यह सैंडबॉक्स/उत्पादन स्विच से बचाता है जो कुछ हद तक भ्रमित उपकरणों पर विस्तृत लेख परीक्षण कर सकता है। बाकी सब कुछ केवल उपकरणों पर परीक्षण किया जा सकता है। सिम्युलेटर को पुश नोटिफिकेशन प्राप्त करने के लिए बहुत अच्छा समर्थन नहीं है जो मैच सेटअप को तोड़ता है और सामान्य हार्डवेयर कॉन्फ़िगरेशन इतना अलग है कि मिलान संचार वैसे भी काम करने की संभावना नहीं है।

    1

    तो, आईओएस 7 और आईओएस 8 के बीच मतभेदों को ध्यान में रखें। यह कोड किसी भी संस्करण पर काम करेगा और बदले में 'updateNearbyPlayer' को कॉल करेगा।

    if (IS_IOS8) 
    { 
        [[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithHandler:^(GKPlayer *gkPlayer, BOOL reachable) 
        { 
         NSLog(@"PLAYER ID %@ is %@",gkPlayer.playerID,[email protected]"reachable" : @"not reachable"); 
         [self updateNearbyPlayer:gkPlayer reachable:reachable]; 
        }]; 
    
    } else { 
        /* 
        * iOS 7... 
        */ 
        [[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:^(NSString *playerID, BOOL reachable) 
        { 
         NSLog(@"PLAYER ID %@ is %@",playerID,[email protected]"reachable" : @"not reachable"); 
    
         [GKPlayer loadPlayersForIdentifiers:@[playerID] withCompletionHandler:^(NSArray *players, NSError *error) { 
          NSLog(@"Loaded: %@, error= %@",players,error); 
          GKPlayer *gkPlayer = [players objectAtIndex:0]; 
          [self updateNearbyPlayer:gkPlayer reachable:reachable]; 
         }]; 
        }]; 
    } 
    

    अंतर्निहित बोनजोर सेवाओं के कारण कुछ देरी के साथ, यह तंत्र बहुत अच्छा काम करता है। हालांकि, यह करने के लिए एक उचित कॉल के साथ संतुलित किया जाना चाहिए:

    [[GKMatchmaker sharedMatchmaker] stopBrowsingForNearbyPlayers]; 
    

    जब भी आप एक मैच की स्थापना के लिए या एक मौजूदा मैच में जोड़ने के लिए सूचना दी GKPlayers/PlayerIDs में से एक का उपयोग करें, आप ब्राउज़िंग बंद कर देना चाहिए। एक बार मैच समाप्त हो जाने के बाद, बंद या रद्द हो गया, फिर ब्राउज़ करना शुरू करें। अन्यथा, आस-पास के डिवाइस से कनेक्ट करने के दूसरे प्रयास पर, आप असफल हो जाएंगे।

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