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

# Cocos2D-x クイックスタート

> Windows 上の Visual Studio で Cocos2d-x プロジェクトをセットアップし、PlayFab Cocos2d-x クライアント ライブラリを使用して最初の PlayFab API 呼び出しを行います。

このクイックスタートでは、Cocos2d-x エンジンで最初の PlayFab API 呼び出しを行うのを支援します。

PlayFab API を呼び出す前に、[PlayFab 開発者アカウント](https://developer.playfab.com) が必要です。

## Cocos2d-x プロジェクトのセットアップ

OS: このガイドは Visual Studio 2015 を使用する Windows 10 向けに書かれています。Cocos はほとんどの最新の OS と環境で動作します。インストール手順は似ていますが、それぞれの組み合わせで異なります。

他のプラットフォーム向けにビルドする場合、必要なファイルは同じですが、プロジェクトのセットアップは自分で行う必要があります。Visual Studio 2013 でも手順は同一ですが、ここで提供されるスクリーンショットとは少し異なる場合があります。

1. Cocos2d-x をダウンロードしてインストールします
   * [https://www.cocos2d-x.org/download](https://www.cocos2d-x.org/download)
   * Cocos2d-x のセットアップにはある程度の慣れが必要です。ドキュメント サイトを確認してください:
     * [https://docs.cocos2d-x.org/cocos2d-x/en/en/](https://docs.cocos2d-x.org/cocos2d-x/v3/en/)
     * [Cocos 前提条件](https://docs.cocos2d-x.org/cocos2d-x/v3/en/installation/prerequisites.html) に注意してください
     * Visual Studio 2013 または 2015 も必要です。

2. Cocos2d-x を構成したら、Cocos CLI を使用してプロジェクトを作成します:
   * Cocos プロジェクトを保存したい場所に移動します

   * 親フォルダーでコマンド ウィンドウを開きます (Cocos CLI が実際のプロジェクト ディレクトリを作成します)
     * **Shift** キーを押しながら、エクスプローラー ウィンドウの空の白いスペースを右クリックします。

       <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="Cocos CLI - コマンド ウィンドウを開く" width="615" height="453" data-path="images/playfab/sdks/cocos2d-x/cmd-exe2.png" />

   * 新しいコンソール ウィンドウで次のコマンドを入力します:
     * `cocos new CocosGettingStarted -l cpp`
       * ターゲットのサブディレクトリ (**CocosGettingStarted**) がすでに存在していないことを確認してください。フォルダーがすでに存在する場合、このコマンドは失敗します。
       * "'cocos' は、内部コマンドまたは外部コマンドとして認識されていません" というメッセージが表示された場合、cocos のインストールが正しく構成されていません (Cocos の Windows インストール ガイドに戻ってください)。
       * 成功すると、新しいフォルダー **CocosGettingStarted** が作成されます。このガイドでは、そのディレクトリの場所を `{CocosGettingStarted}` として参照します。

   * 成功時の出力は以下の例のようになります。

```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. PlayFab Cocos2d-xSdk をダウンロードします: [Cocos2D-x SDK (C++)](https://aka.ms/playfabCsharpsdkdownload)。一時的な場所 \{PlayFabCocos} に保存して展開します
   * Windows エクスプローラーで次のフォルダーを開きます: \{PlayFabCocos}/PlayFabClientSDK
   * 別の Windows エクスプローラーで次のフォルダーを開きます: \{CocosGettingStarted}/Classes

4. \{PlayFabCocos}/PlayFabClientSDK のすべてのファイルを \{CocosGettingStarted}/Classes にコピーして貼り付けます

5. Visual Studio で `{CocosGettingStarted}/proj.win32/CocosGettingStarted.sln` を読み込みます。

6. PlayFab ファイルを Cocos プロジェクトに追加します。

7. Visual Studio のソリューション エクスプローラー パネルで、Solution/CocosGettingStarted/src フォルダーまで展開します

8. \{CocosGettingStarted}/Classes で Windows エクスプローラー ウィンドウを開きます

   * AppDelegate.h、AppDelegate.cpp、HelloWorldScene.h、HelloWorldScene.cpp を除く \{CocosGettingStarted}/Classes 内のすべてのファイルを選択します

   * それらすべてのファイルをエクスプローラーから上記の Visual Studio Solution/CocosGettingStarted/src フォルダーへドラッグ アンド ドロップします。問題が発生した場合は、1 つずつファイルをドラッグ アンド ドロップできます。*ただし、すべてのファイルを確実に追加してください*。

   * 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="ソリューション エクスプローラー - VS プロジェクト ファイル" width="317" height="580" data-path="images/playfab/sdks/cocos2d-x/sln-src.png" />

PlayFab は依存関係リストに手動で追加する必要のあるいくつかの Cocos ライブラリを使用します。

* CocosGettingStarted プロジェクトの **プロパティ** ウィンドウを開きます (下記参照)。

  <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="プロパティ ウィンドウ - Cocos インクルード ディレクトリ" width="1359" height="1070" data-path="images/playfab/sdks/cocos2d-x/cocos-include.png" />

* \[追加のインクルード ディレクトリ] を次のように置き換えます:

  `$(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>
  Cocos に同梱されているが既定では有効になっていないライブラリである curl と zlib を追加しています。
</Note>

CocosGettingStarted プロジェクトはこれでコンパイル (および実行) できるはずですが、まだ PlayFab API 呼び出しは行っていません。

インストール完了!

## 最初の API 呼び出しの設定

このガイドでは、最初の PlayFab API 呼び出しを行うための最小限の手順を提供します。確認結果はアプリで表示されます。

1. Visual Studio で、Solution/CocosGettingStarted/src フォルダー内の HelloWorldScene.h を開き、内容を次のように置き換えます:
   * Visual Studio で、**Solution/CocosGettingStarted/src** フォルダー内の `HelloWorldScene.h` を開き、内容を下記に示されているものに置き換えます。

```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. その直後に、`HelloWorldScene.cpp` を開き、内容を次のように置き換えます:

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

これらのファイルは、新しい Cocos プロジェクト テンプレートに含まれる既存の HelloWorldScene を取得し、最初の PlayFab API 呼び出しを含むように変更します。

## 完了と実行

1. Cocos プロジェクトをビルドおよび実行します: ドロップダウン -> \[デバッグ] -> \[デバッグの開始]。

2. ビルドを促すプロンプトが表示されます。**\[はい]** を選択します。

3. 次のような画面が表示されるはずです:

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

4. これで、他の API 呼び出しを始めて、ゲームをビルドできます。\
   利用可能なすべてのクライアント API 呼び出しの一覧については、[PlayFab API リファレンス](/services/playfab/api-references) ドキュメントを参照してください。

Happy coding!

## コードの分解

このオプションの最後のセクションでは、上記のソース コードの各部分を詳細に説明します。

* `HelloWorldScene.h`
  * これは Cocos によって生成された既定の `HelloWorldScene.h` からわずかに変更されているだけです。
  * 具体的には、使用している一部の Cocos GUI と、`OnLoginSuccess` および `OnLoginFail` のプロトタイプを定義しています。
  * それ以外はすべて標準の Cocos Engine 関数です。

* `HelloWorldScene.cpp`
  * `createScene()` は標準の Cocos Engine 関数です。

  * `init()`
    * 通常の Cocos GUI 関連: `closeItem` と `testReportLabel`。

    * `PlayFab::PlayFabSettings::titleId = "xxxx";`
      * すべての PlayFab 開発者は Game Manager でタイトルを作成します。ゲームを公開する際、その titleId をゲームにコーディングする必要があります。これによりクライアントは PlayFab 内の正しいデータにアクセスする方法を知ることができます。ほとんどのユーザーにとって、これは PlayFab を機能させるために必須のステップと考えてください。

    * `PlayFab::ClientModels::LoginWithCustomIDRequest request;`
      * ほとんどの PlayFab API メソッドは入力パラメーターを必要とし、それらの入力パラメーターはリクエスト オブジェクトにパックされます。
      * すべての API メソッドは、オプションおよび必須パラメーターの組み合わせを持つ独自のリクエスト オブジェクトを必要とします。
        * `LoginWithCustomIDRequest` には、プレイヤーを一意に識別する必須パラメーター `CustomId` と、この呼び出しで新しいアカウントの作成を許可する `CreateAccount` があります。
      * ログインの場合、ほとんどの開発者はより適切なログイン方法を使用したいと思うでしょう。
        * すべてのログイン方法と入力パラメーターの一覧については、PlayFab Login ドキュメントを参照してください。一般的な選択肢は次のとおりです:
          * `LoginWithAndroidDeviceID`
          * `LoginWithIOSDeviceID`
          * `LoginWithEmailAddress`

    * `PlayFab::PlayFabClientAPI::LoginWithCustomID(request, OnLoginSuccess, OnLoginFail, nullptr);`
      * これは `LoginWithCustomID` への非同期リクエストを開始し、完了時に `OnLoginSuccess` または `OnLoginFail` 関数を呼び出します。

  * `update(float delta)`
    * 単に `statusMsg` 変数を設定しても、画面上のテキストは更新されません。
    * この関数は、毎ティック GUI テキストを `statusMsg` の内容に合わせて設定します (あまり効率的ではありません)。

  * `OnLoginSuccess(result, customData)`
    * 成功コールバックが呼び出されると、多くの API コールバックの result オブジェクトには要求された情報が含まれます。
    * `LoginResult` にはプレイヤーに関するいくつかの基本情報が含まれていますが、ほとんどのユーザーにとって、ログインは他の API を呼び出す前の単なる必須ステップです。

  * `OnLoginFail(error, customData)`
    * エラー関数が呼び出された場合、API 呼び出しは失敗しています。
    * API 呼び出しは多くの理由で失敗することがあり、常に失敗を処理するように試みるべきです。
    * API 呼び出しが失敗する理由 (可能性の高い順)
      * `PlayFabSettings.TitleId` が設定されていない。titleId をタイトルに設定するのを忘れると、何も機能しません。
        * Cocos では、titleId を正しく設定できないと、curl ライブラリがゲームをクラッシュさせる可能性があります。
      * リクエスト パラメーター。特定の API 呼び出しに対して正しいまたは必要な情報を提供していない場合、失敗します。詳細については、`error.errorMessage`、`error.errorDetails`、または `error.GenerateErrorReport()` を参照してください。
      * デバイスの接続問題。携帯電話は接続を常に失ったり回復したりするため、いつでもどの API 呼び出しでもランダムに失敗し、その直後に機能することがあります。トンネルに入ると完全に接続が切れる場合もあります。
      * PlayFab サーバーの問題。すべてのソフトウェアと同様に、問題が発生する場合があります。更新については、リリース ノートを参照してください。
      * インターネットは 100% 信頼できるわけではありません。メッセージが破損したり、PlayFab サーバーに到達できないことがあります。
    * 問題のデバッグに困難があり、エラー コールバック内の情報が不十分な場合、フォーラムでご連絡ください。

  * customData は void ポインターであり、コンテキストを確立するために任意の方法で使用できます。
    * C++ では API 呼び出しのコンテキストを維持するのが困難なため、`customData` パラメーターを追加しました。これは任意のオブジェクトをコールバックに中継でき、コンテキストを確立するために好きに使用できます。
    * したがって、インベントリを取得するために API 呼び出しを行う場合、プレイヤーまたはインベントリのポインターを `customData` として渡し、コールバックでそのオブジェクトのインベントリを更新できます。


## Related topics

- [PlayFab がサポートするゲーム エンジン](/ja-jp/services/playfab/sdks/game-engines/index.md)
- [クイックスタート](/ja-jp/services/playfab/economy-monetization/economy-v2/quickstart.md)
- [クイックスタート iOS](/ja-jp/services/playfab/sdks/c/quickstart-ios.md)
- [クイックスタート Linux](/ja-jp/services/playfab/sdks/c/quickstart-linux.md)
- [クイックスタート Win32](/ja-jp/services/playfab/sdks/c/quickstart-win32.md)
