Google Play Game Services: Logros
Spanish (Español) translation by CYC (you can also view the original English article)
Con los servicios de juegos de Google Play, puedes crear una variedad de funciones en tus aplicaciones de Android, incluidas las tablas de clasificación, los logros, la jugabilidad multijugador, el almacenamiento en la nube y el inicio de sesión de Google+.
En este tutorial vamos a seguir los pasos que debes seguir para agregar logros a un simple juego de Android. Prepararemos el entorno de desarrollo para utilizar los Servicios de juego de Google Play, definiremos un logro en la Consola de desarrollador e implementaremos la interacción de logro en el juego.
1. Prepara tu IDE
Paso 1
Para utilizar las herramientas de servicios de juegos de Google Play, debemos preparar nuestro IDE. Además de utilizar la biblioteca de Servicios de Google Play, que necesitas para todos los servicios de Google, utilizaremos el recurso BaseGameUtils, que contiene una serie de clases que son particularmente útiles al desarrollar juegos.
Comienza creando una nueva aplicación en tu IDE. El código de muestra de este tutorial contiene un juego simple en el que el usuario tiene que adivinar un número elegido al azar. Puedes usar ese proyecto para comenzar a desarrollar con Google Play Game Services si lo deseas. Crea un nuevo proyecto de Android y elige nombres y configuraciones para él.
Si no estás utilizando la aplicación de muestra en la descarga, es posible que desees implementar tu juego en este punto, teniendo en cuenta para qué vas a utilizar un logro. Para la aplicación de ejemplo, simplemente otorgaremos un logro cuando el usuario elija una respuesta correcta.
Paso 2
En este paso, obtenemos el IDE y nuestro proyecto listos para usar los servicios de Google Play Games y las utilidades. Abre tu Administrador de Android SDK, que puedes encontrar en el menú Ventana en Eclipse. Desplázate hacia abajo hasta que veas la carpeta Extras, amplíala y selecciona Servicios de Google Play y el Repositorio de Google. También puedes necesitar la Plataforma API de Google si planeas probar en el emulador, por lo que también debes seleccionarla. Puedes encontrar este último en los directorios de versiones recientes de la plataforma Android. Instala los paquetes seleccionados, aceptando cualquier licencia según sea necesario.
Paso 3
También debemos incluir un par de recursos en el espacio de trabajo real para que podamos hacer referencia a ellos en la aplicación, comenzando con la Biblioteca de servicios de Google Play. Debes encontrarlo en /extras/google/google_play_services/libproject/google-play-services_lib/ en tu carpeta SDK. Haz una copia de la biblioteca y pégala en otra ubicación en tu computadora.
De vuelta en Eclipse, importa la biblioteca seleccionando Importar > Android > Importar código de Android existente en el espacio de trabajo en el menú Archivo. Busca la ubicación en la que copiaste la biblioteca, selecciona la biblioteca e impórtalo. La biblioteca debe aparecer como un proyecto en tu Eclipse Package Explorer y área de trabajo.
Haz clic con el botón derecho en el proyecto de la biblioteca en Eclipse, selecciona Propiedades y busca la sección de Android. Selecciona un objetivo de compilación de las API de Google y asegúrate de que esté marcado Is Library. La biblioteca ahora debe estar lista para hacer referencia en tu aplicación.
Paso 4
Ahora también consigamos el recurso BaseGameUtils en tu IDE. Descárgalo de la sección Juegos de muestra del portal para desarrolladores de Google. Dado que el código está alojado en GitHub, puedes navegar y acceder a sus guías en GitHub.
Importa el recurso BaseGameUtils en Eclipse utilizando la misma técnica que utilizaste para la Biblioteca de servicios de reproducción seleccionando Importar > Android > Importar código de Android existente en el espacio de trabajo en el menú Archivo. Haz clic con el botón derecho en el proyecto BaseGameUtils en tu Package Explorer y asegúrate de que esté marcado Is Library.
Ahora podemos hacer referencia tanto a la Biblioteca de servicios de Google Play como a los recursos de BaseGameUtils en nuestra aplicación.
Paso 5
Selecciona tu aplicación de juego en Eclipse Package Explorer, haz clic con el botón derecho y elige Propiedades como lo hiciste para los recursos importados. En la sección Android, esta vez, haz clic en Agregar en el área Biblioteca. Selecciona la biblioteca de Servicios de Google Play y BaseGameUtils para agregar como bibliotecas a tu proyecto.
Ese es el IDE configurado para desarrollar con Games Services.
2. Prepara tu juego en la consola de desarrollo
Paso 1
Para utilizar los logros en tu juego, debes agregar el juego a Google Play Developer Console. Inicia sesión en Developer Console, haz clic en el botón Servicios de juegos a la izquierda de la consola y selecciona Configurar servicios de juegos de Google Play si no los has usado anteriormente.



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



En la sección Detalles del juego, todo lo que necesitas agregar para probar tu aplicación es el título de tu juego.
Paso 2
Haz clic en Aplicaciones vinculadas a la izquierda de tu lista de juegos en Developer Console. Selecciona Android de la lista de aplicaciones vinculadas.



Ingresa los detalles de tu aplicación, incluido el nombre del paquete que elegiste cuando lo creaste.



Haz clic en Guardar y continúa en la parte superior y elige Autorizar tu aplicación ahora. Se te pedirá que ingreses la información de marca. Todo lo que necesitas por el momento es el nombre de tu aplicación. En la pantalla Configuración de Client ID, selecciona Aplicación instalada como tipo, Android como el tipo de aplicación instalada e ingresa el nombre de tu paquete.
Luego debes generar una huella digital de certificado de firma para autorización. Necesitarás ejecutar la utilidad keytool en tu computadora para hacer esto. Abre una terminal o símbolo del sistema y usa el siguiente comando, pero asegúrate de modificarlo para adaptarlo a la ubicación si es necesario. Puedes usar el certificado de depuración mientras pruebas.
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -list -v
La herramienta de claves debe escribir la huella digital del certificado. Selecciona y copia lo que aparece después de SHA1 y pégalo en Developer Console debajo de Firmar huella digital del certificado. Haz clic en Crear cliente y copia el ID de la aplicación que ves en el listado de tu juego en Developer Console, que debe mostrarse junto al nombre del juego en la parte superior de la página. Guarda el ID de la aplicación para usarla más adelante en tu aplicación.
3. Crea un logro
Paso 1
Aún en Developer Console, haz clic en el botón Achievements a la izquierda de la lista de juegos y haz clic en Agregar logro.



Antes de continuar, es posible que desees consultar la página de logros en la Guía del Desarrollador para asegurarte de comprender el concepto de logro en Google Play Games. Ingresa un nombre, una descripción y un ícono para yu logro y elige un estado, puntos y un orden de la lista. Para nuestro juego de ejemplo, usamos Adivinado correctamente como nombre, Escogido un número correcto como la descripción, y una imagen de estrella simple como el ícono. Haz clic en Guardar para guardar el logro.



Copia la identificación del logro, que puedes ver junto al logro en Developer Console.
Paso 2
Si navegas a la sección Pruebas de tu juego, puedes establecer direcciones de correo electrónico para las personas que tendrán acceso de prueba al juego. De forma predeterminada, Developer Console insertará tu propio correo electrónico de la cuenta de Google, por lo que deberías poder utilizarlo de inmediato. Agrega cualquier otro correo electrónico de prueba que necesites, luego puedes cerrar sesión en tu cuenta de Google.
4. Prepara tu juego para acceder a los servicios de juegos
Paso 1
En Eclipse, podemos preparar la aplicación para acceder a los Servicios de juegos. Vamos a utilizar la técnica descrita en la Implementación de inicio de sesión en Android para gestionar el ingreso y la salida de usuarios de sus cuentas de Google. Esto implicará el uso de botones para iniciar o cerrar sesión, así que agrégalos al diseño de tu aplicación de la siguiente manera:
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 2
Altera tu actividad principal para extender BaseGameActivity. Esto nos permitirá automatizar ciertas partes del proceso de inicio de sesión para tus usuarios. También haz que la clase Activity maneje los clics:
1 |
public class MainActivity extends BaseGameActivity implements View.OnClickListener |
Necesitarás las siguientes importaciones:
1 |
import com.google.android.gms.games.Games; |
2 |
import com.google.example.games.basegameutils.BaseGameActivity; |
Ahora recupera las referencias a los botones en onCreate:
1 |
findViewById(R.id.sign_in_button).setOnClickListener(this); |
2 |
findViewById(R.id.sign_out_button).setOnClickListener(this); |
Responderemos a los toques de botón en onClick como puedes ver a continuación:
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 |
}
|
Usamos métodos de la clase BaseGameActivity que estamos ampliando para manejar el inicio de sesión (beginUserInitiatedSignIn y signOut), actualizando la interfaz de usuario en consecuencia. Cuando se inicia la aplicación, intentará iniciar sesión automáticamente en el usuario, pero también podrán usar los botones para iniciar o cerrar sesión.
Ahora tenemos que agregar dos devoluciones de llamada a nuestra clase Activity:
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 |
}
|
Puedes agregar más código a estos si es necesario. También puedes optar por guardar el progreso del jugador, incluso si no han iniciado sesión, pero esto depende de tu juego. En la aplicación de muestra, tomamos el enfoque simple de verificar que tenemos una conexión con los Servicios de Google antes de intentar trabajar con el logro.
Paso 3
Antes de comenzar a codificar los detalles del uso de los logros en tu aplicación, debes agregarle algunos datos. Comienza abriendo o creando tu archivo res/values/ids.xml y agrega recursos de cadena para la aplicación y los ID de logros que copiaste de Developer Console:
1 |
<string name="app_id">abcdefghij</string> |
2 |
<string name="correct_guess_achievement">abcdefghijkl</string> |
Actualiza el contenido para reflejar sus valores de ID. Ahora abre el Manifiesto del proyecto y agrega lo siguiente dentro del elemento de la aplicación:
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" /> |
Hacemos referencia al ID de la aplicación que agregamos al archivo ids y la versión de Play Services. Esto es todo lo que necesitas para comenzar a codificar con tus logros.
5. Implementa tu logro
Paso 1
Todo lo que queda ahora es desbloquear el logro cuando el jugador cumple con los requisitos del logro. Naturalmente, esto dependerá del propósito de tu propio juego, pero si deseas llevar a cabo el proceso utilizando la aplicación de ejemplo de este tutorial, puedes usar el siguiente código. Comenzamos con el diseño principal, que incluye los botones de inicio y finalización que agregamos anteriormente:
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 |
|
34 |
<!-- show achievements -->
|
35 |
|
36 |
<Button
|
37 |
android:id="@+id/show_achievements" |
38 |
android:layout_width="wrap_content" |
39 |
android:layout_height="wrap_content" |
40 |
android:text="Achievements" /> |
41 |
|
42 |
</LinearLayout>
|
43 |
|
44 |
<RelativeLayout
|
45 |
android:layout_width="fill_parent" |
46 |
android:layout_height="wrap_content" |
47 |
android:layout_below="@id/sign_in_buttons" > |
48 |
|
49 |
<TextView
|
50 |
android:id="@+id/guess_text" |
51 |
android:layout_width="fill_parent" |
52 |
android:layout_height="wrap_content" |
53 |
android:layout_centerHorizontal="true" |
54 |
android:text="Guess the number!" |
55 |
android:textSize="30sp" |
56 |
android:textStyle="bold" /> |
57 |
|
58 |
<LinearLayout
|
59 |
android:layout_width="fill_parent" |
60 |
android:layout_height="wrap_content" |
61 |
android:layout_below="@id/guess_text" |
62 |
android:orientation="vertical" > |
63 |
|
64 |
<LinearLayout
|
65 |
android:layout_width="fill_parent" |
66 |
android:layout_height="wrap_content" |
67 |
android:orientation="horizontal" > |
68 |
|
69 |
<Button
|
70 |
android:id="@+id/btn7" |
71 |
android:layout_width="0dp" |
72 |
android:layout_height="match_parent" |
73 |
android:layout_margin="1dp" |
74 |
android:layout_weight="1" |
75 |
android:background="#ff000033" |
76 |
android:gravity="center" |
77 |
android:onClick="btnPressed" |
78 |
android:padding="5dp" |
79 |
android:tag="7" |
80 |
android:text="7" |
81 |
android:textColor="#ffffffff" |
82 |
android:textSize="30sp" |
83 |
android:textStyle="bold" /> |
84 |
|
85 |
<Button
|
86 |
android:id="@+id/btn8" |
87 |
android:layout_width="0dp" |
88 |
android:layout_height="match_parent" |
89 |
android:layout_margin="1dp" |
90 |
android:layout_weight="1" |
91 |
android:background="#ff000033" |
92 |
android:gravity="center" |
93 |
android:onClick="btnPressed" |
94 |
android:padding="5dp" |
95 |
android:tag="8" |
96 |
android:text="8" |
97 |
android:textColor="#ffffffff" |
98 |
android:textSize="30sp" |
99 |
android:textStyle="bold" /> |
100 |
|
101 |
<Button
|
102 |
android:id="@+id/btn9" |
103 |
android:layout_width="0dp" |
104 |
android:layout_height="match_parent" |
105 |
android:layout_margin="1dp" |
106 |
android:layout_weight="1" |
107 |
android:background="#ff000033" |
108 |
android:gravity="center" |
109 |
android:onClick="btnPressed" |
110 |
android:padding="5dp" |
111 |
android:tag="9" |
112 |
android:text="9" |
113 |
android:textColor="#ffffffff" |
114 |
android:textSize="30sp" |
115 |
android:textStyle="bold" /> |
116 |
</LinearLayout>
|
117 |
|
118 |
<LinearLayout
|
119 |
android:layout_width="fill_parent" |
120 |
android:layout_height="wrap_content" |
121 |
android:layout_weight="1" |
122 |
android:orientation="horizontal" > |
123 |
|
124 |
<Button
|
125 |
android:id="@+id/btn4" |
126 |
android:layout_width="0dp" |
127 |
android:layout_height="match_parent" |
128 |
android:layout_margin="1dp" |
129 |
android:layout_weight="1" |
130 |
android:background="#ff000033" |
131 |
android:gravity="center" |
132 |
android:onClick="btnPressed" |
133 |
android:padding="5dp" |
134 |
android:tag="4" |
135 |
android:text="4" |
136 |
android:textColor="#ffffffff" |
137 |
android:textSize="30sp" |
138 |
android:textStyle="bold" /> |
139 |
|
140 |
<Button
|
141 |
android:id="@+id/btn5" |
142 |
android:layout_width="0dp" |
143 |
android:layout_height="match_parent" |
144 |
android:layout_margin="1dp" |
145 |
android:layout_weight="1" |
146 |
android:background="#ff000033" |
147 |
android:gravity="center" |
148 |
android:onClick="btnPressed" |
149 |
android:padding="5dp" |
150 |
android:tag="5" |
151 |
android:text="5" |
152 |
android:textColor="#ffffffff" |
153 |
android:textSize="30sp" |
154 |
android:textStyle="bold" /> |
155 |
|
156 |
<Button
|
157 |
android:id="@+id/btn6" |
158 |
android:layout_width="0dp" |
159 |
android:layout_height="match_parent" |
160 |
android:layout_margin="1dp" |
161 |
android:layout_weight="1" |
162 |
android:background="#ff000033" |
163 |
android:gravity="center" |
164 |
android:onClick="btnPressed" |
165 |
android:padding="5dp" |
166 |
android:tag="6" |
167 |
android:text="6" |
168 |
android:textColor="#ffffffff" |
169 |
android:textSize="30sp" |
170 |
android:textStyle="bold" /> |
171 |
|
172 |
</LinearLayout>
|
173 |
|
174 |
<LinearLayout
|
175 |
android:layout_width="fill_parent" |
176 |
android:layout_height="wrap_content" |
177 |
android:layout_weight="1" |
178 |
android:orientation="horizontal" > |
179 |
|
180 |
<Button
|
181 |
android:id="@+id/btn1" |
182 |
android:layout_width="0dp" |
183 |
android:layout_height="match_parent" |
184 |
android:layout_margin="1dp" |
185 |
android:layout_weight="1" |
186 |
android:background="#ff000033" |
187 |
android:gravity="center" |
188 |
android:onClick="btnPressed" |
189 |
android:padding="5dp" |
190 |
android:tag="1" |
191 |
android:text="1" |
192 |
android:textColor="#ffffffff" |
193 |
android:textSize="30sp" |
194 |
android:textStyle="bold" /> |
195 |
|
196 |
<Button
|
197 |
android:id="@+id/btn2" |
198 |
android:layout_width="0dp" |
199 |
android:layout_height="match_parent" |
200 |
android:layout_margin="1dp" |
201 |
android:layout_weight="1" |
202 |
android:background="#ff000033" |
203 |
android:gravity="center" |
204 |
android:onClick="btnPressed" |
205 |
android:padding="5dp" |
206 |
android:tag="2" |
207 |
android:text="2" |
208 |
android:textColor="#ffffffff" |
209 |
android:textSize="30sp" |
210 |
android:textStyle="bold" /> |
211 |
|
212 |
<Button
|
213 |
android:id="@+id/btn3" |
214 |
android:layout_width="0dp" |
215 |
android:layout_height="match_parent" |
216 |
android:layout_margin="1dp" |
217 |
android:layout_weight="1" |
218 |
android:background="#ff000033" |
219 |
android:gravity="center" |
220 |
android:onClick="btnPressed" |
221 |
android:padding="5dp" |
222 |
android:tag="3" |
223 |
android:text="3" |
224 |
android:textColor="#ffffffff" |
225 |
android:textSize="30sp" |
226 |
android:textStyle="bold" /> |
227 |
|
228 |
</LinearLayout>
|
229 |
|
230 |
<LinearLayout
|
231 |
android:layout_width="fill_parent" |
232 |
android:layout_height="wrap_content" |
233 |
android:layout_weight="1" |
234 |
android:orientation="horizontal" > |
235 |
|
236 |
<Button
|
237 |
android:id="@+id/btn0" |
238 |
android:layout_width="0dp" |
239 |
android:layout_height="match_parent" |
240 |
android:layout_margin="1dp" |
241 |
android:layout_weight="1" |
242 |
android:background="#ff000033" |
243 |
android:gravity="center" |
244 |
android:onClick="btnPressed" |
245 |
android:padding="5dp" |
246 |
android:tag="0" |
247 |
android:text="0" |
248 |
android:textColor="#ffffffff" |
249 |
android:textSize="30sp" |
250 |
android:textStyle="bold" /> |
251 |
|
252 |
<Button
|
253 |
android:id="@+id/btnAgain" |
254 |
android:layout_width="0dp" |
255 |
android:layout_height="match_parent" |
256 |
android:layout_margin="1dp" |
257 |
android:layout_weight="1" |
258 |
android:background="#ffffff00" |
259 |
android:enabled="false" |
260 |
android:gravity="center" |
261 |
android:onClick="btnPressed" |
262 |
android:padding="5dp" |
263 |
android:tag="-1" |
264 |
android:text="Again" |
265 |
android:textColor="#ffffff00" |
266 |
android:textSize="30sp" |
267 |
android:textStyle="bold" /> |
268 |
|
269 |
</LinearLayout>
|
270 |
</LinearLayout>
|
271 |
</RelativeLayout>
|
272 |
|
273 |
</RelativeLayout>
|
Ten en cuenta que también incluimos un botón de Logros junto a los botones para iniciar y cerrar sesión. Implementaremos ese botón más tarde. No vamos a entrar en demasiados detalles sobre el juego de muestra, si ya has completado incluso aplicaciones simples, esto no debería ser demasiado difícil.
El juego selecciona un número aleatorio entre 0 y 9, y el jugador puede elegir un botón numérico para hacer una suposición. El juego actualiza el campo de texto para reflejar si el usuario adivinó correctamente o no. Si se hace una conjetura correcta, el logro se desbloquea.
Paso 2
Regresa a tu clase Activity y agrega las siguientes 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; |
Estos representan los botones, el número, el generador de números aleatorios y el campo de texto. Agrega lo siguiente a tu método onCreate:
1 |
findViewById(R.id.show_achievements).setOnClickListener(this); |
2 |
|
3 |
button0=(Button)findViewById(R.id.btn0); |
4 |
button1=(Button)findViewById(R.id.btn1); |
5 |
button2=(Button)findViewById(R.id.btn2); |
6 |
button3=(Button)findViewById(R.id.btn3); |
7 |
button4=(Button)findViewById(R.id.btn4); |
8 |
button5=(Button)findViewById(R.id.btn5); |
9 |
button6=(Button)findViewById(R.id.btn6); |
10 |
button7=(Button)findViewById(R.id.btn7); |
11 |
button8=(Button)findViewById(R.id.btn8); |
12 |
button9=(Button)findViewById(R.id.btn9); |
13 |
buttonAgain=(Button)findViewById(R.id.btnAgain); |
14 |
|
15 |
info=(TextView)findViewById(R.id.guess_text); |
16 |
rand=new Random(); |
17 |
number=rand.nextInt(10); |
Ahora agrega un método llamado disableNumbers, que llamaremos cuando el usuario haga una selección numérica:
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 |
}
|
Implementa otro método, enableNumbers, que se invoca cuando el usuario ha elegido jugar de nuevo:
1 |
private void enableNumbers(){ |
2 |
button0.setEnabled(true); button0.setTextColor(Color.WHITE); |
3 |
button1.setEnabled(true); button1.setTextColor(Color.WHITE); |
4 |
button2.setEnabled(true); button2.setTextColor(Color.WHITE); |
5 |
button3.setEnabled(true); button3.setTextColor(Color.WHITE); |
6 |
button4.setEnabled(true); button4.setTextColor(Color.WHITE); |
7 |
button5.setEnabled(true); button5.setTextColor(Color.WHITE); |
8 |
button6.setEnabled(true); button6.setTextColor(Color.WHITE); |
9 |
button7.setEnabled(true); button7.setTextColor(Color.WHITE); |
10 |
button8.setEnabled(true); button8.setTextColor(Color.WHITE); |
11 |
button9.setEnabled(true); button9.setTextColor(Color.WHITE); |
12 |
buttonAgain.setEnabled(false); buttonAgain.setTextColor(Color.parseColor("#ffffff00")); |
13 |
}
|
Ahora agrega el método que configuramos como atributo onClick para los botones:
1 |
public void btnPressed(View v){ |
2 |
int btn = Integer.parseInt(v.getTag().toString()); |
3 |
if(btn<0){ |
4 |
//again btn
|
5 |
number=rand.nextInt(10); |
6 |
enableNumbers(); |
7 |
info.setText("Guess the number!"); |
8 |
}
|
9 |
else{ |
10 |
//number button
|
11 |
if(btn==number){ |
12 |
info.setText("Yes! It was "+number); |
13 |
if(getApiClient().isConnected()) |
14 |
Games.Achievements.unlock(getApiClient(), |
15 |
getString(R.string.correct_guess_achievement)); |
16 |
}
|
17 |
else{ |
18 |
info.setText("No! It was "+number); |
19 |
}
|
20 |
disableNumbers(); |
21 |
}
|
22 |
}
|
Llamamos a la utilidad Games Achievements para desbloquear el logro si la conjetura del usuario fue correcta, primero verificando que tenemos una conexión. Nos referimos al logro utilizando el recurso de cadena que creamos.
Por último, permitamos al usuario ver sus logros para el juego. Esto sucederá cuando hagan clic en el botón Logros que agregamos. Extiende el código en el método onClick, agregando un else-if adicional:
1 |
else if (view.getId() == R.id.show_achievements){ |
2 |
startActivityForResult(Games.Achievements.getAchievementsIntent( |
3 |
getApiClient()), 1); |
4 |
}
|
Usamos el método getAchievementsIntent con un número entero arbitrario para mostrar los logros del usuario dentro del juego. Al presionar el botón Atrás, el jugador volverá al juego. Para obtener más información sobre los métodos de logros, consulta la página Logros en Android en la Guía del desarrollador.
Paso 3
Deberías poder ejecutar tu aplicación en este punto. Cuando la aplicación se ejecuta, iniciará la autorización del usuario y el proceso de inicio de sesión, lo que le pedirá al usuario que otorgue los permisos necesarios.



Una vez que haya iniciado sesión, el usuario verá una confirmación.



El usuario puede elegir cerrar la sesión y volver a ingresar cuando lo desee. Cuando el usuario selecciona un número correcto, el logro se desbloquea y se muestra en la parte superior de la pantalla del juego.



El jugador puede continuar de forma normal. Al hacer clic en el botón Logros, se mostrarán sus logros. Al tocar el botón Atrás, el jugador volverá al juego.



Conclusión
En este tutorial, hemos explorado un ejemplo práctico del uso de los logros en una aplicación de Android. La aplicación de ejemplo que utilizamos es simple, pero los mismos principios se aplican a cualquier juego con el que estés trabajando. Intenta agregar otro logro a Developer Console e impleméntalo en tu juego para asegurarte de que comprendes los conceptos y procesos.



