Google Play Game Services: Tablas de clasificación
Spanish (Español) translation by CYC (you can also view the original English article)
Los servicios de juegos de Google Play brindan la oportunidad de agregar funciones sociales a tus juegos a través de las cuentas de Google+ de los usuarios. En este tutorial, demostraremos cómo puedes agregar tablas de clasificación a una aplicación Android, presentar puntajes de usuarios y presentar las clasificaciones actuales de los usuarios dentro del juego.
El uso de tablas de clasificación implica preparar tu IDE, configurar la tabla de líderes en Google Play Developer Console y agregar funcionalidad a tu aplicación.
Si completaste el reciente tutorial sobre cómo agregar logros a las aplicaciones Android, podrás omitir algunos de los pasos en este. El código fuente adjunto incluye la misma aplicación que utilizamos para el tutorial de logros, con los logros y la funcionalidad de tablas de clasificación añadidas.
1. Prepara tu IDE
Paso 1
Para usar Google Play Services, necesitas ciertas utilidades instaladas en tu entorno de desarrollo. Además, dado que estamos usando Game Services, instalaremos la biblioteca BaseGameUtils, que reduce la cantidad de codificación que necesitamos para implementar funciones como el inicio de sesión de Google+.
Para comenzar, crea una nueva aplicación o usa una existente. Si seguiste el tutorial de logros, puedes usar la aplicación que creaste para ese tutorial. Si estás creando tu propio juego, decide para qué quieres usar tablas de clasificación y cuándo planeas enviar una puntuación de usuario. Cada puntaje de la tabla de clasificación será un número. Puedes configurar la tabla de clasificación para considerar los valores de números más bajos o más altos como mejores en términos de posición en la tabla de clasificación, pero, naturalmente, esto dependerá del propósito de tu juego.
El código en la carpeta de descargas incluye un juego simple en el que el usuario adivina un número. Usaremos el número de conjeturas requeridas para obtener la respuesta correcta como puntaje de la tabla de clasificación. En este caso, menos conjeturas son mejores, por lo que la clasificación presentará primero las puntuaciones más bajas. Para simplificar, limitaremos el número de conjeturas que un usuario puede realizar. Este es un ejemplo trivial para demostrar el concepto y la funcionalidad de la tabla de clasificación. Tus propios juegos probablemente implicarán más complejidad.
Paso 2
Preparemos Eclipse para desarrollar con Google Play Game Services. Abre Android SDK Manager y ve a la carpeta Extras. Expande la carpeta y selecciona Google Play Services más el Repositorio de Google. Instala Google APIs Platform desde una de las versiones recientes de Android si quieres probar en el emulador. Instala los paquetes elegidos.
Paso 3
Eclipse también deberá hacer referencia a algunos recursos adicionales en el área de trabajo. En tu computadora, navega a la ubicación de la Biblioteca de servicios de Google Play, que debe estar en la carpeta Android SDK, en extras/google/google_play_services/libproject/google-play-services_lib/. Copia y pega la biblioteca en otro lugar en tu computador.
Ahora necesitamos una referencia a esta copia en Eclipse. Selecciona Importar > Android > Importar código de Android existente en el espacio de trabajo en el menú Archivo. Selecciona la ubicación de la copia que hiciste. La biblioteca importada ahora debería aparecer como un nuevo proyecto en Eclipse. Haz clic con el botón derecho y selecciona Propiedades. En la sección Android, elige un objetivo de compilación de API de Google y marca la casilla de verificación Es Biblioteca.
Paso 4
La importación del recurso BaseGameUtils es ligeramente diferente. La biblioteca está alojada en GitHub. Puedes encontrarlo en la sección Descargas, en Juegos de ejemplo. Descarga la biblioteca y guárdala en tu computadora.
Como hiciste con la biblioteca de servicios de Google Play, selecciona Importar > Android > Importar código de Android existente en el espacio de trabajo en el menú Archivo para llevar la biblioteca BaseGameUtils a Eclipse. Haz clic con el botón derecho para navegar a las nuevas propiedades del proyecto y asegúrate de que el proyecto esté marcado como biblioteca al marcar Es Biblioteca.
Paso 5
Ahora podemos hacer que la aplicación haga referencia a estos dos recursos dentro del espacio de trabajo. Haz clic derecho en tu aplicación en el Explorador de paquetes y elige Propiedades. Navega a la sección Android y selecciona Agregar en la sección Biblioteca. Elige tanto la biblioteca de Servicios de Google Play como BaseGameUtils y agrégalos a tu aplicación.
2. Prepara tu juego en la consola de desarrollo
Paso 1
Antes de que puedas crear una tabla de clasificación, la aplicación debe aparecer en la Consola para programadores de Google Play. Inicia sesión y haz clic en el botón de la izquierda Game Services . Si ya hiciste esto para tu aplicación en el tutorial de logros, no necesitas hacerlo nuevamente. Puedes pasar a la sección 3 sobre cómo crear una tabla de clasificación.
Haz clic en Configurar servicios de juegos de Google Play.



Haz clic para agregar un nuevo juego, selecciona No uso API de Google en mi juego todavía, y elige un nombre y categoría para tu juego. Haz clic en Continuar para ir al siguiente paso.



Agrega el título de tu juego. Puedes agregar otros detalles más adelante.
Paso 2
Vamos a vincular la aplicación para que podamos consultar esta lista de la Consola de Desarrollador en la propia aplicación. Haz clic en la entrada Aplicaciones vinculadas en la lista de la izquierda y elige Android.



Ingresa la información de tu aplicación, incluido el nombre del paquete, asegurándote de que sea igual a la que estás utilizando en tu proyecto.



Guarda y haz clic en Autorizar tu aplicación ahora. Por el momento, puedes agregar el nombre de la aplicación, pero puedes ingresar más detalles más adelante. Elige Aplicación instalada en el área ID de cliente, con Android como tipo e ingresa el nombre de tu paquete. Ahora necesitas usar la utilidad keytool para generar un certificado de firma. Puedes usar el siguiente comando en una terminal o símbolo del sistema en combinación con el certificado de depuración:
1 |
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -list -v |
La terminal o símbolo del sistema escribirá la huella digital del certificado. Copia lo que ves después de SHA1 y pégalo en Developer Console en el área de texto de Huella digital de certificado de firma.
Selecciona Crear cliente y copia la ID de la aplicación, que se muestra junto al nombre de la aplicación en Developer Console. Agregarás el ID a tu aplicación junto con el ID de la tabla de clasificación que estamos por crear.
3. Crea una tabla de clasificación
Paso 1
Todavía en Developer Console, creemos ahora una nueva tabla de clasificación. Selecciona la sección Tablas de clasificación en tu lista de aplicaciones y haz clic en Agregar tabla de líderes.



Asegúrate de comprender el concepto de Tablas de clasificación en Android y, en general, en los Servicios de juegos de Google Play. Puedes leer una descripción general en el sitio web de Google Play Game Services. En realidad, puedes hacer muchas cosas diferentes con tablas de clasificación, así que considera que lo que hacemos en este tutorial es solo un punto de partida.
Ingresa los detalles de tu nueva tabla de clasificación. Para nuestro código de muestra, usamos el nombre Menos conjeturas y seleccionamos Más pequeño es mejor en la sección Ordenar.



Agrega un icono si lo deseas. Si no lo haces, se usará una imagen estándar. Guarda tu nueva tabla de clasificación y copia tu ID.
Paso 2
En la sección Pruebas de tu aplicación en Developer Console, puedes agregar cuentas a las que se les otorgará acceso para probar el juego. De forma predeterminada, verás tu propio correo electrónico de la cuenta de Google allí enumerado, por lo que deberías poder usarlo para probar tu aplicación.
4. Prepara tu juego para acceder a los servicios de juegos
Paso 1
Es hora de preparar la aplicación para acceder a la tabla de líderes en Eclipse. Si completaste el tutorial de logros, puedes omitir parte de esta sección. Primero agreguemos los ID para la aplicación y la tabla de clasificación. Abre o crea un archivo de recursos res/values/ids.xml. Usa la siguiente sintaxis para ingresar los ID que copiaste para la aplicación y la nueva tabla de clasificación cuando los creaste en Developer Console:
1 |
<string name="app_id">1234567890</string> |
2 |
<string name="number_guesses_leaderboard">abcdefg1234567</string> |
Guarda el archivo y abre el Manifiesto del proyecto. Agrega lo siguiente dentro del elemento application:
1 |
<meta-data
|
2 |
android:name="com.google.android.gms.games.APP_ID" |
3 |
android:value="@string/app_id" /> |
4 |
<meta-data
|
5 |
android:name="com.google.android.gms.version" |
6 |
android:value="@integer/google_play_services_version" /> |
La aplicación ahora está configurada para vincular a los listados que agregamos en Developer Console.
Paso 2
Cuando utilizas los servicios de Google en tus aplicaciones Android, necesitas que tus usuarios inicien sesión en sus cuentas de Google. Puedes tomar varios enfoques para implementar esto, pero vamos a automatizar partes de este proceso utilizando la clase BaseGameActivity junto con botones estándar para iniciar y cerrar sesión. Además, cuando se inicia la actividad, la aplicación intentará iniciar sesión en el usuario de inmediato.
Abre el archivo de diseño principal de tu aplicación y agrega botones para iniciar/cerrar sesión:
1 |
<!-- sign-in button -->
|
2 |
|
3 |
<com.google.android.gms.common.SignInButton
|
4 |
android:id="@+id/sign_in_button" |
5 |
android:layout_width="wrap_content" |
6 |
android:layout_height="wrap_content" /> |
7 |
|
8 |
<!-- sign-out button -->
|
9 |
|
10 |
<Button
|
11 |
android:id="@+id/sign_out_button" |
12 |
android:layout_width="wrap_content" |
13 |
android:layout_height="wrap_content" |
14 |
android:text="Sign Out" |
15 |
android:visibility="gone" /> |
Paso 3
Agrega estas importaciones a tu clase principal Activity:
1 |
import com.google.android.gms.games.Games; |
2 |
import com.google.example.games.basegameutils.BaseGameActivity; |
Haz que la clase Activity amplíe la clase BaseGameActivity y recepcione si hay clics:
1 |
public class MainActivity extends BaseGameActivity implements View.OnClickListener |
Prepárate para responder a los clics en los botones para iniciar o cerrar sesión en onCreate:
1 |
findViewById(R.id.sign_in_button).setOnClickListener(this); |
2 |
findViewById(R.id.sign_out_button).setOnClickListener(this); |
Ahora agrega los siguientes métodos estándar a un método onClick en la clase:
1 |
@Override
|
2 |
public void onClick(View view) { |
3 |
if (view.getId() == R.id.sign_in_button) { |
4 |
beginUserInitiatedSignIn(); |
5 |
}
|
6 |
else if (view.getId() == R.id.sign_out_button) { |
7 |
signOut(); |
8 |
findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE); |
9 |
findViewById(R.id.sign_out_button).setVisibility(View.GONE); |
10 |
}
|
11 |
}
|
Los métodos que llamamos aquí los proporciona la clase BaseGameActivity de la que hereda nuestra clase Activity, por lo que no es necesario que manejemos los detalles de forma manual. Finalmente, agregamos un par de devoluciones de llamada estándar:
1 |
public void onSignInSucceeded() { |
2 |
findViewById(R.id.sign_in_button).setVisibility(View.GONE); |
3 |
findViewById(R.id.sign_out_button).setVisibility(View.VISIBLE); |
4 |
}
|
5 |
|
6 |
@Override
|
7 |
public void onSignInFailed() { |
8 |
findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE); |
9 |
findViewById(R.id.sign_out_button).setVisibility(View.GONE); |
10 |
}
|
Cuando recurrimos a la funcionalidad de la tabla de clasificación, primero verificaremos si la aplicación tiene conexión con los servicios de Google. Alternativamente, puedes agregar código a estos métodos para administrar la conciencia de tu aplicación sobre si se puede llamar o no a Play Services.
5. Implementa tu tabla de clasificación
Paso 1
Ahora podemos dejar que la aplicación use la tabla de clasificación. El código en la aplicación de muestra usa el siguiente diseño. No entraré en detalles para explicar el diseño ya que tus propias aplicaciones tendrán un diseño diferente.
1 |
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android" |
2 |
xmlns:tools="http://schemas.android.com/tools" |
3 |
android:layout_width="match_parent" |
4 |
android:layout_height="match_parent" |
5 |
android:paddingBottom="@dimen/activity_vertical_margin" |
6 |
android:paddingLeft="@dimen/activity_horizontal_margin" |
7 |
android:paddingRight="@dimen/activity_horizontal_margin" |
8 |
android:paddingTop="@dimen/activity_vertical_margin" |
9 |
tools:context="com.example.fungame.MainActivity" > |
10 |
|
11 |
<LinearLayout
|
12 |
android:id="@+id/sign_in_buttons" |
13 |
android:layout_width="fill_parent" |
14 |
android:layout_height="wrap_content" |
15 |
android:layout_alignParentTop="true" |
16 |
android:orientation="horizontal" > |
17 |
|
18 |
<!-- sign-in button -->
|
19 |
|
20 |
<com.google.android.gms.common.SignInButton
|
21 |
android:id="@+id/sign_in_button" |
22 |
android:layout_width="wrap_content" |
23 |
android:layout_height="wrap_content" /> |
24 |
|
25 |
<!-- sign-out button -->
|
26 |
|
27 |
<Button
|
28 |
android:id="@+id/sign_out_button" |
29 |
android:layout_width="wrap_content" |
30 |
android:layout_height="wrap_content" |
31 |
android:text="Sign Out" |
32 |
android:visibility="gone" /> |
33 |
</LinearLayout>
|
34 |
|
35 |
<RelativeLayout
|
36 |
android:id="@+id/gameArea" |
37 |
android:layout_width="fill_parent" |
38 |
android:layout_height="wrap_content" |
39 |
android:layout_below="@id/sign_in_buttons" > |
40 |
|
41 |
<TextView
|
42 |
android:id="@+id/guess_text" |
43 |
android:layout_width="fill_parent" |
44 |
android:layout_height="wrap_content" |
45 |
android:layout_centerHorizontal="true" |
46 |
android:text="Guess the number!" |
47 |
android:textSize="30sp" |
48 |
android:textStyle="bold" /> |
49 |
|
50 |
<LinearLayout
|
51 |
android:layout_width="fill_parent" |
52 |
android:layout_height="wrap_content" |
53 |
android:layout_below="@id/guess_text" |
54 |
android:orientation="vertical" > |
55 |
|
56 |
<LinearLayout
|
57 |
android:layout_width="fill_parent" |
58 |
android:layout_height="wrap_content" |
59 |
android:orientation="horizontal" > |
60 |
|
61 |
<Button
|
62 |
android:id="@+id/btn7" |
63 |
android:layout_width="0dp" |
64 |
android:layout_height="match_parent" |
65 |
android:layout_margin="1dp" |
66 |
android:layout_weight="1" |
67 |
android:background="#ff000033" |
68 |
android:gravity="center" |
69 |
android:onClick="btnPressed" |
70 |
android:padding="5dp" |
71 |
android:tag="7" |
72 |
android:text="7" |
73 |
android:textColor="#ffffffff" |
74 |
android:textSize="30sp" |
75 |
android:textStyle="bold" /> |
76 |
|
77 |
<Button
|
78 |
android:id="@+id/btn8" |
79 |
android:layout_width="0dp" |
80 |
android:layout_height="match_parent" |
81 |
android:layout_margin="1dp" |
82 |
android:layout_weight="1" |
83 |
android:background="#ff000033" |
84 |
android:gravity="center" |
85 |
android:onClick="btnPressed" |
86 |
android:padding="5dp" |
87 |
android:tag="8" |
88 |
android:text="8" |
89 |
android:textColor="#ffffffff" |
90 |
android:textSize="30sp" |
91 |
android:textStyle="bold" /> |
92 |
|
93 |
<Button
|
94 |
android:id="@+id/btn9" |
95 |
android:layout_width="0dp" |
96 |
android:layout_height="match_parent" |
97 |
android:layout_margin="1dp" |
98 |
android:layout_weight="1" |
99 |
android:background="#ff000033" |
100 |
android:gravity="center" |
101 |
android:onClick="btnPressed" |
102 |
android:padding="5dp" |
103 |
android:tag="9" |
104 |
android:text="9" |
105 |
android:textColor="#ffffffff" |
106 |
android:textSize="30sp" |
107 |
android:textStyle="bold" /> |
108 |
</LinearLayout>
|
109 |
|
110 |
<LinearLayout
|
111 |
android:layout_width="fill_parent" |
112 |
android:layout_height="wrap_content" |
113 |
android:layout_weight="1" |
114 |
android:orientation="horizontal" > |
115 |
|
116 |
<Button
|
117 |
android:id="@+id/btn4" |
118 |
android:layout_width="0dp" |
119 |
android:layout_height="match_parent" |
120 |
android:layout_margin="1dp" |
121 |
android:layout_weight="1" |
122 |
android:background="#ff000033" |
123 |
android:gravity="center" |
124 |
android:onClick="btnPressed" |
125 |
android:padding="5dp" |
126 |
android:tag="4" |
127 |
android:text="4" |
128 |
android:textColor="#ffffffff" |
129 |
android:textSize="30sp" |
130 |
android:textStyle="bold" /> |
131 |
|
132 |
<Button
|
133 |
android:id="@+id/btn5" |
134 |
android:layout_width="0dp" |
135 |
android:layout_height="match_parent" |
136 |
android:layout_margin="1dp" |
137 |
android:layout_weight="1" |
138 |
android:background="#ff000033" |
139 |
android:gravity="center" |
140 |
android:onClick="btnPressed" |
141 |
android:padding="5dp" |
142 |
android:tag="5" |
143 |
android:text="5" |
144 |
android:textColor="#ffffffff" |
145 |
android:textSize="30sp" |
146 |
android:textStyle="bold" /> |
147 |
|
148 |
<Button
|
149 |
android:id="@+id/btn6" |
150 |
android:layout_width="0dp" |
151 |
android:layout_height="match_parent" |
152 |
android:layout_margin="1dp" |
153 |
android:layout_weight="1" |
154 |
android:background="#ff000033" |
155 |
android:gravity="center" |
156 |
android:onClick="btnPressed" |
157 |
android:padding="5dp" |
158 |
android:tag="6" |
159 |
android:text="6" |
160 |
android:textColor="#ffffffff" |
161 |
android:textSize="30sp" |
162 |
android:textStyle="bold" /> |
163 |
</LinearLayout>
|
164 |
|
165 |
<LinearLayout
|
166 |
android:layout_width="fill_parent" |
167 |
android:layout_height="wrap_content" |
168 |
android:layout_weight="1" |
169 |
android:orientation="horizontal" > |
170 |
|
171 |
<Button
|
172 |
android:id="@+id/btn1" |
173 |
android:layout_width="0dp" |
174 |
android:layout_height="match_parent" |
175 |
android:layout_margin="1dp" |
176 |
android:layout_weight="1" |
177 |
android:background="#ff000033" |
178 |
android:gravity="center" |
179 |
android:onClick="btnPressed" |
180 |
android:padding="5dp" |
181 |
android:tag="1" |
182 |
android:text="1" |
183 |
android:textColor="#ffffffff" |
184 |
android:textSize="30sp" |
185 |
android:textStyle="bold" /> |
186 |
|
187 |
<Button
|
188 |
android:id="@+id/btn2" |
189 |
android:layout_width="0dp" |
190 |
android:layout_height="match_parent" |
191 |
android:layout_margin="1dp" |
192 |
android:layout_weight="1" |
193 |
android:background="#ff000033" |
194 |
android:gravity="center" |
195 |
android:onClick="btnPressed" |
196 |
android:padding="5dp" |
197 |
android:tag="2" |
198 |
android:text="2" |
199 |
android:textColor="#ffffffff" |
200 |
android:textSize="30sp" |
201 |
android:textStyle="bold" /> |
202 |
|
203 |
<Button
|
204 |
android:id="@+id/btn3" |
205 |
android:layout_width="0dp" |
206 |
android:layout_height="match_parent" |
207 |
android:layout_margin="1dp" |
208 |
android:layout_weight="1" |
209 |
android:background="#ff000033" |
210 |
android:gravity="center" |
211 |
android:onClick="btnPressed" |
212 |
android:padding="5dp" |
213 |
android:tag="3" |
214 |
android:text="3" |
215 |
android:textColor="#ffffffff" |
216 |
android:textSize="30sp" |
217 |
android:textStyle="bold" /> |
218 |
</LinearLayout>
|
219 |
|
220 |
<LinearLayout
|
221 |
android:layout_width="fill_parent" |
222 |
android:layout_height="wrap_content" |
223 |
android:layout_weight="1" |
224 |
android:orientation="horizontal" > |
225 |
|
226 |
<Button
|
227 |
android:id="@+id/btn0" |
228 |
android:layout_width="0dp" |
229 |
android:layout_height="match_parent" |
230 |
android:layout_margin="1dp" |
231 |
android:layout_weight="1" |
232 |
android:background="#ff000033" |
233 |
android:gravity="center" |
234 |
android:onClick="btnPressed" |
235 |
android:padding="5dp" |
236 |
android:tag="0" |
237 |
android:text="0" |
238 |
android:textColor="#ffffffff" |
239 |
android:textSize="30sp" |
240 |
android:textStyle="bold" /> |
241 |
|
242 |
<Button
|
243 |
android:id="@+id/btnAgain" |
244 |
android:layout_width="0dp" |
245 |
android:layout_height="match_parent" |
246 |
android:layout_margin="1dp" |
247 |
android:layout_weight="1" |
248 |
android:background="#ffffff00" |
249 |
android:enabled="false" |
250 |
android:gravity="center" |
251 |
android:onClick="btnPressed" |
252 |
android:padding="5dp" |
253 |
android:tag="-1" |
254 |
android:text="Again" |
255 |
android:textColor="#ffffff00" |
256 |
android:textSize="30sp" |
257 |
android:textStyle="bold" /> |
258 |
</LinearLayout>
|
259 |
</LinearLayout>
|
260 |
</RelativeLayout>
|
261 |
|
262 |
<LinearLayout
|
263 |
android:id="@+id/play_buttons" |
264 |
android:layout_width="fill_parent" |
265 |
android:layout_height="wrap_content" |
266 |
android:layout_below="@id/gameArea" |
267 |
android:gravity="center" |
268 |
android:orientation="horizontal" > |
269 |
|
270 |
<!-- show achievements -->
|
271 |
|
272 |
<Button
|
273 |
android:id="@+id/show_achievements" |
274 |
android:layout_width="wrap_content" |
275 |
android:layout_height="wrap_content" |
276 |
android:text="Achievements" /> |
277 |
|
278 |
<!-- show leaderboards -->
|
279 |
|
280 |
<Button
|
281 |
android:id="@+id/show_leaderboard" |
282 |
android:layout_width="wrap_content" |
283 |
android:layout_height="wrap_content" |
284 |
android:text="Leaderboard" /> |
285 |
</LinearLayout>
|
286 |
|
287 |
</RelativeLayout>
|
Agregamos botones para acceder a los logros y tablas de clasificación de la aplicación. Si no has completado el tutorial de logros, puedes eliminar el botón de logros.
De regreso a la clase de Activity de tu aplicación, usaremos estas variables de instancia:
1 |
private Button button0, button1, button2, button3, button4, button5, |
2 |
button6, button7, button8, button9, buttonAgain; |
3 |
private int number; |
4 |
private Random rand; |
5 |
private TextView info; |
6 |
private int numGuesses=0; |
Si completaste el tutorial de logros, puedes observar una variable adicional, numGuesses, para realizar un seguimiento del número de conjeturas del usuario cada vez que juegan el juego.
Necesitarás el siguiente código adicional en el método onCreate de la clase Activity. Si no estás utilizando el botón de logros, elimina la línea que lo referencia.
1 |
findViewById(R.id.show_achievements).setOnClickListener(this); |
2 |
findViewById(R.id.show_leaderboard).setOnClickListener(this); |
3 |
|
4 |
button0=(Button)findViewById(R.id.btn0); |
5 |
button1=(Button)findViewById(R.id.btn1); |
6 |
button2=(Button)findViewById(R.id.btn2); |
7 |
button3=(Button)findViewById(R.id.btn3); |
8 |
button4=(Button)findViewById(R.id.btn4); |
9 |
button5=(Button)findViewById(R.id.btn5); |
10 |
button6=(Button)findViewById(R.id.btn6); |
11 |
button7=(Button)findViewById(R.id.btn7); |
12 |
button8=(Button)findViewById(R.id.btn8); |
13 |
button9=(Button)findViewById(R.id.btn9); |
14 |
buttonAgain=(Button)findViewById(R.id.btnAgain); |
15 |
|
16 |
info=(TextView)findViewById(R.id.guess_text); |
17 |
|
18 |
rand=new Random(); |
19 |
number=rand.nextInt(10); |
También usamos los siguientes métodos para deshabilitar y habilitar los botones durante el juego:
1 |
private void disableNumbers(){ |
2 |
button0.setEnabled(false); button0.setTextColor(Color.parseColor("#ff000033")); |
3 |
button1.setEnabled(false); button1.setTextColor(Color.parseColor("#ff000033")); |
4 |
button2.setEnabled(false); button2.setTextColor(Color.parseColor("#ff000033")); |
5 |
button3.setEnabled(false); button3.setTextColor(Color.parseColor("#ff000033")); |
6 |
button4.setEnabled(false); button4.setTextColor(Color.parseColor("#ff000033")); |
7 |
button5.setEnabled(false); button5.setTextColor(Color.parseColor("#ff000033")); |
8 |
button6.setEnabled(false); button6.setTextColor(Color.parseColor("#ff000033")); |
9 |
button7.setEnabled(false); button7.setTextColor(Color.parseColor("#ff000033")); |
10 |
button8.setEnabled(false); button8.setTextColor(Color.parseColor("#ff000033")); |
11 |
button9.setEnabled(false); button9.setTextColor(Color.parseColor("#ff000033")); |
12 |
buttonAgain.setEnabled(true); buttonAgain.setTextColor(Color.parseColor("#ff000033")); |
13 |
}
|
14 |
private void enableNumbers(){ |
15 |
button0.setEnabled(true); button0.setTextColor(Color.WHITE); |
16 |
button1.setEnabled(true); button1.setTextColor(Color.WHITE); |
17 |
button2.setEnabled(true); button2.setTextColor(Color.WHITE); |
18 |
button3.setEnabled(true); button3.setTextColor(Color.WHITE); |
19 |
button4.setEnabled(true); button4.setTextColor(Color.WHITE); |
20 |
button5.setEnabled(true); button5.setTextColor(Color.WHITE); |
21 |
button6.setEnabled(true); button6.setTextColor(Color.WHITE); |
22 |
button7.setEnabled(true); button7.setTextColor(Color.WHITE); |
23 |
button8.setEnabled(true); button8.setTextColor(Color.WHITE); |
24 |
button9.setEnabled(true); button9.setTextColor(Color.WHITE); |
25 |
buttonAgain.setEnabled(false); buttonAgain.setTextColor(Color.parseColor("#ffffff00")); |
26 |
}
|
También necesitamos el siguiente método que especificamos como atributo onClick para los botones numéricos en el diseño. El jugador toca uno de estos para hacer una suposición:
1 |
public void btnPressed(View v){ |
2 |
int btn = Integer.parseInt(v.getTag().toString()); |
3 |
if(btn<0){ |
4 |
//again btn
|
5 |
numGuesses=0; |
6 |
number=rand.nextInt(10); |
7 |
enableNumbers(); |
8 |
info.setText("Set the number!"); |
9 |
}
|
10 |
else{ |
11 |
//number button
|
12 |
numGuesses++; |
13 |
if(btn==number){ |
14 |
info.setText("Yes! It was "+number); |
15 |
if(getApiClient().isConnected()){ |
16 |
Games.Achievements.unlock(getApiClient(), |
17 |
getString(R.string.correct_guess_achievement)); |
18 |
Games.Leaderboards.submitScore(getApiClient(), |
19 |
getString(R.string.number_guesses_leaderboard), |
20 |
numGuesses); |
21 |
}
|
22 |
disableNumbers(); |
23 |
}
|
24 |
else if(numGuesses==5){ |
25 |
info.setText("No! It was "+number); |
26 |
disableNumbers(); |
27 |
}
|
28 |
else
|
29 |
info.setText("Try again!"); |
30 |
}
|
31 |
}
|
Toma un momento para revisar el código. Incluso si completaste la aplicación en el tutorial de logros, hay algunos cambios en la lógica, además del código adicional de la tabla de clasificación. Si el jugador toca el botón Nuevamente, reiniciamos la variable numGuesses a 0. Si el usuario toca un botón numérico, aumentamos el valor num. Si no estás utilizando logros, puedes eliminar cualquier código que haga referencia a los logros.
Sometemos el puntaje a la tabla de clasificación cuando el usuario adivinó correctamente. El usuario puede hacer hasta cinco conjeturas.
La línea clave aquí es submitScore. Pasamos el número de conjeturas que el jugador tomó para obtener el número correcto. Si el número de conjeturas es menor que cualquier entrada existente para el usuario en la tabla de clasificación, su entrada será reemplazada por este nuevo valor. Ten en cuenta que usamos el valor del recurso de cadena que definimos para la tabla de clasificación.
Paso 2
Antes de terminar, permitamos que el usuario vea la tabla de líderes del juego al tocar el botón Leaderboard que agregamos. Usamos el siguiente código en onClick para los logros:
1 |
else if (view.getId() == R.id.show_achievements){ |
2 |
startActivityForResult(Games.Achievements.getAchievementsIntent( |
3 |
getApiClient()), 1); |
4 |
}
|
La presentación de la clasificación es similar:
1 |
else if(view.getId() == R.id.show_leaderboard){ |
2 |
startActivityForResult(Games.Leaderboards.getLeaderboardIntent( |
3 |
getApiClient(), getString(R.string.number_guesses_leaderboard)), |
4 |
2); |
5 |
}
|
Esto permitirá al usuario ver la clasificación actual dentro de la tabla de clasificación. El parámetro entero es arbitrario.
Cuando ejecutas la aplicación, intentará iniciar sesión con el usuario, verificando los permisos y confirmando el inicio de sesión si es exitoso:



El usuario puede elegir cerrar la sesión y volver a ingresar cuando quiera, pero si abandona la aplicación, intentará volver a iniciar sesión automáticamente cuando la abra nuevamente. Cuando el usuario adivine correctamente, su puntaje se enviará a la tabla de clasificación. Al presionar el botón Leaderboard se mostrarán las clasificaciones actuales:



Desde aquí, el usuario puede acceder a las características sociales de los Servicios de Google a través de su cuenta de Google. Puedes configurar tus aplicaciones para usar tablas de clasificación públicas y sociales. Las tablas de clasificación sociales presentan listas de personas en los círculos del usuario, que se pueden administrar para el juego en sí. Para una clasificación pública, el usuario debe haber optado por compartir sus puntajes públicamente.
Conclusión
En este tutorial, hemos implementado la funcionalidad básica de una tabla de clasificación con Google Play Game Services. Ten en cuenta que puedes hacer mucho más con las tablas de clasificación en tus aplicaciones. Por ejemplo, puedes solicitar los datos de la tabla de clasificación para escalas de tiempo particulares, como diariamente, semanalmente y desde el orígen de todos los tiempos. Si una tabla de clasificación contiene muchos puntajes, es posible que tu aplicación solo obtenga los puntajes más altos o los puntajes más cercanos al jugador actual. Intenta experimentar con algunas de estas mejoras en tus propias aplicaciones.



