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.
- 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?
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.
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? –
"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