> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Démarrage rapide Cocos2D-x

> Configurez un projet Cocos2d-x dans Visual Studio sous Windows et effectuez votre premier appel d'API PlayFab à l'aide de la bibliothèque client PlayFab Cocos2d-x.

Ce démarrage rapide vous aide à effectuer votre premier appel d'API PlayFab dans le moteur Cocos2d-x.

Avant de pouvoir appeler une API PlayFab, vous devez disposer d'un [compte de développeur PlayFab](https://developer.playfab.com).

## Configuration du projet Cocos2d-x

Système d'exploitation : ce guide est rédigé pour Windows 10, avec Visual Studio 2015. Cocos fonctionne sur la plupart des systèmes d'exploitation et environnements modernes. Les instructions d'installation sont similaires, mais diffèrent selon chaque combinaison.

Si vous générez pour d'autres plateformes, les fichiers nécessaires sont les mêmes, mais vous devrez configurer vous-même le projet. Les étapes sont identiques avec Visual Studio 2013, mais les captures d'écran fournies ici seront légèrement différentes des vôtres.

1. Téléchargez et installez Cocos2d-x
   * [https://www.cocos2d-x.org/download](https://www.cocos2d-x.org/download)
   * La configuration de Cocos2d-x nécessite une certaine familiarité. Consultez leur site de documentation :
     * [https://docs.cocos2d-x.org/cocos2d-x/en/en/](https://docs.cocos2d-x.org/cocos2d-x/v3/en/)
     * Notez les [prérequis de Cocos](https://docs.cocos2d-x.org/cocos2d-x/v3/en/installation/prerequisites.html)
     * Visual Studio 2013 ou 2015 est également requis.

2. Une fois Cocos2d-x configuré, créez un projet à l'aide de la CLI Cocos :
   * Accédez à l'emplacement où vous souhaitez stocker votre projet Cocos

   * Ouvrez une fenêtre de commande dans votre dossier parent (la CLI Cocos créera le répertoire du projet proprement dit)
     * Maintenez la touche **Maj** enfoncée et cliquez avec le bouton droit dans l'espace blanc vide de la fenêtre de l'Explorateur.

       <img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/cocos2d-x/cmd-exe2.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=2aaffd549547102d237a6f33a56e7187" alt="CLI Cocos - Ouvrir une fenêtre de commande" width="615" height="453" data-path="images/playfab/sdks/cocos2d-x/cmd-exe2.png" />

   * Dans la nouvelle fenêtre de console, entrez cette commande :
     * `cocos new CocosGettingStarted -l cpp`
       * Assurez-vous que votre sous-répertoire cible (**CocosGettingStarted**) n'existe pas déjà : cette commande échoue si le dossier existe déjà.
       * Si vous recevez le message "'cocos' isn't recognized as an internal or external command", c'est que vous n'avez pas configuré correctement l'installation de cocos (reportez-vous au guide d'installation de Cocos pour Windows).
       * En cas de réussite, un nouveau dossier **CocosGettingStarted** est créé. Ce guide désignera cet emplacement par `{CocosGettingStarted}`.

   * La sortie en cas de réussite devrait ressembler à l'exemple ci-dessous.

```output theme={null}
> Copy template into C:\dev\CocosGettingStarted
> Copying Cocos2d-x files...
> Rename project name from 'HelloCpp' to 'CocosGettingStarted'
> Replace the project name from 'HelloCpp' to 'CocosGettingStarted'
> Replace the project package name from 'org.cocos2dx.hellocpp' to 'org.cocos2dx.CocosGettingStarted'
> Replace the Mac bundle id from 'org.cocos2dx.hellocpp' to 'org.cocos2dx.CocosGettingStarted'
> Replace the iOS bundle id from 'org.cocos2dx.hellocpp' to 'org.cocos2dx.CocosGettingStarted'
```

3. Téléchargez le SDK PlayFab Cocos2d-xSdk : [SDK Cocos2D-x (C++)](https://aka.ms/playfabCsharpsdkdownload). Enregistrez-le et extrayez-le dans un emplacement temporaire \{PlayFabCocos}
   * Ouvrez le dossier suivant dans l'Explorateur Windows : \{PlayFabCocos}/PlayFabClientSDK
   * Ouvrez le dossier suivant dans une deuxième fenêtre de l'Explorateur Windows : \{CocosGettingStarted}/Classes

4. Copiez-collez tous les fichiers de \{PlayFabCocos}/PlayFabClientSDK vers \{CocosGettingStarted}/Classes

5. Dans Visual Studio, chargez `{CocosGettingStarted}/proj.win32/CocosGettingStarted.sln`.

6. Nous voulons ajouter les fichiers PlayFab au projet Cocos.

7. Dans le panneau Explorateur de solutions de Visual Studio, développez l'arborescence jusqu'au dossier : Solution/CocosGettingStarted/src

8. Ouvrez une fenêtre de l'Explorateur Windows sur \{CocosGettingStarted}/Classes

   * Sélectionnez tous les fichiers de \{CocosGettingStarted}/Classes, SAUF AppDelegate.h, AppDelegate.cpp, HelloWorldScene.h et HelloWorldScene.cpp

   * Faites glisser tous ces fichiers depuis l'Explorateur et déposez-les dans le dossier Solution/CocosGettingStarted/src de Visual Studio identifié ci-dessus. En cas de problème, vous pouvez faire glisser et déposer chaque fichier un par un, *en veillant bien à tous les ajouter*.

   * Vous devriez voir ces fichiers dans votre projet VS :

     <img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/cocos2d-x/sln-src.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=7e227ca9d1a183f183db018209757770" alt="Explorateur de solutions - Fichiers du projet VS" width="317" height="580" data-path="images/playfab/sdks/cocos2d-x/sln-src.png" />

PlayFab utilise plusieurs bibliothèques Cocos qui doivent être ajoutées manuellement à la liste des dépendances.

* Ouvrez la fenêtre **Properties** de votre projet CocosGettingStarted (comme illustré ci-dessous).

  <img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/cocos2d-x/cocos-include.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=69b2d7b8a07f433dfbad2c945b48ed93" alt="Fenêtre Properties - Répertoires include de Cocos" width="1359" height="1070" data-path="images/playfab/sdks/cocos2d-x/cocos-include.png" />

* Remplacez Additional Include Directories par ceci :

  `$(ProjectDir)..\cocos2d\external\zlib\include;$(ProjectDir)..\cocos2d\external\curl\include\win32;$(EngineRoot)cocos\audio\include;$(EngineRoot)external;$(EngineRoot)external\chipmunk\include\chipmunk;$(EngineRoot)extensions;..\Classes;..;%(AdditionalIncludeDirectories);$(_COCOS_HEADER_WIN32_BEGIN);$(_COCOS_HEADER_WIN32_END);..\cocos2d`

<Note>
  Nous ajoutons curl et zlib, des bibliothèques fournies avec Cocos mais qui ne sont pas activées par défaut.
</Note>

Votre projet CocosGettingStarted devrait maintenant se compiler (et même s'exécuter), mais il n'effectue encore aucun appel d'API PlayFab.

Installation terminée !

## Configurer votre premier appel d'API

Ce guide présente les étapes minimales nécessaires pour effectuer votre premier appel d'API PlayFab. La confirmation est visible dans l'application.

1. Dans Visual Studio, dans le dossier Solution/CocosGettingStarted/src, ouvrez HelloWorldScene.h et remplacez son contenu par ceci :
   * Dans Visual Studio, dans le dossier **Solution/CocosGettingStarted/src**, ouvrez `HelloWorldScene.h` et remplacez son contenu par celui présenté ci-dessous.

```cpp theme={null}
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"
#include "PlayFabClientDataModels.h"
#include "PlayFabError.h"

class HelloWorld : public cocos2d::Layer
{
public:
    static std::string statusMsg;
    static cocos2d::Scene* createScene();
    static cocos2d::Label* testReportLabel;
    virtual bool init();
    void update(float) override;
    void menuCloseCallback(cocos2d::Ref* pSender);
    CREATE_FUNC(HelloWorld);

    static void HelloWorld::OnLoginSuccess(const PlayFab::ClientModels::LoginResult& result, void* customData);
    static void HelloWorld::OnLoginFail(const PlayFab::PlayFabError& error, void* customData);
};

#endif // __HELLOWORLD_SCENE_H__
```

2. Juste à côté, ouvrez `HelloWorldScene.cpp` et remplacez son contenu par ceci :

```cpp theme={null}
#include "HelloWorldScene.h"
#include "PlayFabClientAPI.h"
#include <PlayFabSettings.h>

USING_NS_CC;

std::string HelloWorld::statusMsg;
cocos2d::Label* HelloWorld::testReportLabel;

Scene* HelloWorld::createScene()
{
    auto scene = Scene::create(); // 'scene' is an autorelease object
    auto layer = HelloWorld::create(); // 'layer' is an autorelease object
    scene->addChild(layer); // add layer as a child to scene
    return scene; // return the scene
}

bool HelloWorld::init()
{
    if (!Layer::init())
        return false;

    Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    auto closeItem = MenuItemImage::create("CloseNormal.png", "CloseSelected.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
    closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width / 2, origin.y + closeItem->getContentSize().height / 2));

    auto menu = Menu::create(closeItem, NULL);
    menu->setPosition(Vec2::ZERO);
    this->addChild(menu, 1);
    this->scheduleUpdate();

    testReportLabel = Label::createWithTTF("", "fonts/Marker Felt.ttf", 14);
    this->addChild(testReportLabel, 1);

    statusMsg = "Login pending...";
    PlayFab::PlayFabSettings::titleId = "144";
    PlayFab::ClientModels::LoginWithCustomIDRequest request;
    request.CustomId = "GettingStartedGuide";
    request.CreateAccount = true;
    PlayFab::PlayFabClientAPI::LoginWithCustomID(request, OnLoginSuccess, OnLoginFail, nullptr);

    return true;
}

void HelloWorld::menuCloseCallback(Ref* pSender)
{
    Director::getInstance()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endif
}

void HelloWorld::update(float delta)
{
    Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    testReportLabel->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2));
    testReportLabel->setString(statusMsg);
}

void HelloWorld::OnLoginSuccess(const PlayFab::ClientModels::LoginResult& result, void* customData)
{
    statusMsg = "Congratulations, you made your first successful API call!";
}

void HelloWorld::OnLoginFail(const PlayFab::PlayFabError& error, void* customData)
{
    statusMsg = "Something went wrong with your first API call.\n";
    statusMsg += "Here's some debug information:\n";
    statusMsg += error.GenerateErrorReport();
}
```

Ces fichiers reprennent la HelloWorldScene existante, qui fait partie du modèle de nouveau projet Cocos, et la modifient pour inclure votre premier appel d'API PlayFab.

## Terminer et exécuter

1. Générez et exécutez votre projet Cocos : Dropdowns -> Debug -> Start Debugging.

2. Vous êtes invité à générer le projet. Sélectionnez **Yes**.

3. Vous devriez voir un écran indiquant :

   **Congratulations, you made your first successful API call!**

4. Vous pouvez maintenant commencer à effectuer d'autres appels d'API et à créer votre jeu.\
   Pour obtenir la liste de tous les appels d'API client disponibles, consultez notre documentation [Références de l'API PlayFab](/fr/services/playfab/api-references).

Bon développement !

## Analyse du code

Cette dernière section facultative décrit en détail chaque partie du code source ci-dessus.

* `HelloWorldScene.h`
  * Ce fichier n'est que très légèrement modifié par rapport au `HelloWorldScene.h` par défaut généré par Cocos.
  * Plus précisément, il définit certains éléments de l'interface graphique Cocos que nous utilisons, ainsi que les prototypes de `OnLoginSuccess` et `OnLoginFail`.
  * Tout le reste correspond aux fonctions standard du moteur Cocos.

* `HelloWorldScene.cpp`
  * `createScene()` est une fonction standard du moteur Cocos.

  * `init()`
    * Éléments habituels de l'interface graphique Cocos : `closeItem` et `testReportLabel`.

    * `PlayFab::PlayFabSettings::titleId = "xxxx";`
      * Chaque développeur PlayFab crée un titre dans Game Manager. Lorsque vous publiez votre jeu, vous devez coder ce titleId dans votre jeu. Cela permet au client de savoir comment accéder aux bonnes données dans PlayFab. Pour la plupart des utilisateurs, il suffit de considérer cette étape comme obligatoire pour que PlayFab fonctionne.

    * `PlayFab::ClientModels::LoginWithCustomIDRequest request;`
      * La plupart des méthodes d'API PlayFab nécessitent des paramètres d'entrée, qui sont regroupés dans un objet de requête.
      * Chaque méthode d'API nécessite un objet de requête unique, avec un ensemble de paramètres facultatifs et obligatoires.
        * Pour `LoginWithCustomIDRequest`, il existe un paramètre obligatoire `CustomId`, qui identifie de manière unique un joueur, et `CreateAccount`, qui permet de créer un nouveau compte avec cet appel.
      * Pour la connexion, la plupart des développeurs voudront utiliser une méthode de connexion plus appropriée.
        * Consultez la documentation sur la connexion PlayFab pour obtenir la liste de toutes les méthodes de connexion et de leurs paramètres d'entrée. Les choix courants sont :
          * `LoginWithAndroidDeviceID`
          * `LoginWithIOSDeviceID`
          * `LoginWithEmailAddress`

    * `PlayFab::PlayFabClientAPI::LoginWithCustomID(request, OnLoginSuccess, OnLoginFail, nullptr);`
      * Cette ligne lance la requête asynchrone vers `LoginWithCustomID` et appelle la fonction `OnLoginSuccess` ou `OnLoginFail` une fois terminée.

  * `update(float delta)`
    * Le simple fait de définir la variable `statusMsg` ne met pas à jour le texte affiché à l'écran.
    * Cette fonction met à jour le texte de l'interface graphique pour qu'il corresponde au contenu de `statusMsg` à chaque tick (ce qui n'est pas très efficace).

  * `OnLoginSuccess(result, customData)`
    * Lorsque le rappel de réussite est appelé, l'objet de résultat de nombreux rappels d'API contient les informations demandées.
    * `LoginResult` contient quelques informations de base sur le joueur, mais pour la plupart des utilisateurs, la connexion n'est qu'une étape obligatoire avant d'appeler d'autres API.

  * `OnLoginFail(error, customData)`
    * Si la fonction d'erreur est appelée, votre appel d'API a échoué.
    * Les appels d'API peuvent échouer pour de nombreuses raisons, et vous devez toujours essayer de gérer les échecs.
    * Raisons de l'échec des appels d'API (par ordre de probabilité)
      * `PlayFabSettings.TitleId` n'est pas défini. Si vous oubliez de définir titleId sur votre titre, rien ne fonctionnera.
        * Dans Cocos, la bibliothèque curl fera probablement planter votre jeu si vous ne définissez pas correctement titleId.
      * Paramètres de la requête. Si vous n'avez pas fourni les informations correctes ou requises pour un appel d'API particulier, celui-ci échouera. Pour plus d'informations, consultez `error.errorMessage`, `error.errorDetails` ou `error.GenerateErrorReport()`.
      * Problème de connectivité de l'appareil. Les téléphones mobiles perdent et retrouvent constamment la connectivité : tout appel d'API peut donc échouer de manière aléatoire à tout moment, puis fonctionner immédiatement après. Entrer dans un tunnel peut vous déconnecter complètement.
      * Problème du serveur PlayFab. Comme pour tout logiciel, des problèmes peuvent survenir. Consultez nos notes de publication pour connaître les mises à jour.
      * Internet n'est pas fiable à 100 %. Il arrive que le message soit corrompu ou n'atteigne pas le serveur PlayFab.
    * Si vous avez des difficultés à déboguer un problème et que les informations du rappel d'erreur ne suffisent pas, rendez-vous sur nos forums.

  * customData est un pointeur void, qui peut être utilisé de n'importe quelle manière pour établir un contexte.
    * En C++, il est plus difficile de conserver le contexte d'un appel d'API ; nous avons donc ajouté le paramètre `customData`, qui permet de relayer n'importe quel objet vers le rappel et que vous pouvez utiliser comme bon vous semble pour établir un contexte.
    * Ainsi, si vous effectuez des appels d'API pour récupérer l'inventaire, vous pouvez transmettre un pointeur de joueur ou d'inventaire en tant que `customData`, puis mettre à jour l'inventaire de cet objet dans le rappel.


## Related topics

- [Moteurs de jeu pris en charge par PlayFab](/fr/services/playfab/sdks/game-engines/index.md)
- [SDK Cocos2D-x (C++)](/fr/services/playfab/sdks/cocos2d-x/index.md)
- [Licences du SDK Cocos2d-x](/fr/services/playfab/sdks/cocos2d-x/license.md)
- [Notes de publication PlayFab 2015](/fr/services/playfab/release-notes/2015.md)
- [Notes de publication PlayFab 2016](/fr/services/playfab/release-notes/2016.md)
