> ## 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.

# Início rápido do Cocos2D-x

> Configure um projeto Cocos2d-x no Visual Studio no Windows e faça sua primeira chamada à API do PlayFab usando a biblioteca de cliente do PlayFab para Cocos2d-x.

Este início rápido ajuda você a fazer sua primeira chamada à API do PlayFab no motor Cocos2d-x.

Antes de chamar qualquer API do PlayFab, você precisa ter uma [conta de desenvolvedor do PlayFab](https://developer.playfab.com).

## Configuração do projeto Cocos2d-x

Sistema operacional: este guia foi escrito para o Windows 10, usando o Visual Studio 2015. O Cocos funciona na maioria dos sistemas operacionais e ambientes modernos. As instruções de instalação são semelhantes, mas diferem para cada combinação.

Se você estiver compilando para outras plataformas, os arquivos necessários são os mesmos, mas você precisará fazer a configuração do projeto por conta própria. O Visual Studio 2013 tem etapas idênticas, mas as capturas de tela fornecidas aqui serão um pouco diferentes das suas.

1. Baixe e instale o Cocos2d-x
   * [https://www.cocos2d-x.org/download](https://www.cocos2d-x.org/download)
   * Configurar o Cocos2d-x exige alguma familiaridade. Confira o site de documentação deles:
     * [https://docs.cocos2d-x.org/cocos2d-x/en/en/](https://docs.cocos2d-x.org/cocos2d-x/v3/en/)
     * Observe os [pré-requisitos do Cocos](https://docs.cocos2d-x.org/cocos2d-x/v3/en/installation/prerequisites.html)
     * O Visual Studio 2013 ou 2015 também é necessário.

2. Depois de configurar o Cocos2d-x, crie um projeto usando a CLI do Cocos:
   * Navegue até o local onde você deseja armazenar seu projeto Cocos

   * Abra uma janela de comando na pasta pai (a CLI do Cocos criará o diretório do projeto propriamente dito)
     * Mantenha a tecla **Shift** pressionada e clique com o botão direito no espaço em branco da janela do Explorer.

       <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 do Cocos - Abrir uma janela de comando" width="615" height="453" data-path="images/playfab/sdks/cocos2d-x/cmd-exe2.png" />

   * Na nova janela de console, insira este comando:
     * `cocos new CocosGettingStarted -l cpp`
       * Verifique se o subdiretório de destino (**CocosGettingStarted**) ainda não existe; este comando falhará se a pasta já existir.
       * Se você receber a mensagem "'cocos' isn't recognized as an internal or external command", a instalação do cocos não foi configurada corretamente (volte ao guia de instalação do Cocos para Windows).
       * Em caso de sucesso, haverá uma nova pasta **CocosGettingStarted**. Este guia se referirá a esse local de diretório como `{CocosGettingStarted}`.

   * Uma saída bem-sucedida deve ser semelhante ao exemplo abaixo.

```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. Baixe o PlayFab Cocos2d-xSdk: [SDK de Cocos2D-x (C++)](https://aka.ms/playfabCsharpsdkdownload). Salve e extraia-o em um local temporário \{PlayFabCocos}
   * Abra a seguinte pasta no Windows Explorer: \{PlayFabCocos}/PlayFabClientSDK
   * Abra a seguinte pasta em uma segunda janela do Windows Explorer: \{CocosGettingStarted}/Classes

4. Copie e cole todos os arquivos de \{PlayFabCocos}/PlayFabClientSDK para \{CocosGettingStarted}/Classes

5. No Visual Studio, carregue `{CocosGettingStarted}/proj.win32/CocosGettingStarted.sln`.

6. Queremos adicionar os arquivos do PlayFab ao projeto Cocos.

7. No Visual Studio, no painel Solution Explorer, expanda até a pasta: Solution/CocosGettingStarted/src

8. Abra uma janela do Windows Explorer em \{CocosGettingStarted}/Classes

   * Selecione todos os arquivos em \{CocosGettingStarted}/Classes, EXCETO AppDelegate.h, AppDelegate.cpp, HelloWorldScene.h e HelloWorldScene.cpp

   * Arraste e solte todos esses arquivos do Explorer na pasta Solution/CocosGettingStarted/src do Visual Studio que encontramos acima. Se você tiver problemas, pode arrastar e soltar cada arquivo individualmente, *apenas tome cuidado para incluir todos eles*.

   * Você verá estes arquivos no seu projeto do 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="Solution Explorer - Arquivos do projeto do VS" width="317" height="580" data-path="images/playfab/sdks/cocos2d-x/sln-src.png" />

O PlayFab usa várias bibliotecas do Cocos que precisam ser adicionadas manualmente à lista de dependências.

* Abra a janela **Properties** do seu projeto CocosGettingStarted (conforme mostrado abaixo).

  <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="Janela Properties - Diretórios de inclusão do Cocos" width="1359" height="1070" data-path="images/playfab/sdks/cocos2d-x/cocos-include.png" />

* Substitua Additional Include Directories por isto:

  `$(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>
  Estamos adicionando curl e zlib, que são bibliotecas incluídas no Cocos, mas que não são habilitadas por padrão.
</Note>

Seu projeto CocosGettingStarted agora deve compilar (e até ser executado), mas ainda não estamos fazendo nenhuma chamada à API do PlayFab.

Instalação concluída!

## Configurar sua primeira chamada à API

Este guia fornece as etapas mínimas para você fazer sua primeira chamada à API do PlayFab. A confirmação é exibida no aplicativo.

1. No Visual Studio, dentro da pasta Solution/CocosGettingStarted/src, abra HelloWorldScene.h e substitua o conteúdo por isto:
   * No Visual Studio, dentro da pasta **Solution/CocosGettingStarted/src**, abra `HelloWorldScene.h` e substitua o conteúdo pelo mostrado abaixo.

```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. Logo ao lado, abra `HelloWorldScene.cpp` e substitua o conteúdo por isto:

```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();
}
```

Esses arquivos pegam a HelloWorldScene existente, que faz parte do modelo de novo projeto Cocos, e a modificam para incluir sua primeira chamada à API do PlayFab.

## Concluir e executar

1. Compile e execute seu projeto Cocos: Dropdowns -> Debug -> Start Debugging.

2. Será solicitado que você compile. Selecione **Yes**.

3. Você verá uma tela com a mensagem:

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

4. Agora você pode começar a fazer outras chamadas à API e a criar seu jogo.\
   Para obter uma lista de todas as chamadas disponíveis da API de cliente, consulte nossa documentação de [Referências de API do PlayFab](/pt-BR/services/playfab/api-references).

Boa programação!

## Desconstruir o código

Esta última seção opcional descreve em detalhes cada parte do código-fonte acima.

* `HelloWorldScene.h`
  * Este arquivo foi modificado apenas de forma trivial em relação ao `HelloWorldScene.h` padrão gerado pelo Cocos.
  * Especificamente, ele define parte da GUI do Cocos que estamos usando e os protótipos de `OnLoginSuccess` e `OnLoginFail`.
  * Todo o resto são funções padrão do motor Cocos.

* `HelloWorldScene.cpp`
  * `createScene()` é uma função padrão do motor Cocos.

  * `init()`
    * Elementos normais de GUI do Cocos: `closeItem` e `testReportLabel`.

    * `PlayFab::PlayFabSettings::titleId = "xxxx";`
      * Todo desenvolvedor do PlayFab cria um título no Game Manager. Ao publicar seu jogo, você precisa codificar esse titleId no jogo. Isso permite que o cliente saiba como acessar os dados corretos no PlayFab. Para a maioria dos usuários, basta considerar isso uma etapa obrigatória para que o PlayFab funcione.

    * `PlayFab::ClientModels::LoginWithCustomIDRequest request;`
      * A maioria dos métodos da API do PlayFab exige parâmetros de entrada, e esses parâmetros são empacotados em um objeto de requisição.
      * Cada método da API exige um objeto de requisição exclusivo, com uma combinação de parâmetros opcionais e obrigatórios.
        * Para `LoginWithCustomIDRequest`, há um parâmetro obrigatório `CustomId`, que identifica um jogador de forma exclusiva, e `CreateAccount`, que permite a criação de uma nova conta com essa chamada.
      * Para o logon, a maioria dos desenvolvedores vai querer usar um método de logon mais adequado.
        * Consulte a documentação de logon do PlayFab para obter uma lista de todos os métodos de logon e parâmetros de entrada. As opções comuns são:
          * `LoginWithAndroidDeviceID`
          * `LoginWithIOSDeviceID`
          * `LoginWithEmailAddress`

    * `PlayFab::PlayFabClientAPI::LoginWithCustomID(request, OnLoginSuccess, OnLoginFail, nullptr);`
      * Isso inicia a requisição assíncrona para `LoginWithCustomID` e invocará a função `OnLoginSuccess` ou `OnLoginFail` quando for concluída.

  * `update(float delta)`
    * Apenas definir a variável `statusMsg` não atualiza o texto na tela.
    * Esta função define o texto da GUI para corresponder ao conteúdo de `statusMsg` a cada tick (o que não é muito eficiente).

  * `OnLoginSuccess(result, customData)`
    * Quando o callback de sucesso é chamado, o objeto de resultado de muitos callbacks de API conterá as informações solicitadas.
    * `LoginResult` contém algumas informações básicas sobre o jogador, mas, para a maioria dos usuários, o logon é simplesmente uma etapa obrigatória antes de chamar outras APIs.

  * `OnLoginFail(error, customData)`
    * Se a função de erro for chamada, sua chamada à API falhou.
    * As chamadas à API podem falhar por vários motivos, e você deve sempre tentar tratar a falha.
    * Por que as chamadas à API falham (em ordem de probabilidade)
      * `PlayFabSettings.TitleId` não está definido. Se você se esquecer de definir o titleId para o seu título, nada funcionará.
        * No Cocos, a biblioteca curl provavelmente simplesmente fará seu jogo travar se você não definir o titleId corretamente.
      * Parâmetros da requisição. Se você não tiver fornecido as informações corretas ou obrigatórias para uma determinada chamada à API, ela falhará. Consulte `error.errorMessage`, `error.errorDetails` ou `error.GenerateErrorReport()` para obter mais informações.
      * Problema de conectividade do dispositivo. Celulares perdem e recuperam a conectividade constantemente, portanto qualquer chamada à API pode falhar aleatoriamente a qualquer momento e funcionar logo em seguida. Entrar em um túnel pode desconectar você completamente.
      * Problema no servidor do PlayFab. Como em qualquer software, podem ocorrer problemas. Consulte nossas notas de versão para obter atualizações.
      * A internet não é 100% confiável. Às vezes, a mensagem é corrompida ou não chega ao servidor do PlayFab.
    * Se você estiver com dificuldades para depurar um problema e as informações do callback de erro não forem suficientes, visite nossos fóruns.

  * customData é um ponteiro void, que pode ser usado de qualquer forma para estabelecer contexto.
    * Em C++, é mais difícil manter o contexto de uma chamada à API, por isso adicionamos o parâmetro `customData`, que pode repassar qualquer objeto ao callback e ser usado como você quiser para estabelecer contexto.
    * Assim, se você fizer chamadas à API para recuperar o inventário, poderá passar um ponteiro de jogador ou de inventário como `customData` e atualizar o inventário desse objeto no callback.


## Related topics

- [Motores de jogo compatíveis com o PlayFab](/pt-BR/services/playfab/sdks/game-engines/index.md)
- [SDK de Cocos2D-x (C++)](/pt-BR/services/playfab/sdks/cocos2d-x/index.md)
- [Licenças do SDK de Cocos2d-x](/pt-BR/services/playfab/sdks/cocos2d-x/license.md)
- [Notas de versão do PlayFab 2016](/pt-BR/services/playfab/release-notes/2016.md)
- [Notas de versão do PlayFab 2015](/pt-BR/services/playfab/release-notes/2015.md)
