Cómo comenzar a usar los Servicios de juego de Play para C y C++

En esta guía, se describe cómo configurar un proyecto de juego nativo en C o C++ para usar el SDK nativo v2 de los Servicios de juego de Play y, luego, integrar el servicio de acceso. La integración de acceso es necesaria para integrar otras funciones de los Servicios de juego de Play en tu juego y, además, integrar estos servicios en tu servidor de juegos de backend.

Funciones admitidas

El SDK nativo v2 de los Servicios de juego de Play se encuentra en versión beta y solo es compatible con el servicio de acceso. Todavía no es compatible con otras funciones de los Servicios de juego de Play.

Documentación de referencia de la API

Los archivos de encabezado del SDK contienen documentación de referencia para las APIs. Los archivos de encabezado se encuentran en la carpeta include de los archivos del SDK, que están disponibles después de que sincronices tu proyecto con el repositorio del SDK.

Requisitos

  • Un proyecto de juego que use C o C++ nativo como lenguaje de programación principal.

  • El proyecto de juego y el entorno de desarrollo deben tener configurado el sistema de compilación Gradle.

Antes de comenzar

Debes configurar los Servicios de juego de Play en Google Play Console.

Cómo configurar tu proyecto de juego

Completa los siguientes pasos para configurar tu proyecto de juego.

Cómo actualizar CMakeLists.txt

En tu archivo CMakeLists.txt, agrega el siguiente código:

  find_package(com.google.android.gms.games.v2.c REQUIRED CONFIG)

  // link games_static for -DANDROID_STL=c++_static or default
  // link games_shared for -DANDROID_STL=c++_shared
  target_link_libraries(
    app PUBLIC com.google.android.gms.games.v2.c::games_static)

Cómo actualizar build.gradle

En el archivo build.gradle de nivel de la app, haz lo siguiente:

  • Asegúrate de que la función de compilación prefab esté habilitada.

  • Agrega la dependencia para el SDK nativo v2 de los Servicios de juego de Play:

    • com.google.android.gms:play-services-games-v2-native-c:17.0.0-beta1

Por ejemplo:

  android {
    ...
    buildFeatures {
      prefab true
    }
    ...
  }
  dependencies {
    ...
    implementation "com.google.android.gms:play-services-games-v2-native-c:17.0.0-beta1"
  }

Cómo actualizar AndroidManifest.xml

  1. En el archivo AndroidManifest.xml, define el ID del proyecto de los Servicios de juego de Play. Para hacerlo, agrega las siguientes líneas al archivo:

    <manifest>
      <application>
        <meta-data android:name="com.google.android.gms.games.APP_ID"
                   android:value="@string/game_services_project_id"/>
      </application>
    </manifest>
    
  2. Crea un recurso de cadenas para el ID del proyecto. De esta manera, tu juego podrá acceder al ID durante el tiempo de compilación. Para generar el recurso, crea el archivo project_root/app/src/main/res/values/games-ids.xml y agrega lo siguiente:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="game_services_project_id"
                translatable="false">add your Project ID here</string>
    </resources>
    
  3. Compila y prueba tu juego. Si se ejecuta correctamente, cuando inicies el juego, aparecerá un mensaje de acceso o un banner de acceso correcto.

Cómo obtener el ID de jugador

Tu juego puede acceder a la información de jugador de un usuario que accedió y recuperar su ID. Puedes recuperar un ID de jugador mediante una llamada a la función GetPlayerID, que se muestra en el siguiente ejemplo.

#include <assert.h>
#include "gni/gni.h"
#include "gni/gni_task.h"
#include "pgs/pgs_play_games.h"
#include "pgs/pgs_players_client.h"

// A callback for a GniTask returned from PgsPlayersClient_getCurrentPlayerId.
void OnGetCurrentPlayerIdCompleteCallback(GniTask *task, void *user_data) {

   if (!GniTask_isSuccessful(task)) {
      const char *error_message = nullptr;
      GniTask_getErrorMessage(task, &error_message);

      // Log error message here.

      GniString_destroy(error_message);
      GniTask_destroy(task);
      return;
   }

   const char *result = nullptr;
   PgsPlayersClient_getCurrentPlayerId_getResult(task, &result);

   // Log player id here.

   GniString_destroy(result);
   GniTask_destroy(task);
}

// Gets the player ID.
void GetPlayerId(jobject main_activity) {
   static const PgsPlayersClient *players_client =
           PgsPlayGames_getPlayersClient(main_activity);

   GniTask *get_current_player_id_task =
           PgsPlayersClient_getCurrentPlayerId(players_client);
   assert(get_current_player_id_task != nullptr);
   GniTask_addOnCompleteCallback(get_current_player_id_task,
                                 OnGetCurrentPlayerIdCompleteCallback,
                                 nullptr);
}

// Entry point for our test app
void TestPGSNative(JNIEnv *env, jobject main_activity) {
   JavaVM *java_vm;
   env->GetJavaVM(&java_vm);

   GniCore_init(java_vm, main_activity);

   GetPlayerId(main_activity);
}

Cómo volver a lanzar el mensaje de acceso

Si un jugador rechaza el mensaje inicial de acceso de los Servicios de juego de Play que se muestra automáticamente cuando se inicia el juego, es posible que cambie de opinión durante la sesión. Puedes volver a lanzar el mensaje de acceso si llamas a PgsGamesSignInClient_signIn, siempre y cuando no hayan accedido los jugadores.

Autorización del servidor de juegos

Una vez que un jugador accede correctamente a los Servicios de juego de Play, tu cliente de juego puede solicitar un código de autorización del servidor que tu servidor de juegos de backend puede usar para comunicarse de forma segura con los Servicios de juego de Play. Esto permite que tu servidor de juegos recupere, actualice y almacene datos del jugador que accedió. Puedes recuperar el código de autorización del servidor si llamas a la función PgsGamesSignInClient_requestServerSideAccess.

Para obtener más información, consulta la guía de acceso al servidor.