2010-10-07 5 views
13

Je n'arrive pas à comprendre comment cela fonctionne. Ce que j'essaie de faire est de laisser deux joueurs jouer à un jeu si un troisième joueur le rejoint peut rejoindre instantanément le jeu, si le quatrième et dernier joueur le rejoint peut également rejoindre instantanément le jeu. Ils peuvent également quitter le jeu à tout moment pour une raison quelconque, si cela se produit, il devrait y avoir un espace ouvert pour une autre personne ou pour la même personne à se reconnecter. C'est l'idée.Game Center Trouver une correspondance par programme

Maintenant ce que j'ai obtenu est le suivant. J'authentifie le joueur local pour des raisons évidentes. Ensuite, je recherche un match comme si:

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; 
    } 
}]; 

Si j'exécute cette partie sur trois appareils différents, deux d'entre eux trouveront entre eux et le troisième est toujours à la recherche. Donc je me suis dit après que le match trouvé pour la requête a trouvé le nombre minimum de joueurs qu'il sera exécuté une fois. Donc ce dont j'avais besoin était une méthode qui utilisait le matchCurrent que j'ai retenu pour ajouter plus de joueurs. Heureusement, cette méthode existait, mais comment cela fonctionnerait-il? Quand appelez-vous dans ce cas? J'ai décidé de le mettre sous un bouton afin que je puisse l'exécuter manuellement quand un match a été trouvé. Ce que j'ai découvert, c'est que lorsque je l'ai pressé sur le premier périphérique, le troisième périphérique a finalement trouvé la correspondance du premier et du deuxième périphérique. En fait, le deuxième et le troisième périphérique contenaient les ID de tous les périphériques impliqués. Ce qui est une bonne chose. Mais il y a deux problèmes.

  1. Quel périphérique doit réellement appeler la méthode addPlayersToMatch? Et comment pouvez-vous limiter à un périphérique exécutant cette méthode? Plus quand devriez-vous l'appeler?
  2. Pourquoi, sur le périphérique qui appelle cette méthode, les ID du lecteur ne sont-ils pas mis à jour?

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

    En fait, ils sont mis à jour. Quand je vois les ID de joueur apparaître sur les deuxième et troisième dispositifs je mets à jour manuellement les matchCurrent.playerIDs sur l'appareil un et soudainement il reconnaît le joueur. Cependant même le 'didChangeState' pour le joueur n'est pas appelé quand le nouveau joueur est découvert sur le premier appareil.

+0

Est-ce basé sur un modèle client-serveur ou un modèle p2p? Qu'est-ce qui est utilisé pour initialiser une connexion, tcp, udp, http? Où sont stockées les données pour les lecteurs actuellement connectés? –

+3

"Ce que j'essaie de faire est de laisser deux joueurs jouer à un jeu si un troisième joueur se joint" - Pouvez-vous ajouter des points-virgules et des virgules dans vos 2ème et 3ème phrases? En l'état, dans les phrases d'exécution, il est difficile de dire si chaque clause if modifie une clause indépendante précédente ou suivante. – LarsH

Répondre

0

Je suggère que vous périodiquement (peut-être une fois par seconde ou deux) scrutin pour le statut des autres joueurs, de sorte que vous pouvez détecter si quelqu'un a rejoint, ou à gauche pour une raison quelconque. Sauf si l'architecture iphone que vous utilisez déjà fournit une fonction qui gère cet événement.

Il semble que vous souhaitiez trouver plus de documentation et/ou un exemple de code pour le framework multi-joueurs que vous utilisez.

1

Quel périphérique doit réellement appeler la méthode addPlayersToMatch? Et comment pouvez-vous limiter à un périphérique l'exécution de cette méthode?

Vous pourriez résoudre ce problème en ayant les dispositifs "draw pailles". Chaque appareil génère un nombre aléatoire, puis l'envoie aux autres. L'appareil avec le plus grand nombre est le leader, et c'est celui qui doit appeler addPlayersToMatch. Si deux appareils choisissent le même numéro, jetez les numéros et recommencez.

2

Votre utilisation de la classe Apple iOS Game Center GKMatchmaker. Je suppose que vous utilisez une connexion peer to peer, non hébergée.

La classe GKMatch vous donne le tableau playerIDs.

@property(nonatomic, readonly) NSArray *playerIDs 

Ceci est une liste ordonnée, vous pourriez être en mesure de l'utiliser pour sélectionner la première addPlayersToMatch d'appel de joueur.

Ci-dessous se trouve une documentation.

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

Questions connexes