Comenzando Con los Servicios de Juegos de Google Play
Spanish (Español) translation by Rafael Chavarría (you can also view the original English article)
Las tecnologías de juegos están evolucionando constantemente. Sin embargo, muchos elementos nucleares de juego han permanecido sin cambio por décadas. Puntajes altos, tablas de posiciones, búsquedas, logros y soporte para multi-jugador son ejemplos. So estás desarrollando una juego para la plataforma Android, no tienes que implementar ninguno de esos elementos de manera manual. Puedes simplemente usar las APIs de servicios de juegos de Google Play en su lugar.
En este tutorial, te mostraré como crear un simple juego Android, agregarle servicios de juego de Google Play y usar las APIs de tablas de posiciones y logros.
Prerequisitos
Para poder seguir este tutorial, necesitas lo siguiente:
- La última versión de Android Studio.
- Un dispositivo Android que tenga la última versión de aplicación de servicios de Google Play instalada.
1. Crea un Juego Simple
No hay diversión en agregar las APIs de servicios de juegos de Play a un proyecto vacío de Android Studio. Así pues, creemos un juego en donde el usuario gana puntos simplemente dando clic a u botón. Más precisamente, el objetivo del juego será dar clic a un botón tan seguido como sea posible dentro de 60 segundos.
Paso 1: Crea el Diseño del Juego
La retícula del juego tendrá un widget Button
, al que el usuario dará clic para ganar puntos y dos widgets TextView
para mostrar el marcador y el tiempo restante. Si los pones todos dentro de un RelativeLayout
y los centras tanto horizontal como verticalmente, deberías tener un archivo de retícula que se vea así:
1 |
<?xml version="1.0" encoding="utf-8"?>
|
2 |
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android" |
3 |
xmlns:tools="http://schemas.android.com/tools" |
4 |
android:id="@+id/activity_main" |
5 |
android:layout_width="match_parent" |
6 |
android:layout_height="match_parent" |
7 |
android:paddingBottom="@dimen/activity_vertical_margin" |
8 |
android:paddingLeft="@dimen/activity_horizontal_margin" |
9 |
android:paddingRight="@dimen/activity_horizontal_margin" |
10 |
android:paddingTop="@dimen/activity_vertical_margin" |
11 |
tools:context="com.tutsplus.mylittlegame.MainActivity"> |
12 |
|
13 |
<Button
|
14 |
android:text="Start" |
15 |
android:layout_width="wrap_content" |
16 |
android:layout_height="wrap_content" |
17 |
android:layout_centerVertical="true" |
18 |
android:layout_centerHorizontal="true" |
19 |
android:id="@+id/main_button" /> |
20 |
|
21 |
<TextView
|
22 |
android:text="Time remaining: 0 seconds" |
23 |
android:layout_width="wrap_content" |
24 |
android:layout_height="wrap_content" |
25 |
android:layout_below="@+id/main_button" |
26 |
android:layout_centerHorizontal="true" |
27 |
android:layout_marginTop="25dp" |
28 |
android:id="@+id/time_view" /> |
29 |
|
30 |
<TextView
|
31 |
android:text="Score: 0" |
32 |
android:layout_width="wrap_content" |
33 |
android:layout_height="wrap_content" |
34 |
android:layout_above="@+id/main_button" |
35 |
android:layout_marginBottom="28dp" |
36 |
android:layout_centerHorizontal="true" |
37 |
android:id="@+id/score_view" /> |
38 |
|
39 |
</RelativeLayout>
|
Nuestro juego tendrá una pantalla de tabla de posiciones y una pantalla de logros. Para permitir al usuario navegar a esas pantallas, agrega dos widgets Button
más al final del archivo de retícula.
1 |
<Button
|
2 |
android:text="Achievements" |
3 |
android:layout_width="wrap_content" |
4 |
android:layout_height="wrap_content" |
5 |
android:layout_alignParentTop="true" |
6 |
android:layout_alignParentLeft="true" |
7 |
android:id="@+id/achievements_button" |
8 |
android:onClick="showAchievements" |
9 |
/>
|
10 |
|
11 |
<Button
|
12 |
android:text="Leaderboard" |
13 |
android:layout_width="wrap_content" |
14 |
android:layout_height="wrap_content" |
15 |
android:layout_alignParentTop="true" |
16 |
android:layout_alignParentRight="true" |
17 |
android:id="@+id/leaderboard_button" |
18 |
android:onClick="showLeaderboard"/> |
Nota que ambos botones tienen atributos onClick
. Crearemos los métodos Java a los que se referirán en pasos futuros.
Paso 2: Implementa la Lógica de Juego
Dentro de la actividad, crea variables miembro para los widgets de juego que definimos en el archivo XML de retícula. Adicionalmente, crea una variable int
para el marcador y una variable boolean
para el estado del juego.
1 |
private Button mainButton; |
2 |
private TextView scoreView; |
3 |
private TextView timeView; |
4 |
|
5 |
private int score = 0; |
6 |
private boolean playing = false; |
Inicializa los widgets dentro del método onCreate()
de la actividad usando el método findViewById()
.
1 |
mainButton = (Button)findViewById(R.id.main_button); |
2 |
scoreView = (TextView)findViewById(R.id.score_view); |
3 |
timeView = (TextView)findViewById(R.id.time_view); |
Para escuchar clics en el widget Button
, crea y agrega un OnClickListener
a este.
1 |
mainButton.setOnClickListener(new View.OnClickListener() { |
2 |
@Override
|
3 |
public void onClick(View v) { |
4 |
// More code goes here
|
5 |
}
|
6 |
});
|
Debemos implementar ahora los siguientes requerimientos:
- La primera vez que el usuario de clic al botón, el juego debe comenzar.
- Cada clic subsecuente debería incrementar la variable
score
.
- El juego debe terminar cuando hayan pasado 60 segundos.
Podemos usar la variable playing
para diferenciar entre el primer clic y los clics subsecuentes. Para llevar seguimiento del tiempo, podemos usar la clase abstracta CountDownTimer
, la cuál es ideal para nuestros requerimientos. Tiene un método onTick()
dentro, el cuál puede actualizar de manera precisa timeView
para mostrar el número de segundos restantes. También tiene un método onFinish
, el cuál es llamado cuando el contador ha terminado.
Por lo tanto, agrega el siguiente código en el método onClick()
:
1 |
if(!playing) { |
2 |
// The first click
|
3 |
playing = true; |
4 |
mainButton.setText("Keep Clicking"); |
5 |
|
6 |
// Initialize CountDownTimer to 60 seconds
|
7 |
new CountDownTimer(60000, 1000) { |
8 |
@Override
|
9 |
public void onTick(long millisUntilFinished) { |
10 |
timeView.setText("Time remaining: " + millisUntilFinished/1000); |
11 |
}
|
12 |
|
13 |
@Override
|
14 |
public void onFinish() { |
15 |
playing = false; |
16 |
timeView.setText("Game over"); |
17 |
mainButton.setVisibility(View.GONE); |
18 |
}
|
19 |
}.start(); // Start the timer |
20 |
} else { |
21 |
// Subsequent clicks
|
22 |
score++; |
23 |
scoreView.setText("Score: " + score + " points"); |
24 |
}
|
En este punto, puedes ejecutar el proyecto para jugar el juego.



2. Agrega Dependencias de Servicios de Juegos
Configurar un proyecto para usar las APIs de servicios de juegos de Play involucra muchos pasos. Usando el Asistente Firebase de Android Studio, puedes automatizarlos.
Abre la ventana del asistente yendo a Herramientas > Firebase. Después, en la sección de Analytics, da clic en el enlace Log an Analytics event. Ahora puedes conectar tu proyecto de Android Studio a un proyecto Firebase dando clic al botón Conectar a Firebase. Asegúrate de que eliges la opción Crear nuevo proyecto Firebase en el diálogo que emerge.



Una vez que la conexión ha sido establecida, presiona el botón Add Analytics to your app para agregar todos los cambios requeridos a los archivos build.gradle.
Debes agregar la dependencia para los servicios de juegos de Play manualmente. Así pues, ve al archivo build.gradle del módulo app
y agrega la siguiente dependencia compile
:
1 |
compile 'com.google.android.gms:play-services-games:9.8.0' |
También, las APIs de servicios de juegos necesitan un archivo de configuración XML. Crea uno llamado games-ids.xml dentro de la carpeta res/values. Agregaremos contenido a este en un paso futuro.
3. Registra el Juego
Todos los juegos que usan servicios de juegos de Google Play deben registrarse en la consola de desarrollador de Play. Tendrás que pagar una cuota única de registro de $25 para poder acceder a la consola.
En la consola, da clic al icono del gamepad para abrir la pantalla de Servicios de Juegos.



Después, da clic en el botón Configurar servicios de juegos de Google Play para comenzar a registrar el juego.
En el diálogo que emerge, elige la segunda pestaña porque nuestro juego ya está usando Google APIs. Debes poder ver ahora el nombre de tu proyecto de Firebase en la lista de proyectos disponibles. Después de seleccionarlo, elige una categoría para el juego. Por ahora, puedes ir a la categoría de Casual.



Después de que presiones Continuar, puedes enlazar Firebase Analytics y servicios de juegos Play dando clic al botón Enlazar Firebase.
Después, ve a la sección de Apps Enlazadas para enlazar tu proyecto de Android Studio con la consola de desarrollador de Play. En el diálogo que emerge, presiona el botón Android y teclea el nombre de paquete de tu proyecto en el campo Nombre de Paquete.



Presiona el botón Guardar y continuar para generar un ID de cliente para tu juego.



Nuestro juego ahora ha sido registrado exitosamente con la consola de desarrollador Google Play.
4. Agrega un Usuario de Prueba
Los servicios de juegos Play funcionarán solo si tu juego es publicado en Google Play. Sin embargo, para permitirte probar tu juego, la consola de desarrollador te permite asociar unas cuantas cuentas de usuario de prueba. Yendo a la sección Testing, puedes agregar o quitar cuentas de usuario de prueba. Asegúrate de que agregas la cuenta de Google que usas en tu teléfono o emulador aquí.



5. Crea una Tabla de Posiciones
Una tabla de posiciones no es nada más que una pantalla que muestra las puntuaciones altas de los usuarios. Las tablas de posiciones de servicios de juegos de Play permite a los usuarios ver sus altas puntuaciones diarias, semanales y de todo el tiempo.
Crear una tabla de posiciones en la consola de desarrollador Play toma solo unos cuantos clics. Ve a la sección de Tabla de posiciones y presiona el botón Agregar tabla de posiciones. En la siguiente pantalla, da un nombre significativo a la tabla de posiciones y presiona el botón Guardar.



Nuestra tabla de posiciones está ahora lista.
6. Crea un Logro
Los logros son premios dentro del juego que los usuarios obtienen por lograr hacer algo especial. Un juego que tiene muchos logros para desbloquear es usualmente más divertido que uno que no los tiene. Consecuentemente, la mayoría de los juegos populares en Google Play hoy en día tienen docenas, sino cientos de logros.
En este tutorial, agregaremos un solo logro a nuestro juego. Su nombre será Lightning Fast y será desbloqueado cuando los usuarios logren tocar el botón más de 100 veces en un minuto. Para crear el logro, ve a la sección Logros y presiona el botón Agregar logro. Después de que tecleas el nombre y la descripción del logro, presiona el botón Guardar.



7. Actualiza la Configuración XML del Juego
Tanto la tabla de posiciones como el logro tienen identificadores únicos. Debemos agregar ahora esos identificadores a nuestro proyecto de Android Studio junto con el ID de aplicación que fue generado durante el registro. También puedes hacerlo manualmente actualizando el archivo games-ids.xml que creamos anteriormente. Sin embargo, sugiero que uses el código de configuración automáticamente generado disponible en la consola de desarrollador.
Para obtener el código de configuración auto-generado, puedes ir ya sea a la sección Logros o Tabla de posiciones y presionar el enlace Obtener recursos. Verás código XML que luce así:
1 |
<?xml version="1.0" encoding="utf-8"?>
|
2 |
<!--
|
3 |
Google Play game services IDs.
|
4 |
Save this file as res/values/games-ids.xml in your project.
|
5 |
-->
|
6 |
<resources>
|
7 |
<string name="app_id">1234567890</string> |
8 |
<string name="package_name">com.tutsplus.mylittlegame</string> |
9 |
<string name="achievement_lightning_fast">HzkA4Kz04F8MRYIAze</string> |
10 |
<string name="leaderboard_my_little_leaderboard">HzkA4Kz04F8MRYIBVU</string> |
11 |
</resources>
|
Copia todo el código y pégalo en el archivo games-ids.xml de tu archivo.
8. Conecta a Servicios de Juegos de Play
Antes de usar las APIs de Tablas de posiciones y logros, debemos crear una instancia de GoogleApiClient
y conectala a servicios de juegos de Play. De ahí, agrega un objeto GoogleApiClient
como una variable miembro de tu actividad.
Debemos usar la clase GoogleApiClient.Builder
para construir la instancia GoogleApiClient
. Mientras construimos el cliente, podemos especificar la API y su alcance en los que estamos interesados usando los métodos addApi()
y addScope()
.
Adicionalmente, sugiero que llames al método enableAutoManage()
para asegurar que el cliente administra automáticamente la conexión a los servicios de juegos. El método, sin embargo, necesita un OnConnectionFailedListener
, el cuál será llamado cuando la conexión falla. Por ahora, simplemente llamaremos el método finish()
para cerrar la app en caso de falla de conexión.
En consecuencia, agrega el siguiente código al inicio del método onCreate()
:
1 |
apiClient = new GoogleApiClient.Builder(this) |
2 |
.addApi(Games.API) |
3 |
.addScope(Games.SCOPE_GAMES) |
4 |
.enableAutoManage(this, new GoogleApiClient.OnConnectionFailedListener() { |
5 |
@Override
|
6 |
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { |
7 |
Log.e(TAG, "Could not connect to Play games services"); |
8 |
finish(); |
9 |
}
|
10 |
}).build(); |
Si ejecutas la app ahora, se te pedirá crear un Gamer ID para ti mismo. Teclea un Gamer ID de tu elección y presiona el botón Ingresar.



9. Usa la Tabla de posiciones
Enviar un marcador a la tabla de posiciones toma solo una línea de código. Todo lo que necesitas hacer es llamar el método submitScore()
de la clase Games.Leaderboards
. Como sus argumentos, espera la instancia GoogleApiClient
, el ID de la tabla de posiciones y el marcador.
En nuestro juego, debemos enviar el marcador al final de los 60 segundos. Así pues, agrega el siguiente código al método onFinish():
1 |
Games.Leaderboards.submitScore(apiClient, |
2 |
getString(R.string.leaderboard_my_little_leaderboard), |
3 |
score); |
Para ver la tabla de posiciones, debemos comenzar una nueva actividad con un intent de tabla de posiciones. Para recoger el intent de la tabla de posiciones, llama al método getLeaderboardIntent()
de la clase Games.Leaderboards
y pasa la instancia GoogleApiClient
y el ID de la tabla de posiciones.
La retícula de nuestro juego ya tiene un botón que puede ser presionada para abrir la tabla de posiciones. El valor de su atributo onClick
es showLeaderboard
. De ahí, agrega el siguiente código a tu actividad:
1 |
public void showLeaderboard(View v) { |
2 |
startActivityForResult( |
3 |
Games.Leaderboards.getLeaderboardIntent(apiClient, |
4 |
getString(R.string.leaderboard_my_little_leaderboard)), 0); |
5 |
}
|
Puedes correr la app ahora y jugar el juego de nuevo. Esta vez, cuando el juego termina, tu marcador será enviado a la tabla de posiciones. Aquí está cómo luce la tabla de posiciones por defecto:



10. Usa el Logro
Llamando al método unlock()
de la clase Games.Achievements
, puedes desbloquear cualquier logro. El método espera la instancia de GoogleApiClient
y el ID del logro como sus únicos argumentos.
El logro Lightning Fast que definimos en la consola debe ser desbloqueado cuando la puntuación del usuario cruza los 100 puntos. Así pues, justo después del código para incrementar la puntuación, agrega el siguiente código:
1 |
if(score>100) { |
2 |
Games.Achievements |
3 |
.unlock(apiClient, |
4 |
getString(R.string.achievement_lightning_fast)); |
5 |
}
|
El código necesario para mostrar las pantallas de logros es muy similar a la que escribimos para mostrar la pantalla de tabla de posiciones. Todo lo que necesitas hacer es asar el valor de retorno del método getAchievementsIntent()
al método startActivityForResult()
.
1 |
public void showAchievements(View v) { |
2 |
startActivityForResult( |
3 |
Games.Achievements |
4 |
.getAchievementsIntent(apiClient), |
5 |
1
|
6 |
);
|
7 |
}
|
Si corres la aplicación y juegas de nuevo, verás un logro emergente cuando tu puntuación pasa los 100 puntos por primera vez.



Conclusión
Ahora sabes como usar las APIs de servicios de juegos de Google Play en tu proyecto de Android Studio. Los servicios de juegos de Play no están limitados a la plataforma Android. Estos pueden ser usados tan fácilmente tanto para la web como para iOS también. Así que los servicios de juegos te permiten crear juegos multi-plataforma y ofrecer experiencias de juego consistentes a los usuarios en múltiples plataformas.
Para aprender más acerca de las APIs de servicios de juegos de Google Play, puedes referirte a sus guías oficiales o, incluso mejor, ¡revisar algunos de nuestros tutoriales aquí en Envato Tuts+!
- SDK de AndroidAndroid Desde Cero: Servicios Google PlayPaul Trebilcox-Ruiz
- AndroidCómo Crecer tu Audiencia Con Invitaciones Google AppGianluca Segato
- SDK de AndroidServicios de Google Play: Usando la API PlacesPaul Trebilcox-Ruiz
- SDK de AndroidServicios de Google Play: Google Cast v3 y MediaPaul Trebilcox-Ruiz