4 votes

Code d'accomplissement robuste du Game Center

Dans à peu près tous les exemples de soumission de réalisations au Game Center, je vois ce code

[achievement reportAchievementWithCompletionHandler:^(NSError *error)
{
    if (error != nil)
    {
         // Retain the achievement object and try again later (not shown).
    }
}];

Le problème, c'est que ce petit commentaire représente environ 99% du travail. J'ai passé les dernières heures à essayer de résoudre ce problème et il semble qu'il s'agisse d'un ensemble sans fin de cas limites d'envoi et de renvoi et de sauvegarde et de chargement de données.

Quelqu'un connaît-il un bon tutoriel (ou un exemple de code) sur ce sujet qui explique réellement la partie difficile ?

Ce n'est pas aussi simple que de les enregistrer dans un fichier et de les charger plus tard. Vous rencontrez des difficultés lorsque vous commencez à devoir conserver plusieurs réalisations et les soumettre plus tard, puis qu'elles reviennent toutes échouées (en bloc !) et que vous devez les sauvegarder à nouveau... rapidement/sûrement... parce que l'application pourrait quitter et que vous ne voulez pas les perdre.

Je m'arrache les cheveux.

6voto

M Katz Points 2010

Je ne pense pas que vous ayez besoin de vous arracher les cheveux.

Je pense que le modèle de base est le suivant :

(a) Indépendamment du Game Center, votre jeu dispose d'un état sauvegardé (dont vous avez toujours besoin de toute façon, pour remettre le joueur à l'endroit où il se trouvait lorsque votre jeu est quitté ou mis en arrière-plan). Cet état doit contenir tous les éléments normaux dont vous avez besoin pour restaurer l'état de votre jeu, ainsi que des drapeaux pour tous les succès de votre jeu.

(b) Le Game Center stocke également toutes les réalisations de votre jeu. Lorsque vous vous connectez au Game Center, vous téléchargez les succès du joueur connecté. (Des complications surviennent quant à qui le joueur connecté l'est, mais votre question ne porte pas sur ce point, alors supposons que le "seul vrai joueur" est toujours le joueur connecté au Game Center).

(c) Chaque fois que le joueur réalise un exploit, mettez d'abord à jour l'indicateur d'exploit approprié dans les données d'état sauvegardées de votre jeu. Ensuite, essayez d'informer le Game Center de cette réussite. Si cela fonctionne, mettez à jour votre copie des réalisations du Game Center avec les nouvelles données.

(d) Si cela ne fonctionne pas, vous avez une réalisation marquée dans votre état persistant qui n'est pas marquée dans votre copie de l'état du Game Center. À différents moments opportuns (par exemple, lorsqu'une autre réalisation est obtenue, lorsque vous terminez un niveau, lorsque votre application démarre, lorsque vous quittez l'application, etc.), vérifiez s'il existe des divergences entre ce qui se trouve dans votre propre état et ce qui se trouve dans l'état du Game Center. Une divergence est une mise à jour que vous devez renvoyer au Game Center. Essayez de l'envoyer, mais si cela échoue à nouveau, attendez la prochaine occasion (par exemple, lorsqu'un autre succès est obtenu, lorsque vous terminez un niveau, lorsque votre application démarre, lorsque vous quittez l'application, etc. Vous ne perdrez jamais ces données car elles se trouvent dans votre image locale et réelle de l'état de l'utilisateur. (Le seul moyen de les perdre est que l'utilisateur désinstalle votre application avant que vous n'ayez réussi à la faire entrer dans le Game Center, mais alors, que pouvez-vous faire).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X