Battlex: Juego de estrategia por turnos basado en

Anuncio
UNIVERSIDAD DE CASTILLA-LA MANCHA
ESCUELA SUPERIOR DE INFORMÁTICA
GRADO EN INGENIERÍA INFORMÁTICA
TECNOLOGÍA ESPECÍFICA DE
TECNOLOGÍAS Y SISTEMAS DE INFORMACIÓN
TRABAJO FIN DE GRADO
Battlex: Juego de estrategia por turnos basado en
comunicación asíncrona para plataforma iOS
Miguel Ángel Aragonés Castañeda
Septiembre, 2014
UNIVERSIDAD DE CASTILLA-LA MANCHA
ESCUELA SUPERIOR DE INFORMÁTICA
Tecnologías y Sistemas de Información
TECNOLOGÍA ESPECÍFICA DE
TECNOLOGÍAS Y SISTEMAS DE INFORMACIÓN
TRABAJO FIN DE GRADO
Battlex: Juego de estrategia por turnos basado en
comunicación asíncrona para plataforma iOS
Autor: Miguel Ángel Aragonés Castañeda
Director: Dr. Ramón Hervás Lucas
Septiembre, 2014
Miguel Ángel Aragonés Castañeda
Ciudad Real – Spain
E-mail:
[email protected]
c 2014 Miguel Ángel Aragonés Castañeda
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU
Free Documentation License, Version 1.3 or any later version published by the Free Software
Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy
of the license is included in the section entitled "GNU Free Documentation License".
Se permite la copia, distribución y/o modificación de este documento bajo los términos de la
Licencia de Documentación Libre GNU, versión 1.3 o cualquier versión posterior publicada por
la Free Software Foundation; sin secciones invariantes. Una copia de esta licencia esta incluida en
el apéndice titulado «GNU Free Documentation License».
Muchos de los nombres usados por las compañías para diferenciar sus productos y servicios son
reclamados como marcas registradas. Allí donde estos nombres aparezcan en este documento, y
cuando el autor haya sido informado de esas marcas registradas, los nombres estarán escritos en
mayúsculas o como nombres propios.
i
TRIBUNAL:
Presidente:
Vocal:
Secretario:
FECHA DE DEFENSA:
CALIFICACIÓN:
PRESIDENTE
Fdo.:
VOCAL
SECRETARIO
Fdo.:
Fdo.:
iii
Resumen
Hoy en día todo el mundo posee un smartphone y gracias a ellos los videojuegos sociales
se están extendiendo cada vez más y más. Las redes sociales o aplicaciones de comunicación
ocupan la mayor parte del tiempo de uso de estos dispositivos, aunque las aplicaciones de
ocio las siguen muy de cerca. Podemos comunicarnos directamente con aplicaciones sociales, a través de retos en videojuegos de ámbito social u otras que miden nuestra actividad y
realizan estadísticas con respecto a la de nuestros conocidos.
Aprovechando esas tecnologías, el presente trabajo pretende crear un videojuego asíncrono para plataforma iOS, heredando la temática de los juegos de estrategia basados en
conquista de territorios. De este modo Battlex podrá ser jugado por todos los usuarios de
iOS para disfrutar de partidas en modo multijugador asíncrono, con otras personas. Entonces
entrará en la categoría de juegos móviles sociales.
V
Abstract
Nowadays everyone has a smartphone, and thanks to them the social games are spreading
more and more. Social networking and communication applications take up most of the
time to use these devices, although the entertainment applications closely follow. We can
communicate directly with social applications through challenges in video games or other
social area measuring and conduct our activity with respect to statistics people we know.
Taking advantage of these technologies, this paper intends to create an asynchronous game
for iOS platform, inheriting themed strategy games based on territorial conquest. In this way
Battlex can be played by all users to enjoy iOS asynchronous multiplayer games with others.
Then enter into the category of social mobile games.
VII
Agradecimientos
A mi madre, que por circunstancias de la vida, nos ha tenido que educar ella sola, a mi
hermana y a mí y a pesar de ello nos ha dado una gran educación.
A mi hermana, porque gran parte de lo que soy es gracias a ella.
A mi padre, que nos dejó demasiado pronto, a quien llevo siempre conmigo.
A mi novia, que tanto me ha ayudado en el día a día y que tanta paciencia tiene siempre
conmigo.
A mis amigos y todas las personas que me quieren, porque también han puesto luz en el
camino.
A mis compañeros de trabajo, por los buenos consejos me dan todos los días.
Y Por último, pero no por ello menos importante, a mi director Ramón Hervás, por ayudarme a hacer un sueño realidad con su apoyo en este trabajo, por su paciencia y el trato
cercano que siempre ha tenido conmigo.
Miguel Ángel
IX
"La paciencia es un árbol de raíz amarga pero de frutos muy dulces"
xi
Índice general
Resumen
V
Abstract
VII
Agradecimientos
IX
Índice general
XIII
Índice de cuadros
XVII
Índice de figuras
XIX
Índice de listados
XXIII
Listado de acrónimos
XXV
1. Introducción
1
1.1. Contexto del TFG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.1.1. Contexto de la Computación Móvil . . . . . . . . . . . . . . . . .
1
1.1.2. Contexto de la Computación en la Nube . . . . . . . . . . . . . . .
1
1.1.3. Contexto de la Interacción Persona-Computador . . . . . . . . . .
2
1.1.4. Contexto de la Ludología . . . . . . . . . . . . . . . . . . . . . . .
2
1.2. Problema y solución propuesta . . . . . . . . . . . . . . . . . . . . . . . .
3
1.2.1. Descripción del problema . . . . . . . . . . . . . . . . . . . . . .
3
1.2.2. Solución propuesta . . . . . . . . . . . . . . . . . . . . . . . . . .
3
1.2.3. Estructura de la memoria . . . . . . . . . . . . . . . . . . . . . . .
5
2. Objetivos
7
2.1. Objetivo general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.2. Objetivos específicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.3. Objetivos operativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
XIII
2.3.1. Analizar y seleccionar los lenguajes y frameworks gráficos óptimos
para el TFG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.3.2. Analizar, definir y adaptar las reglas del juego a desarrollar asegurando la jugabilidad del proyecto . . . . . . . . . . . . . . . . . . .
8
2.3.3. Diseñar e implementar escenas del juego . . . . . . . . . . . . . .
8
2.3.4. Diseñar e implementar la interfaz de usuario . . . . . . . . . . . .
8
2.3.5. Implementar el sistemas de persistencia de datos del juego . . . . .
8
2.3.6. Diseñar e implementar el sistema de notificaciones del juego . . . .
8
2.4. Herramientas utilizadas . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.4.1. Lenguajes de programación y sistema operativo . . . . . . . . . . .
9
2.4.2. Medios Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
2.4.3. Medios Software . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
3. Estado del arte
15
3.1. Juegos de Estrategia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
3.1.1. Poker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
3.1.2. Poker de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
3.1.3. Risk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
3.2. Aplicaciones Asíncronas . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
3.2.1. Apalabrados . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
3.2.2. Mezcladitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
3.2.3. Preguntados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
3.2.4. Triviados o Atríviate . . . . . . . . . . . . . . . . . . . . . . . . .
23
3.2.5. Enumerados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
3.2.6. Temporis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
3.3. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
3.3.1. Integradas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
3.3.2. No integradas . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30
3.3.3. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
4. Método de Trabajo
33
4.1. Metodología de Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . .
33
4.1.1. Programación Extrema . . . . . . . . . . . . . . . . . . . . . . . .
33
4.1.2. Historias de Usuario . . . . . . . . . . . . . . . . . . . . . . . . .
34
4.2. Desarrollo del proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
4.2.1. Diseño de la Interfaz de Usuario . . . . . . . . . . . . . . . . . . .
35
4.2.2. Arquitectura de la aplicación . . . . . . . . . . . . . . . . . . . . .
39
xiv
4.3. Evolución del proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
4.3.1. 1a Etapa: Definición general y Anteproyecto . . . . . . . . . . . . .
48
4.3.2. 2a Etapa: Estudio previo . . . . . . . . . . . . . . . . . . . . . . .
48
4.3.3. 3a Etapa: Implementación . . . . . . . . . . . . . . . . . . . . . .
49
4.3.4. 4a Etapa: Documentación . . . . . . . . . . . . . . . . . . . . . . .
53
4.4. Pruebas Realizadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
4.4.1. Pruebas de Compatibilidad . . . . . . . . . . . . . . . . . . . . . .
53
4.4.2. Pruebas de Jugabilidad . . . . . . . . . . . . . . . . . . . . . . . .
55
4.4.3. Pruebas de Funcionalidad . . . . . . . . . . . . . . . . . . . . . .
58
5. Resultado y Conclusiones
63
5.1. Resultado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
63
5.2. Aspectos Generales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
5.2.1. Adaptación de las reglas originales para crear una aplicación
asíncrona . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
5.3. Objetivos Alcanzados . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
5.3.1. Objetivos Específicos . . . . . . . . . . . . . . . . . . . . . . . . .
67
5.3.2. Objetivos Operativos . . . . . . . . . . . . . . . . . . . . . . . . .
68
5.4. Limitaciones encontradas . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
5.5. Trabajo Futuro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
5.6. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
A. Parse
75
A.1. Registro y Configuración . . . . . . . . . . . . . . . . . . . . . . . . . . .
75
A.2. Panel de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
A.2.1. Clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
A.2.2. Relaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
A.2.3. Ventajas e Inconvenientes . . . . . . . . . . . . . . . . . . . . . .
78
B. Manual de Usuario
81
B.1. Registro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
81
B.2. Identificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
82
B.3. Menú Partidas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
83
B.3.1. Opciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
83
B.3.2. Nueva Partida . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
84
B.3.3. Partidas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
84
B.4. Situar Refuerzos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
85
xv
B.5. Configurar Ataque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
86
B.6. Fortificar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
88
C. Proyectos de Prueba
89
C.1. Base de Datos: SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . .
89
C.2. Prueba de registro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
90
C.2.1. Interfaz de Usuario . . . . . . . . . . . . . . . . . . . . . . . . . .
91
C.2.2. Registro en base de datos . . . . . . . . . . . . . . . . . . . . . . .
91
D. Formulario del Test de Jugabilidad
93
Referencias
97
xvi
Índice de cuadros
2.1. Game Engines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
4.1. Estilo NavigationBar iOS6 frente iOS7 . . . . . . . . . . . . . . . . . . . .
36
XVII
Índice de figuras
1.1. Ilustración de computación en la nube utilizando dispositivos móviles . . .
2
2.1. Descargas frente a Beneficios . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.2. Descargas por categoría . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
2.3. Apple iPhone 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
2.4. iPad Air . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
2.5. Capas de las que se compone Cocoa Touch . . . . . . . . . . . . . . . . .
12
2.6. XCode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
3.1. Combinaciones de Poker . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
3.2. Tablero de Risk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
3.3. Apalabrados, nuevo juego y perfil de usuario . . . . . . . . . . . . . . . . .
18
3.4. Apalabrados, tablero de juego . . . . . . . . . . . . . . . . . . . . . . . .
19
3.5. Apalabrados, redes sociales . . . . . . . . . . . . . . . . . . . . . . . . . .
19
3.6. Mezcladitos, pantallas de inicio . . . . . . . . . . . . . . . . . . . . . . . .
20
3.7. Mezcladitos, pantallas de juego . . . . . . . . . . . . . . . . . . . . . . . .
21
3.8. Mezcladitos, comodines . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
3.9. Mezcladitos, creación de partida . . . . . . . . . . . . . . . . . . . . . . .
22
3.10. Preguntados, pantallas de juego . . . . . . . . . . . . . . . . . . . . . . . .
23
3.11. Tablero de Triviados . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
3.12. Categorías de Triviados . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
3.13. Inicio de juego en Enumerados . . . . . . . . . . . . . . . . . . . . . . . .
25
3.14. Ejemplo de jugada en Enumerados . . . . . . . . . . . . . . . . . . . . . .
25
3.15. Continuar formula en Enumerados . . . . . . . . . . . . . . . . . . . . . .
25
3.16. Casilla de aceleración en Enumerados . . . . . . . . . . . . . . . . . . . .
26
3.17. Tienda de bonus de Enumerados . . . . . . . . . . . . . . . . . . . . . . .
26
3.18. Partidas de usuario en Temporis . . . . . . . . . . . . . . . . . . . . . . .
27
3.19. Perfil de usuario en Temporis . . . . . . . . . . . . . . . . . . . . . . . . .
28
3.20. Categorías de Temporis . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
XIX
3.21. Ejemplo de partida de Temporis . . . . . . . . . . . . . . . . . . . . . . .
29
4.1. Valores de XP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
4.2. UI de Barra de navegación en iOS 6 e iOS 7 . . . . . . . . . . . . . . . . .
36
4.3. Captura del menú de partidas de Battlex . . . . . . . . . . . . . . . . . . .
37
4.4. Captura de la escena de refuerzos de Battlex . . . . . . . . . . . . . . . . .
38
4.5. Captura de la escena de ataque de Battlex . . . . . . . . . . . . . . . . . .
39
4.6. Captura de la escena fortificar de Battlex . . . . . . . . . . . . . . . . . . .
39
4.7. Arquitectura de Battlex . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
4.8. Flujo de datos: Login con éxito . . . . . . . . . . . . . . . . . . . . . . . .
41
4.9. Flujo de datos: Cargar Partidas . . . . . . . . . . . . . . . . . . . . . . . .
43
4.10. Flujo de datos: Crear Partida . . . . . . . . . . . . . . . . . . . . . . . . .
44
4.11. Flujo de datos: Actualizar casillas después del ataque . . . . . . . . . . . .
46
4.12. Protipo Tablero Battlex . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
4.13. Explorador de clases de Parse . . . . . . . . . . . . . . . . . . . . . . . . .
52
4.14. Notificación de partida de Battlex . . . . . . . . . . . . . . . . . . . . . .
53
4.15. Dispositivos de la configuración del proyecto . . . . . . . . . . . . . . . .
54
4.16. Captura de Battlex en ejecución en iPad . . . . . . . . . . . . . . . . . . .
54
4.17. Resultados de la faceta de Jugabilidad Intrínseca . . . . . . . . . . . . . . .
55
4.18. Resultados de la faceta de Jugabilidad Mecánica . . . . . . . . . . . . . . .
55
4.19. Resultados de la faceta de Jugabilidad Interactiva . . . . . . . . . . . . . .
56
4.20. Resultados de la faceta de Jugabilidad Artística . . . . . . . . . . . . . . .
56
4.21. Resultados de la faceta de Jugabilidad Intrapersonal . . . . . . . . . . . . .
57
4.22. Resultados de la faceta de Jugabilidad Interpersonal . . . . . . . . . . . . .
57
4.23. Ejemplo del territorio pulsado . . . . . . . . . . . . . . . . . . . . . . . .
61
5.1. Pantallas Registro y Login . . . . . . . . . . . . . . . . . . . . . . . . . .
64
5.2. Pantalla partidas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
64
5.3. Pantalla refuerzos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
5.4. Pantalla ataque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
5.5. Pantalla fortificar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
A.1. Claves de aplicación de Parse . . . . . . . . . . . . . . . . . . . . . . . . .
75
A.2. Resumen de Battlex en Parse . . . . . . . . . . . . . . . . . . . . . . . . .
76
A.3. Creación de tablas o clases en Parse . . . . . . . . . . . . . . . . . . . . .
76
A.4. Campos de la tabla User en Parse . . . . . . . . . . . . . . . . . . . . . . .
77
A.5. Creación de columna con relación en Parse . . . . . . . . . . . . . . . . .
78
xx
B.1. Battlex paso a paso: Registro . . . . . . . . . . . . . . . . . . . . . . . . .
81
B.2. Battlex paso a paso: Identificación . . . . . . . . . . . . . . . . . . . . . .
82
B.3. Battlex paso a paso: Opciones . . . . . . . . . . . . . . . . . . . . . . . .
83
B.4. Battlex paso a paso: Partidas . . . . . . . . . . . . . . . . . . . . . . . . .
84
B.5. Battlex paso a paso: Situar refuerzos . . . . . . . . . . . . . . . . . . . . .
85
B.6. Battlex paso a paso: Configurar Ataque . . . . . . . . . . . . . . . . . . .
86
B.7. Battlex paso a paso: Configurar Ataque . . . . . . . . . . . . . . . . . . .
86
B.8. Battlex paso a paso: Configurar Ataque . . . . . . . . . . . . . . . . . . .
87
B.9. Battlex paso a paso: Fortificar . . . . . . . . . . . . . . . . . . . . . . . .
88
C.1. Tablas de Battlex en SQLite . . . . . . . . . . . . . . . . . . . . . . . . .
89
C.2. Campos de la tabla Partida en SQLite . . . . . . . . . . . . . . . . . . . .
90
C.3. Datos de la tabla Mapa en SQLite . . . . . . . . . . . . . . . . . . . . . .
90
C.4. Capa de servicios con SQLite integrado . . . . . . . . . . . . . . . . . . .
90
C.5. Interfaz de usuario de prueba . . . . . . . . . . . . . . . . . . . . . . . . .
91
xxi
Índice de listados
4.1. Creación de una escena con Cocos2d . . . . . . . . . . . . . . . . . . . . .
40
4.2. Reemplazo de escena con efecto FlipY . . . . . . . . . . . . . . . . . . . .
41
4.3. Liberación de la escena actual . . . . . . . . . . . . . . . . . . . . . . . .
41
4.4. Configuración de la tabla de partidas . . . . . . . . . . . . . . . . . . . . .
42
4.5. Creación y agregación de tablas de partidas en la escena . . . . . . . . . . .
42
4.6. Selección de partida cuando se es poseedor del turno . . . . . . . . . . . .
43
4.7. Creación y configuración del tablero de juego . . . . . . . . . . . . . . . .
44
4.8. Colocación de tropas sobre el tablero . . . . . . . . . . . . . . . . . . . . .
45
4.9. Ejemplo de Modelos de datos Partida y Mapa . . . . . . . . . . . . . . . .
47
4.10. Creación de un usuario utilizando Parse SDK
. . . . . . . . . . . . . . . .
47
4.11. Petición de partidas del usuario utilizando Parse SDK . . . . . . . . . . . .
48
4.12. Actualización de una casilla utilizando Parse SDK . . . . . . . . . . . . . .
48
4.13. Ejemplo de registro con la clase NSLog . . . . . . . . . . . . . . . . . . .
58
4.14. Login correcto, transición a Escena Partidas . . . . . . . . . . . . . . . . .
59
4.15. Usuario cacheado, transición a Escena Partidas . . . . . . . . . . . . . . .
59
4.16. Registro de error sin conexión . . . . . . . . . . . . . . . . . . . . . . . .
59
4.17. Registros de carga de partidas . . . . . . . . . . . . . . . . . . . . . . . .
60
4.18. Registros de territorio pulsado . . . . . . . . . . . . . . . . . . . . . . . .
61
A.1. Configuración en el cliente de las credenciales de Parse . . . . . . . . . . .
75
A.2. Jugadores de una partida en Parse . . . . . . . . . . . . . . . . . . . . . .
77
A.3. Query de obtención de jugadores contenidos en una partida en Parse . . . .
78
C.1. Generación de usuarios en Sqlite . . . . . . . . . . . . . . . . . . . . . . .
91
XXIII
Listado de acrónimos
REST
Representational State Transfer
SDK
Software Development Kit
SSOO
Sistemas Operativos
IDE
Integrated Development Environment
BaaS
Backend as a Service
API
Application Programming Interface
UCD
User Center Design
DAO
Data Access Object
XXV
Capítulo 1
Introducción
E
este capítulo se detallará el contexto en el que se ubica el proyecto, el problema que
hay que abordar y cual es la solución propuesta que más adelante se desarrollará.
N
1.1 Contexto del TFG
Este proyecto está relacionado con varias áreas de investigación y desarrollo, como son
la computación móvil, la computación en la nube, la interacción persona-computador y la
ludología.
1.1.1
Contexto de la Computación Móvil
Estamos ante la era móvil, lleva con nosotros algunas décadas (Ordenadores portátiles,
PDAs, etc), sin embargo desde el nacimiento de los dispositivos inteligentes (smartphones,
tablets, dispositivos Wearables, etc) todo el mundo está constantemente comunicado. Las
redes sociales o aplicaciones de comunicación ocupan la mayor parte del tiempo de uso
de estos dispositivos, aunque las aplicaciones de ocio las siguen muy de cerca. Podemos
comunicarnos directamente con aplicaciones sociales, a través de retos en videojuegos de
ámbito social u otras que miden nuestra actividad y realizan estadísticas con respecto a la de
nuestros conocidos.
1.1.2
Contexto de la Computación en la Nube
La computación en la nube, utiliza la palabra nube como metáfora de internet. El objetivo
de la computación en la nube es evitar el procesamiento local que conllevaría procesar o
almacenar esos datos, que gracias a ésta se mantienen centralizados al alcance de todos los
usuarios o consumidores (Figura 1.1). Aunque tiene sus desventajas, compensa y mucho
utilizar este tipo de servicios. Algunas de las ventajas que ofrecen son un bajo coste de
mantenimiento, información en tiempo real y la seguridad, ya que no tienes que preocuparte
por la integridad de los datos, todo esto te lo proporciona el servicio.
1
Figura 1.1: Ilustración de computación en la nube utilizando dispositivos móviles
1.1.3
Contexto de la Interacción Persona-Computador
Busca la unión entre la persona y el computador para que el primero interactúe con el
segundo y viceversa, de la manera mas correcta y fácil posible. Para que ello se lleve a cabo
se utilizan entre otras las siguientes metodologías y especializaciones:
Diseño centrado en el usuario (en ingles UCD, user-center design)
Usabilidad
Utilidad
Accesibilidad
1.1.4
Contexto de la Ludología
‘La Ludología, como disciplina ocupada en el estudio del juego por el juego, del aparente
sinsentido de esta acción antropológica. La espontaneidad y la “gratuidad” del juego no deben engañarnos... El está limitado en el tiempo y, en definitiva, sus resultados son borrados.
Sin embargo, como requiere la totalidad del ser, de forma voluntaria en función de una motivación determinada, tiene necesariamente unas consecuencias que varían según la calidad y
amplitud del compromiso, según los rasgos dominantes del juego considerado. La obtención
2
del placer lúdico, como resultado esencial de esta acción, tiene su sentido más profundo en
procesos objetivos y dialécticos del desarrollo, que trascienden las aplicaciones concretas,
pues determinan el paso hacia una condición superior en la existencia del individuo y de la
especie, en la conversión del Homo Ludens en Homo Sapiens” [Bandera(2006)].
1.2 Problema y solución propuesta
Ahora se sabe el enfoque del proyecto, pasaremos entonces a describir el problema que
abordamos y la propuesta de resolución.
1.2.1
Descripción del problema
Existen varios ejemplos famosos de aplicaciones asíncronas, Apalabrados [Etermax(2014a)],
Draw Something [Omgpop(2014)], etc. Todas ellas utilizan servicios de notificaciones y
computación en la nube para centralizar los datos de sus usuarios.
Aunque entre las más famosas no hay ninguna aplicación basada en los juegos de conquista. No se puede hacer una traducción directa de las reglas, como en los ejemplos anteriores,
para que se usen en dispositivos móviles.
En los ejemplos citados anteriormente, cuando un jugador posee el turno de la partida,
no requiere ninguna atención de los rivales para efectuar la jugada. Sin embargo, una de las
fases clásicas de juegos de mesa como Risk, necesita de una respuesta directa del rival a la
hora de efectuar los ataques.
Risk es uno de los más famosos juegos de mesa basado en conquista de territorios. Compuesto por un tablero de territorios colindantes, se trata de ser el jugador que más territorios
conquiste y en definitiva, de conquistarlo todo.
Las siguientes fases mezclan lo que sería una partida del juego complementado con funcionalidades para adaptarlo a la plataforma móvil:
1. Registrar usuario
2. Idenfificar usuario
3. Crear partida
4. Unirse a las partidas creadas por otros usuarios
5. Distribuir nuevas tropas sobre sus territorios en el tablero
6. Realizar ataques para conquistar nuevos territorios
7. Redistribuir tropas de territorios dominados
1.2.2
Solución propuesta
Con todo lo anterior en mente, se propone crear un juego de estrategia por turnos basado
en comunicación asíncrona para plataforma iOS.
3
En primer lugar dispondrá de un servicio de autenticación y registro nada más entrar en
la aplicación. Este se comunicará con el servicio en la nube para comprobar los credenciales
del usuario o para crear usuarios nuevos.
Una vez que el usuario se identifica en la aplicación podrá ver el estado de sus partidas,
aparecerán en primer lugar las partidas en las que tiene el turno, y en segundo lugar las que
el turno es del rival.
También podrá crear partidas, las cuales aparecerán en la lista del turno del usuario que la
ha creado. Los rivales se añadirán a la partida creada de forma aleatoria, escogiendo a estos
a partir de la base de datos remota almacenada en el servidor.
El usuario podrá seleccionar una de las partidas de la sección de su turno y entonces aparecerá la pantalla de juego, donde se cargarán los datos cacheados de la partida en cuestión. En
este juego existirán tres fases que compondrán el turno, con lo cual la partida seleccionada
se cargará en la fase en la que el usuario la dejó, si anteriormente ya hubiera jugado alguna
de las fases. Por defecto una partida empieza en la fase de reclutamiento, pero es posible
jugar las fases (excepto la última) sin llegar a pasar el turno. El estado de las partidas se
almacenará en el servidor.
En la pantalla de juego se podrán visualizar los datos de la partida, y en concreto de la fase
actual. La pantalla de juego mostrará un tablero, en el que cada territorio estará identificado
con un hexágono, y el mapa por defecto será un mapa de 60 (12 x 5) hexágonos, característicos en muchos juegos de estrategia por computador. Cada territorio estará compuesto por
una tropa del color del usuario en la partida y un número identificativo para saber el número
de tropas que controlan ese territorio.
Lo anteriormente citado respecto a la pantalla de juego, es de carácter general para todas
las fases. Ahora se explicará la información que se visualizará en cada fase del juego.
Refuerzos: La primera fase del turno es en la que el jugador ganará tropas para distribuirlas entre los territorios que controla. Se visualizará entonces el número de tropas
ganadas para ese turno.
Ataque: En la segunda fase el jugador podrá atacar desde sus territorios hacia territorios enemigos adyacentes usando un número de tropas menor o igual a tres, siempre
dejando una tropa en la retaguardia. En esta fase se podrá visualizar el número de tropas con las que el usuario desea atacar a otro territorio (el ataque lo componen dos
territorios, uno atacante y otro defensor), además de seleccionar un territorio enemigo;
y será entonces cuando el usuario podrá realizar el ataque. Al realizar éste, se visualizará el resultado del ataque, la puntuación se corresponderá con un valor entre 1 y 6
(valor de un dado convencional), por cada tropa que forme parte del ataque (incluidas
las tropas del rival).
Fortificar: La última fase, donde el jugador tendrá la oportunidad de mover tropas entre
4
los territorios que controle (siempre, dejando una tropa mínima en cada territorio). En
esta fase se mostrará la información del usuario y el color de tropas que controla.
Por último, la aplicación contará con un servicio en la nube, que cubrirá los siguientes
requisitos:
Almacenamiento en base de datos.
Servicio web REST [Marques(2013)], para realizar peticiones al servidor.
Servidor de notificaciones PUSH.
Informes de analítica.
1.2.3
Estructura de la memoria
A continuación se detalla la organización de la presente memoria.
Capítulo 1. Introducción.
En este capítulo se definen los campos de estudio del proyecto, se introduce el problema y se propone una visión general de la solución propuesta.
Capítulo 2. Objetivos del proyecto y herramientas utilizadas.
Se detallan los objetivos generales y específicos que se deben llevar a cabo durante el
desarrollo del proyecto, y se definen las herramientas utilizadas, hardware y software.
Capítulo 3. Fundamentos y Estado del arte.
A partir de una búsqueda bibliográfica, se detallan algunos antecedentes relacionados
con el presente proyecto.
Capítulo 4. Modelo Conceptual.
Se detalla el estudio teórico más relevante y se justifica la elección de los diferentes
métodos y técnicas empleadas.
Capítulo 5. Método de trabajo.
Se define la metodología de desarrollo y arquitectura, además de definir cómo se han
integrado las diferentes herramientas utilizadas en el desarrollo.
Capítulo 6. Resultados y conclusiones.
Se muestra el resultado de la aplicación y se expone el cumplimento de los objetivos,
así como las conclusiones. Se exponen posibles alternativas y mejoras futuras.
5
Anexos.
En este apartado se incluyen, el manual de usuario para usar la aplicación y tamibién
un manual de ejemplo de uso del backOffice.
6
Capítulo 2
Objetivos
E
este capítulo se detallan los objetivos generales y específicos del proyecto, así como
las herramientas utilizadas a lo largo del desarrollo del mismo.
N
2.1 Objetivo general
El objetivo de este proyecto es el de realizar un juego de estrategia basado en conquista
de territorios que permita interactuar de forma asíncrona a varios jugadores. El juego se
ejecutará bajo la plataforma iOS, integrará librearías gráficas y computación en la nube sobre
la plataforma móvil.
2.2 Objetivos específicos
A continuación se va a proceder a explicar los objetivos específicos con los que llevar a
cabo el proyecto. Se detallarán punto por punto todos y cada uno de los objetivos y la manera
de alcanzarlos.
1. Diseñar la mecánica del juego a implementar mediante el análisis de herramientas,
tecnologías y estado del arte con el fin de asegurar la jugabilidad y potenciar el interés
del usuario.
2. Implementar el juego mediante los lenguajes y tecnologías más apropiados para
alcanzar el objetivo general.
3. Asegurar el correcto funcionamiento y la consecución del objetivo general mediante
pruebas del software generado.
2.3 Objetivos operativos
2.3.1
Analizar y seleccionar los lenguajes y frameworks gráficos óptimos
para el TFG
Se realizarán una serie de tutoriales y pruebas para avanzar en el aprendizaje del lenguaje
de programación, para la plataforma escogida, llamado Objective-C. Se harán diferentes
tareas, desde interfaces básicas hasta realizar peticiones a servicios web. También se realizará
una estudio previo de los diferentes frameworks que se pudieran utilizar en el proyecto y una
7
vez elegido el que se integrará en el proyecto, se procederá a realizar tareas incrementales
para aprovechar el tiempo de aprendizaje en el desarrollo de la aplicación final.
2.3.2
Analizar, definir y adaptar las reglas del juego a desarrollar asegurando la jugabilidad del proyecto
Simplificar y/o adaptar las reglas de un juego de estrategia clásico, para que haga uso de
la interacción de un dispositivo móvil con pantalla táctil. Esto implica también adaptar las
reglas para que la jugabilidad se lleve a cabo de manera asíncrona, es decir, que los diferentes
integrantes de una partida no tenga porqué coincidir en estar conectados al mismo tiempo.
Para adaptar el juego se deberá partir de las fases que componen un turno, descritas en la
sección 1.2.2 del capítulo anterior.
2.3.3
Diseñar e implementar escenas del juego
Diseñar e implementar las diferentes escenas del juego. Desde el inicio de sesión y el registro hasta el visor de partidas y el tablero. Las primeras no tendrán mucha complejidad
ya que deberán mostrar una interfaz sencilla para que lo usuarios introduzcan sus credenciales, sin embargo, el visor y el tablero tendrán mas complejidad. Este último tendrá que
representar territorios y que los usuarios vean que jugadores los controlan.
2.3.4
Diseñar e implementar la interfaz de usuario
Se realizará una búsqueda de información a través del estado del arte, con aplicaciones
similares, para conocer cómo resuelven diferentes problemas de interacción y saber cómo se
podría enfocar el diseño de la interfaz de usuario, que es uno de los elementos más importantes en proyectos de este tipo. También se hará uso y se tendrá en cuenta las recomendaciones
que ofrece Apple en su documentación [Apple(2014a)].
2.3.5
Implementar el sistemas de persistencia de datos del juego
La aplicación dispondrá de un servicio web o backend, con el que realizar llamadas para
guardar, obtener o modificar la base de datos allí almacenada. Ésta dispondrá de todos los
elementos necesarios para persistir las partidas y los usuarios. También dispondrá de un SDK
para realizar peticiones al servicio REST.
2.3.6
Diseñar e implementar el sistema de notificaciones del juego
Una notificación push es, básicamente, un mensaje enviado por un servidor a un cliente
que está suscrito a sus notificaciones [Mateos(2013)]. Se implementará este servicio para que
los usuarios no tengan que estar pendientes del estado de las partidas en las que participan,
sino que sea el propio dispositivo que te avise a través de esta tecnología de cuando tienes el
turno de alguna de las partidas en juego.
8
2.4 Herramientas utilizadas
A continuación se van a detallar las herramientas, tanto software como hardware, utilizadas para completar el proyecto.
2.4.1
Lenguajes de programación y sistema operativo
Para llevar a cabo la aplicación se podría haber hecho uso de herramientas de alto nivel para desarrollar un proyecto multiplataforma, sin embargo, gracias a disponer de las
herramientas necesarias, se pretendía adquirir conocimientos acerca de la tecnología de Apple y desarrollar de manera nativa, con lo que el lenguaje escogido no podía ser otro que
Objective-C [Anónimo(2014)], aunque recientemente ha publicado otro lenguaje con el que
implementar aplicaciones nativas llamado Swift.
Para justificar la elección de este sistema operativo móvil, nos centraremos en diferentes
estudios, mostrando los beneficios que genera una aplicación en iOS y otra en la competencia directa, Android. Ya que a pesar de la expansión de Android en cuanto al número de
dispositivos en el mercado, no se obtienen los mismos beneficios para una misma aplicación
que corre bajo los SSOO de Apple y Google.
En un artículo realizado en App Annie el 31 de Julio del pasado año, nos encontramos con
el número de descargas frente al beneficio generado por ambas plataformas. Las gráficas del
estudio están basadas en el segundo cuatrimestre de 2013.
Figura 2.1: Descargas frente a Beneficios
[AppAnnie(2013)]
Además, echando un vistazo a las categorías que obtienen mayor número de descargas en
la App Store (Tienda de aplicaciones de Apple), vemos como las categorías de Juegos (en
las que se enmarca el presente proyecto) y Entretenimiento son las que mayor número de
descargas poseen.
9
Figura 2.2: Descargas por categoría
[AppAnnie(2013)]
Para compilar el código fuente objective-c necesitaremos un compilador, el compilador de
XCode (IDE nativo en OS X) es Apple LLVM. El compilador fue introducido en la version
de XCode 3.2 para la versión del sistema operativo de escritorio OS X 10.6 (Snow Leopard),
basado en el proyecto Open Source LLVM.org [Apple(2012)].
2.4.2
Medios Hardware
La implementación se lleva a cabo en un ordenador portátil MacBook Pro Retina de
mediados de 2012, sus características son:
Pantalla retina de 15,4 pulgadas.
Procesador Intel Core i7 3a generación a 2,3GHz y 6MB de cache L3 compartida.
8GB de memoria RAM DDR3L.
Disco sólido de 256GB.
Tarjeta gráfica NVIDIA GeForce GT 650M con 1GB de GDDR5.
Sistema operativo OS X 10.9 Mavericks.
Para probar la aplicación durante el desarrollo se utilizan varios dispositivos, así como
diferentes versiones del sistema operativo móvil iOS.
El dispositivo con el que más pruebas se han realizado y por tanto para el que estará optimizada la aplicación, es un iPhone 4 (Figura 2.3) (lanzado en 2010) cuyas
características son:
10
• Pantalla retina de 3,5” y una resolución de 640x960 pixels.
• Procesador ARM-Cortex A-8 a 1GHz.
• 512MB de memoria RAM.
• 16GB de memoria interna.
• Sistema operativo al comienzo iOS 5.0, y actualmente 7.1.1.
Figura 2.3: Apple iPhone 4 (imagen obtenida de http://www.iosxtreme.com/2012/07/
16/repaso-sobre-todas-las-generaciones-de-iphone/)
Otro dispositivo más actual en el que se han realizado pruebas es un iPad Air (Figura
2.4) (lanzado en 2013) cuyas características son:
• Pantalla retina de 9,7” y una resolución de 640x960 pixels.
• Procesador A7 y M7.
• 1GB de memoria RAM.
• 32GB de memoria interna.
• Sistema operativo al comienzo iOS 7.1.1.
Figura 2.4: iPad Air, imagen obtenida de https://www.apple.com/es/ipad-air/
2.4.3
Medios Software
Ya se ha comentado el lenguaje de programación que se utilizará para desarrollar la aplicación será objective-C. El API de iOS llamada Cocoa Touch, se utiliza para crear aplicaciones
11
nativas en esta plataforma. Está formada por 4 capas, y cada una provee al sistema de una
serie de características. Se pueden ver las diferentes capas en la Figura 2.5.
Figura 2.5: Capas de las que se compone Cocoa Touch, imagen obtenida de http://iosdev.
es/frameworks/
A continuación se definirá brevemente las características de cada capa [Languedoc(2012)]:
Cocoa Touch: Storyboards, Documentos, Gestos, Multitarea, Notificaciones y el Framework UIKit.
Media: Esta capa es la encargada de controlar los gráficos, audio, video y el sistema
AirPlay.
Core Services: Servicios como iCloud, Compras dentro de las apps, SQlite, CoreData
y Core Location son controlados gracias a esta capa.
Core OS: La capa de mas bajo nivel, encargada de gestionar el Bluetooth, los accesorios externos y un framework acelerador.
La herramienta o entorno de desarrollo para llevar a cabo la aplicación es XCode (2.6),
una aplicación gratuita que funciona bajo el sistema operativo OS X en los ordenadores de
Apple. Es un IDE muy completo, que tiene integrado en sí, el Framework Cocoa y Cocoa
Touch del que ya hemos hablado. Dispone de las herramientas necesarias para comenzar el
desarrollo (Compilador, Depurador, Herramientas de gestión, Simulador, Documentación,
etc), aunque para probar la aplicación en dispositivos físicos es necesario enrolarse en el
centro de desarrolladores de Apple (iOS dev Center) [Apple(2014c)].
12
Figura 2.6: XCode, configuración general del proyecto
Con el fin de utilizar una librería gráfica que ayudase al desarrollo de las diferentes fases
del juego, se realizó un estudio previo de las posibilidades de las librerías más comúnmente
usadas en el desarrollo de videojuegos de bajo presupuesto para iOS. En su mayoría son
librerías gráficas para realizar juegos en 2D aunque tienen ciertas herramientas para el desarrollo 3D, aunque no se utilizarán gráficos en 3D para el presente proyecto.
A continuación se muestra una tabla comparativa de las librerías que se tuvieron en cuenta
en el estudio previo:
Game Engine
Lenguaje
Multiplataforma
Coste Publicación
Cocos2D
C++,
Python,
Objective-C
o
JavaScript
LUA
Mono, UnityScript,
C# o Boo
Si
Gratis
Si
Si
16 hasta 200 $
3000 $
Corona SDK
Unity
Cuadro 2.1: Comparativa sobre frameworks gráficos para iOS
Como se ha comentado anteriormente, la idea del proyecto también era aprender el lenguaje de programación para implementar aplicaciones nativas para plataforma iOS, con lo
cual el lenguaje elegido entre los que se han comparado ha sido Cocos2D. Entre otras opciones se ha decantado por usar este framework ya que se integra con XCode, el coste para
publicar una aplicación basada en él es gratuito y la gran comunidad de desarrolladores que
lo usan.
Esta aplicación no necesita mucha potencia, además solo se utilizarán gráficos en 2D, con
lo cual será suficiente con este framework basado en OpenGL 1.1, que viene con algunas
13
librerías para controlar mapas basados en cuadros (Tile maps).
También se utilizará Parse, un BAA S que nos permitirá utilizar múltiples servicios de manera gratuita (aunque con límites), basados en la nube. Sus principales características son las
siguientes [Rubio(2013b)]:
Modelo de datos en la nube: creación de tablas no-SQL en la nube y capacidades
para inserción, modificación y consulta vía API.
Notificaciones Push: posibilidad de envío de notificaciones push a nuestros usuarios,
previa aceptación por parte del usuario.
Cloud Code: capacidades para la ejecución de código en el servidor, muy útil para la
realización de validaciones de seguridad, o procesos automáticos por cambios en los
datos.
Esta plataforma provee a los desarrolladores de un SDK, disponible para múltiples plataformas, entre ellas iOS.
De esta manera, todas las herramientas que usamos están desarrolladas en Objective-C,
con lo cual todo el desarrollo se lleva a cabo en el mismo lenguaje.
Otros medios software secundarios
DropBox: Para almacenar documentos y archivos, con el fin de compartirlos entre el
director y el alumno.
Adobe Ilustrator CC: Para crear y modificar los gráficos de la aplicación.
MacTex, el paquete de latex para OS X, además de la herramienta TexPad para elaborar la memoria.
Vista Previa: Herramienta nativa para visualizar y editar documentos y gráficos en OS
X.
BitBucket: Servicio de alojamiento web basado en Git, en el cuál se almacenará el
proyecto para control de versiones.
14
Capítulo 3
Estado del arte
E
N este capítulo se detallan algunos ejemplos que han servido de inspiración al proyecto,
pues como ya se ha comentado el trabajo consta de una aplicación móvil asíncrona
basada en juegos de estrategia para plataforma iOS.
3.1 Juegos de Estrategia
Los juegos de estrategia se basan en la inteligencia, habilidades, planificación y ejecución.
Estos factores, junto con el rol que desempeñe el jugador, pueden ser determinantes para
conseguir la victoria.
Según el medio utilizado se pueden clasificar en juegos de cartas, dados, tablero, etc.
Aunque también pueden mezclar varios de estos conceptos a la vez para crear juegos más
complejos, por ejemplo en el trabajo se mezclan los conceptos de tablero y dados, con la
táctica del combate para limitar el despliegue de tropas con el azar.
A continuación se exponen algunos ejemplos de estos tipos de juegos:
3.1.1
Poker
Existen varias modalidades, aunque la más famosa actualmente es la llamada Texas HoldEm. Consta de una baraja de 52 cartas, dividida en 4 palos. La primera fase es llamada
Preflop, en la que cada jugador recibe 2 cartas para comenzar las apuestas. Luego le siguen
las fases de Flop, el repartidor levanta 3 cartas encima de la mesa, Turn, se levanta una carta
más, y River, donde se levanta la última carta. Cada una de ellas con sus correspondientes
apuestas. Para determinar el ganador existe un orden de 10 tipos de combinaciones (Figura
3.1) , gana el jugador que consiga la mejor mano de 5 cartas, entre las que posee y las de la
mesa.
3.1.2
Poker de dados
Básicamente igual que el juego de poker con cartas descrito anteriormente, pero en este
caso se juega con 5 dados. Cada jugador tiene tres oportunidades en cada turno para sacar la
mejor jugada. La manera de determinar el ganador es similar al de las combinaciones de la
figura 3.1. La mayor diferencia es a la hora de utilizar el “AS”, que se puede utilizar como
15
comodín (ser sustituido por cualquier carta) o con normalidad, y a la hora de las fases aquí
no existen, son sustituidas por las tiradas que tiene cada jugador.
Figura 3.1: Combinaciones de Poker (imagen obtenida de http://www.jugar-poker.
info)
3.1.3
Risk
Juego de mesa creado por Albert Lamorisse en el año 1950. Se comercializa desde 1958
y está basado en turnos simulando la estrategia militar. Existen varias maneras de jugar y
diferentes versiones del juego original, pero se va a explicar el funcionamiento básico de
una partida. Pueden jugar de 2 a 6 jugadores, el tablero está compuesto por 42 territorios
agrupados en 6 continentes, se juega con 3 dados de ataque, 2 de defensa y 56 cartas. La
finalidad es conquistar todos los territorios. Cada turno está compuesto por tres fases que se
describen a continuación:
Refuerzos: Consiste en obtener nuevas tropas según el número de territorios que se
controlen y ubicarlos en ellos en cualquier orden
Ataque: El ataque se ejecuta de manera que el atacante puede atacar con un máximo de
3 tropas a un territorio enemigo adyacente, siempre dejando como mínimo una tropa
en la retaguardia. Cada tropa atacante y defensora estará identificada con un dado,
estos se ordenan en orden descendente y se enfrentarán dado a dado para concluir el
ataque, ganando el atacante en caso de superar el valor del dado defensor. En caso de
empate gana siempre el defensor.
Fortificación: En la última fase se podrá mover tropas de un territorio controlado a otro
adyacente, siempre dejando una tropa como mínimo en cada territorio.
16
Figura 3.2: Tablero de Risk (imagen obtenida de http://img.americanas.com.br)
3.2 Aplicaciones Asíncronas
Ahora se van a poner ejemplos de aplicaciones actuales, que utilizan tecnologías similares
a las que se utilizan en el trabajo. Estas aplicaciones en su mayoría son adaptaciones, con
o sin modificaciones, de juegos de mesa, dados, etc, como se han descrito en ejemplos del
punto anterior.
3.2.1
Apalabrados
Basado en otro juego de mesa llamado Scrabble, modificado y adaptado para dispositivos
móviles. Este consistía en ganar puntos formando palabras sobre un tablero de 15x15 casillas.
Las palabras podían formarse en vertical u horizontal y se podían cruzar para aprovechar
las palabras ya formadas en el tablero. Se obtienen puntos según el número de letras de la
palabra formada y su situación en el tablero. La finalidad del juego consistía en terminar con
la mayor puntuación. Apalabrados hereda muchas de éstas y otras reglas de juego, agregando
el componente social y las partidas con gente a distancia, sin la necesidad de jugar al mismo
tiempo.
Una vez identificado en la aplicación a través de tu correo electrónico o tu cuenta de
Facebook, podrás ver una lista de partidas en juego, crear una nueva (eligiendo oponente, el
idioma preferido para formar las palabras) o acceder a tu perfil entre otras pantallas.
En la pantalla de perfil (Figura 3.3), se puede ver la siguiente información:
Datos de usuario: Sea el perfil propio o de un rival se podrá ver el avatar y nombre de
usuario, la cuenta de twitter del usuario (si lo permite el usuario), el instante en que
17
se hizo la última jugada y banderas con el número de partidas jugadas en un idioma
concreto.
Logros: Se podrá visualizar la mayor puntuación conseguida en un juego completo, la
de la mejor jugada y la palabra mas larga formada.
Desempeño: Se visualizan, el número de partidas ganadas, perdidas, y el porcentaje de
partidas que se han abandonado. Las partidas abandonadas computan como perdidas.
Versus: Si el perfil es de un rival, veremos esta tabla que muestra el computo global de
los enfrentamientos que se hayan tenido con él. Además se puede solicitar amistad en
Facebook a través del botón ‘Agregar Amigo”.
Figura 3.3: Apalabrados, nuevo juego y perfil de usuario (imagen obtenida de http://
applicantes.com)
Como se ha comentado anteriormente, apalabrados está muy en la línea de las reglas del
Scrabble, repartiéndose fichas entre ambos oponentes, formando palabras sobre el tablero
respetando las reglas y cuya finalidad es conseguir el mayor número de puntos. Para conseguir esto también se juega con la puntuación de cada ficha (no todas valen lo mismo) y
con las casillas “especiales” del tablero (figura 3.4): Las casillas están denominadas por dos
letras, DL o doble letra, TL o triple letra, DP o doble palabra y TP o triple palabra. Al formar
una palabra colocando las fichas sobre estas casillas se le proporciona al jugador puntos extra
según el significado de cada casilla.
En la parte inferior de la pantalla se muestran una serie de opciones que hacer con las
fichas o la jugada, como pasar turno, cambiar fichas, mezclar las fichas actuales, rendirse
y cuando se ha formado una palabra válida pasar se convierte en jugar para confirmar la
jugada.
18
Figura 3.4: Apalabrados, tablero de juego (imagen obtenida de http://applicantes.com)
En la figura 3.5 se pueden ver unas capturas de las pantallas (de izquierda a derecha): Lista
de partidas en juego, partida terminada y chat de juego.
En Lista de partidas se muestran las listas de apalabrados en juego en las que te toca tu
turno en primer lugar y debajo las que el turno es del rival. Por cada partida se muestran los
datos del rival, la última palabra formada y hace cuanto tiempo fue formada, el idioma de la
partida, hace cuanto fue creada y las fichas restantes.
En la captura de la Partida terminada se muestra un mensaje para el usuario que ha
ganado o perdido y dá la posibilidad de compartir en las redes sociales el resultado de la
partida.
En la captura referente al chat del juego se muestra un chat que ofrece la posibilidad de
conversar con el usuario rival en cada partida.
Figura 3.5: Apalabrados, redes sociales (imagen obtenida de http://applicantes.com)
19
3.2.2
Mezcladitos
El caso de Mezcladitos no se trata de una adaptación de ningún juego de mesa famoso
como ocurre con el caso anterior (sección 3.2.1). Aunque se parece a muchos juegos famosos, bebe directamente del anterior y también de los clásicos ”crucigramas”, con lo cual,
es otra aplicación de formar palabras con una serie de particularidades que se describirán a
continuación.
En la pantalla principal (figura 3.6) nada más abrir la aplicación se pide introducir los
datos para la identificación. Si se posee cuenta de usuario de apalabrados se podrá usar en
esta app ya que ésta lo permite al estar creada por la misma compañía (Etermax), por lo tanto
se podrá introducir usuario y contraseña o identificarse con la cuenta de Facebook.
Figura 3.6: Mezcladitos, pantallas de inicio (imagen obtenida de http://applicantes.
com)
La mecánica de juego consiste en formar el mayor número de palabras en tres turnos, de
dos minutos de duración cada uno. Por supuesto para hacerlo se dispone de un tablero de
4x4 con un total de 16 letras para juntar palabras (figura 3.7), ya sea en horizontal, vertical u
horizontal. Además algunas letras tienen bonificación de multiplicación, que sigue la misma
forma que la aplicación anterior (DL, TL, DP y TP). Ganará el jugador que mas puntos
consiga en el transcurso de la partida
20
Figura 3.7: Mezcladitos, pantallas de juego (imagen obtenida de http://applicantes.
com)
El juego tiene un sistema de comodines que hacen que un usuario pueda desequilibrar la
balanza en su favor. Al registrarte se obtienen 50 monedas del juego con las que se pueden comprar comodines. Las monedas se pueden comprar (compras in-app desde 0,89, 1,79
euros...) a través de la propia aplicación (figura 3.8) o ganando partidas.
Existen varios tipos de comodines que ofrecen diferentes bonificaciones:
Pingüino: Congelar el tiempo.
Tortuga: Ralentizar el tiempo.
Mono: Se chiva de tres palabras que se pueden formar.
Loro: Sugiere términos.
Figura 3.8: Mezcladitos, comodines (imagen obtenida de http://applicantes.com)
21
En mezcladitos se pueden crear partidas en 11 idiomas diferentes y como en la anterior
app, se pueden crear partidas buscando a amigos en Facebook o por el email de usuario.
Tiene el mismo aspecto social y una interfaz de usuario similar a la de su antecesor.
Figura 3.9: Mezcladitos, creación de partida (imagen obtenida de http://applicantes.
com)
Por supuesto las partidas pueden estar en espera de que el usuario quiera realizar su jugada,
pero en caso de demorar más de 7 días la partida desaparece.
Los beneficios que gana la empresa gracias a estas aplicaciones se fundamentan en la
publicidad en el caso de las aplicaciones gratuitas y del coste de las aplicaciones que eliminan
la publicidad, a parte de las compras in-app. En este caso y el de Apalabrados (sección 3.2.1)
la publicidad puede llegar a parecer exagerada, porque en muchas de las pantallas aparece
un banner publicitario y también publicidad a pantalla completa cada vez que hacemos una
jugada.
3.2.3
Preguntados
Del mismo desarrollador que los dos ejemplos de aplicaciones anteriores es Preguntados.
Una vez más una aplicación basada en otro juego de mesa famoso como lo son los juegos
de preguntas y respuestas de varios campos, en concreto el juego de este tipo más famoso es
Trivial Pursuit.
Como otros ejemplos, esta adaptación tiene sus matices, sobre todo uno de ellos es el de
hacer que los propios jugadores propongan preguntas para el juego, que a través de unas
votaciones se valorarán. Esto hace el juego mucho más dinámico, divertido, social y adictivo.
La mecánica del juego es muy similar al ya comentado anteriormente Trivial, pero en este
caso no se utiliza un tablero con un dado para avanzar de casilla en casilla intentando conseguir los ”quesitos”. En su lugar los quesitos se sustituyen por personajes y el tablero por
una ruleta (figura 3.12. Se trata de girar la misma e ir contestando preguntas de los diferentes
22
campos que se van mostrando. Durante la partida el jugador obtendrá los personajes si contesta correctamente las preguntas, pero también podrá retar a los rivales si le sale la casilla
de la corona para intentar arrebatarle al usuario un personaje que haya conseguido.
Figura 3.10: Preguntados, pantallas de juego (imagen obtenida de http://applicantes.
com)
También ofrece compras in-app para obtener más oportunidades de tirada en cada turno, ya
que por defecto son tres y también se pueden comprar más ”vidas”, aunque se pueden obtener
con el transcurso de la partida. En Preguntados ganará el jugador que primero obtenga todos
los personajes.
El juego como los ejemplos anteriores, permite identificarse con cuentas de Facebook o
usuario y contraseña. Además también tiene todos los aspectos sociales, compartir resultados
via Twitter y Facebook, chat de juego, etc. Por supuesto es un juego asíncrono, las partidas
pueden estar ahí durante días, solo cuando el usuario podrá contestar sin límite mas halla de
los 7 días inactivo en una partida, en cuyo casi ésta será eliminada.
De todos los ejemplos de aplicaciones creados por Etermax([Etermax(2014b)]) este es el
que más se aleja de la mera adaptación del juego en el que está basado. La finalidad es la
misma, pero la dinámica de juego es diferente para adaptarla a los dispositivos móviles.
3.2.4
Triviados o Atríviate
Al igual que el ejemplo anterior (subsección 3.2.3), Triviados es una adaptación del famoso juego Trivial Pursuit. Pero en este caso de una manera mas fiel, pues antes se comentaba
que la manera de elegir las preguntas era a través de una ruleta, sin embargo en Triviados se
hace con un tablero (Figura 3.11) muy parecido al del juego de mesa.
Tal y como se describe en su sitio ([Triviados(2014)]): Triviados en un juego online disponible para todo tipo de smartphones, tablets, equipos de escritorio y portátiles. Se trata de un
23
Figura 3.11: Tablero de Triviados (imagen obtenida de www.triviados.es)
juego tipo Trivial Pursuit compuesto por más de 5.000 preguntas y respuestas que además se
van actualizando periódicamente para que los jugadores nunca lleguen a conocer todas las
preguntas y el juega siga teniendo, en todo momento, la emoción del primer día.
Figura 3.12: Categorías de triviados (imagen obtenida de www.triviados.es)
Como en cualquier otro juego de tipo Trivial, el objetivo del juego es ir recorriendo las
distintas casillas del tablero y contestando las preguntas de la categoría de la casilla en la
que caigamos hasta conseguir las 7 estrellas (una correspondiente a cada categoría) que se
encuentran repartidas por el tablero. Así el ganador de Triviados será el primer jugador que
logre obtener las 7 estrellas antes que sus oponentes ([Triviados(2014)]).
3.2.5
Enumerados
Enumerados es una aplicación muy parecida en su interfaz y experiencia de usuario al ya
comentado Apalabrados (Subsección 3.2.1) y a Mezcladitos (Subsección 3.2.2). Pero en este
caso no se trata de formar palabras, sino de formar operaciones matemáticas básicas usando
fichas de valores numéricos y fichas de símbolos operacionales.
24
A continuación se explicará en que consiste el juego:
La primera jugada debe pasar por la casilla de salida, es decir, algunas de las fichas utilizadas debe ser posicionada en dicha celda del tablero (3.13).
Figura 3.13: Inicio de juego en Enumerados (imagen obtenida de www.enumerados.es)
Para realizar una jugada es obligatorio utilizar números o signos que ya estén en el tablero
previamente (Figura 3.14) y también se pueden continuar las fórmulas como se muestra en
la figura 3.15.
Figura 3.14: Ejemplo de jugada en Enumerados (imagen obtenida de www.enumerados.es)
Figura 3.15: Continuar fórmula en Enumerados (imagen obtenida de www.enumerados.es)
Cuando el jugador termina su jugada, la puntuación que consigue es equivalente a todos los números sumados que forman la fórmula, es decir, simplemente hay que formular
25
operaciones válidas pero el resultado de la fórmula no es la puntuación sino lo que se ha
comentado.
Como ocurre en diversos juegos y en algunos de los ejemplos citados anteriormente, existen multiplicadores en el tablero de juego, al colocar una ficha que forme la fórmula en la
casilla multiplicadora, ésta se multiplica por el valor de la casilla.
También existen otros bonus, como el bonus para sumar 15 puntos que consiste en utilizar
en una jugada todas las fichas que se tienen en la mano del jugador. Otro mas es el de suamr
30 puntos al conseguir rellenar una fila o columna del tablero con una fórmula.
Además de lo anteriormente citado, esta aplicación cuenta con mas características, como
la de los bonus de juego. Existen varias maneras de conseguir bonus, esperar que se recargue
la barra de bonus, la cual aumenta en cada turno, aunque aumentará mas rápido si se usa en
una jugada la casilla de acelerar (Figura 3.16).
Figura 3.16: Casilla de aceleración en Enumerados (imagen obtenida de www.enumerados.
es)
La otra manera de utilizar un bonus es pagando por ellos (Figura 3.17), una vez comprado
se podrá usar una vez por partida, aunque siempre se podrá usar un bonus aleatorio cuando
se recargue la barra.
Figura 3.17: Tienda de bonus de Enumerados (imagen obtenida de www.enumerados.es)
26
Durante el juego el jugador podrá abandonar la partida o darla por perdida. En la pantalla
principal de la aplicación después de identificarse, se muestran todas las partidas del usuario,
además de poder gestionar la cuenta de usuario y los ajustes de la aplicación.
3.2.6
Temporis
Temporis es un juego multijugador por turnos para poner a prueba los conocimientos de
los jugadores. Se ha de retar a amigos o desconocidos e intentar ser el primero en crear líneas
temporales correctas de eventos de varias categorías.
La aplicación permite identificarse a través de las redes sociales, FaceBook y Twitter o con
correo electrónico como ocurre con la mayoría de las aplicaciones citadas anteriormente.
En la pantalla principal después de la identificación, vemos nuestro avatar de usuario y
acciones que se pueden hacer en la lista de partidas (Crear una nueva partida o actualizar la
lista), debajo se muestra la lista de partidas en juego y las terminadas.
Figura 3.18: Partidas de usuario en Temporis (imagen obtenida de play.google.com)
El perfil de usuario de Temporis (Figura 3.19) muestra unas estadísticas globales sobre las
partidas jugadas, además de un desglose de las categorías en las que mejor hemos puntuado.
27
Figura 3.19: Perfil de usuario en Temporis (imagen obtenida de play.google.com)
Al crear una nueva partida en temporis, se puede elegir una de las diferentes categorías
para los eventos de la línea temporal o crear una partida en la categoría es aleatoria. Las
categorías se pueden visualizar en la figura 3.20.
Figura 3.20: Categorías de Temporis (imagen obtenida de play.google.com)
En la figura 3.21, se puede ver como es la pantalla de juego de una partida de 4 jugadores
y con categoría aleatoria. La finalidad del juego es conseguir ordenar correctamente la mayor
parte de los eventos que van apareciendo. Aunque la partida consta de 4 jugadores, Temporis
permite crear partidas desde 2 hasta 4.
28
Figura 3.21: Ejemplo de partida de Temporis (imagen obtenida de play.google.com)
La aplicación funciona de la misma manera que las anteriores, el jugador que posee el
turno, podrá mover eventos en la línea temporal mientras no cometa ningún error, en cuyo
caso se pasará el turno al siguiente, el cual podrá contestar cuando quiera a la partida. En temporis gana el jugador que consigue colocar el mayor numero de eventos de la línea temporal
correctamente. también permite compartir estadísticas a través de las redes sociales.
3.3 Conclusiones
En esta sección se detallan más concretamente las funcionalidades que se han tenido en
cuenta de las aplicaciones anteriormente descritas, para adoptarlas en Battlex o como mejoras
futuras.
3.3.1
Integradas
Organización de partidas: La primera similitud con estas aplicaciones que se puede
observar en Battlex es la manera en que un usuario ver sus partidas y elige una de ellas
para entrar a jugar. En los ejemplos descritos anteriormente se puede observar como se
muestran en forma de tabla, diferenciando las partidas en las que se tiene el turno y las
que el turno lo posee el rival. También la información que se muestra de cada partida
ha servido de inspiración para mostrar los datos más relevantes de cada partida. Se ha
considerado que es la mejor manera de mostrar la información a los usuarios.
En las pantallas donde se visualizan las partidas en los ejemplos anteriores, también se
pueden crear nuevas partidas, aunque éstas se pueden personalizar en los ejemplos, en
Battlex se crearán de manera automática, pero la funcionalidad será similar.
Fichas: Otra de las similitudes es a la hora de diferenciar las "fichas"propias de las del
rival, en el caso de Triviados (sección 3.2.4) se puede diferenciar por colores donde
está situado cada jugador. En Battlex se pueden diferenciar las tropas por colores y
29
siguiendo la leyenda de la parte superior donde se muestra el color de la tropa del
jugador, el usuario identificará cual es el color de sus tropas.
Controles: Los controles sobre los tableros en los ejemplos aparecen en la parte inferior
de la pantalla, ya que en todos los casos el dispositivo está en posición vertical y es
más cómodo usar el dispositivo con los dedos pulgares de cada mano. En el caso de
Battlex el dispositivo siempre estará en posición horizontal, con lo cual los controles
sobre el tablero estarán alíneados a los bordes laterales de la pantalla y serán accesibles
por los mismos dedos.
Tablero: También se ha tenido en cuenta el uso que hacen aplicaciones como Trivados
(sección 3.2.4), Apalabrados (sección 3.2.1) o Enumerados (sección 3.2.5) a la hora
de mostrar los tableros. Éstas lo muestran completo para que se pueda observar en
toda la pantalla, aunque algunas permiten hacer zoom. En Battlex el tablero se muestra
completo en toda la pantalla, aunque no permite zoom.
Notificaciones: Todos los ejemplos anteriores hacen uso de notificaciones para manterner informados a los usuarios del progreso de las partidas en juego. En Battlex se
hace uso también de esta funcionalidad para que los usuarios sepan cuando les toca el
turno en alguna de las partidas que tienen en juego.
3.3.2
No integradas
A continuación se citarán brevemente las funcionalidades que se han considerado buenas,
pero que no se han integrado en el proyecto, o bien porque no estaban planificadas o porque
alguna de ellas hubiera sido complicada de implementar.
Sistema de logros: No se ha citado mucho en los ejemplos anteriores, pero están integrados con sistemas de logros de las diferentes plataformas para las que están disponibles. Sería intersante integrar en Battlex un sistema de logros que ofrecieran recompensas a los jugadores, para así motivar más el uso de la aplicación.
Redes Sociales: Todos los ejemplos anteriores permiten identificar a los usuarios a
través de sus cuentas en redes sociales, lo que aporta un valor añadido para ellas ya
que puede darse a conocer la aplicación a través de éstas redes, publicando anuncios
si el usuario lo permite en los tablones de éstas. Integrar estos modos de identificación
daría muchas más posibilidades de expansión a la aplicación.
Perfil y estadísticas: Una vista más detallada de los perfiles de usuario y permitir la
búsqueda de perfiles de otros usuarios mejoraría el sistema de creación de partidas.
También los ejemplos anteriores muestran estadísticas sobre las partidas de los usuarios, y estas podrían mostrarse en esa vista más detallada de los perfiles de usuario.
Sala de chats: La mayoría de las aplicaciones anteriores permiten la posibilidad de que
los usuarios que forman las partidas puedan hablar mediante salas de chats. En Battlex
30
se podría integrar esta funcionalidad, siempre que el servidor pudiera almacenar toda
la información de los chats.
Compras dentro de la aplicación: Algunas de las aplicaciones citadas anteriormente
ofrecen compras dentro de ellas. Se pueden comprar ayudas para tener ventajas a la
hora de jugar las partidas. La posibilidad de integrar también el sistema de cartas del
juego Risk original, podría ser una de esas ayudas que ofrecer al usuario. Canjeando
estas cartas, los jugadores podrían obtener más tropas a la hora de reclutarlas en la
primera fase de cada turno.
Multiplataforma: Aunque el presente proyecto se basa en una aplicación para plataforma iOS, casi todas las aplicaciones citadas están disponibles en las distinas tiendas de
aplicaciones móviles y también en las redes sociales, es otra de las ventajas que podría
ofrecer Battlex para alcanzar más cuota de usuarios.
3.3.3
Conclusiones
Todas las funcionalidades citadas son interesantes de cara a la jugabilidad y usabilidad
de la aplicación para los usuarios. La finalidad de ellas es mantener al usuario utilizando la
aplicación durante el mayor tiempo posible e incentivar el que unos usuarios rivalicen con
otros para fomentar el juego.
31
Capítulo 4
Método de Trabajo
D
de haber realizado un estudio de tecnologías hardware, software y haber sondeado el mercado de aplicaciones para la búsqueda de inspiración, se va a proceder a
explicar la metodología de desarrollo escogida para el desarrollo del proyecto.
ESPUÉS
4.1 Metodología de Desarrollo
Para realizar el desarrollo de la aplicación con un equipo tan reducido de personas, se
decide usar una metodología ágil de desarrollo llamada eXtreme Programming (Programación Extrema) [Wells(2009)] , formulada por Kent Beck en el primer libro sobre la materia
”Extreme Programming Explained: Embrace Change” [Beck(1999)], se diferencia de las
metodologías tradicionales en que el foco está en la adaptabilidad y menos en la previsibilidad.
4.1.1
Programación Extrema
La programación extrema (en adelante XP), se basa en una serie de valores (figura 4.1), los
cuales se deben seguir para que la consecuencia de ello la simplicidad de un buen producto y
un buen ambiente de trabajo. A continuación se detallarán los valores de los que se compone
XP:
Simplicidad: Para alcanzar la simplicidad se implementará la tarea asignada o estimada, sólo poniendo el foco en lo que se necesita, sin pensar en las necesidades futuras.
Éstas se implementarán más tarde. También se aplicará la simplicidad en la documentación, se debe realizar el código de manera que sea fácilmente interpretable por el
resto del equipo.
Comunicación: Como se comentaba, el código debe ser lo más inteligible posible
para que la comunicación y el conocimiento sobre el proyecto fluyan a través de todos
los integrantes del equipo. La mejor manera de documentar el código es eligiendo bien
el nombre de variables, métodos, clases y carpetas o grupos, porque los comentarios
pueden quedar obsoletos si los miembros del equipo se centran en mejorar el código y
se olvidan de cambiar los comentarios.
33
Retroalimentación: Este es uno de los valores clave. Se realizan iteraciones cortas,
en cada una de las cuales se entregará software funcionando, con lo que se descubre
en fases tempranas, donde no se cumplen los requisitos gracias a la observación del
cliente. Esto ayuda a que los desarrolladores se centren en las partes más importantes.
Valentía: Se sirve de ésta para desechar, cambiar o adaptar el código que uno mismo
previamente hizo. Sin importar el esfuerzo que conllevó hacerlo o que llevará cambiarlo, siempre y cuando esto sea para mejorar la calidad del producto.
Respeto: Apoyar a los compañeros, enseñar y aprender de ellos, respetar su trabajo y
adoptar las medidas oportunas de cara a la refactorización para conseguir una mejor
calidad del producto.
Figura 4.1: Valores de XP (imagen obtenida de http://pmoinformatica.com)
4.1.2
Historias de Usuario
Se trata de unas tarjetas en papel que se utilizan para definir los requisitos de cada tarea,
sean estos funcionales o no funcionales. Tienen una serie de características:
Trato dinámico y muy flexible.
En cualquier momento se pueden desechar, cambiar o reemplazarse por otras más
específicas o generaleso añadir nuevas.
Deben ser lo suficientemente específicas como para ser desarrolladas en unas semanas
(iteraciones1 ).
Para el contenido de las historias de usuario existen varias plantillas, unas definen que se
deben detallar con enunciado y descripción, otras solo con la descripción y que deben tener
una estimación de esfuerzo en días.
1
El equipo de desarrollo especificará de cuantas semanas se compone una iteración
34
Otra definición es la de Kent Beck en su primer libro citado anteriormente, en la cual se
detallan fecha, tipo de actividad (nueva, corrección, mejora), prueba funcional, número de
historia, prioridad técnica y del cliente, referencia a otra historia previa, riesgo, estimación
técnica, descripción, notas y una lista de seguimiento con la fecha, estado cosas por terminar
y comentarios [Letelier(2005)].
Siguiendo los valores de XP, se llevará a cabo el presente proyecto. El proyecto lo conforman dos personas, director y alumno, el director asumirá el papel de cliente y el alumno
será el equipo de desarrollo. Se detallarán las historias de usuario conjuntamente por los dos
miembros, se llevará acabo el desarrollo y se presentará al final de cada iteración una versión
funcional cliente, el cual podrá proponer cambios, nuevos requisitos, mejoras, etc.
Una vez satisfecho el cliente con el producto final, se realizará la documentación, detallando todas las iteraciones y sus características y se realizará el manual de usuario de la
aplicación.
4.2 Desarrollo del proyecto
A la hora de realizar una aplicación, hay que definir la idea y a través de ella realizar un
diseño de la misma. Aunque puede cambiar durante el desarrollo por las mejoras o recomendaciones a tener en cuenta a través de la retroalimentación del cliente, hay que definir
unos estilos, unas reglas del juego (adaptadas de juegos de guerra basados en conquista de
territorios y otras aplicaciones asíncronas) y la arquitectura del sistema. A continuación se
definirán las decisiones que se han ido tomando durante el desarrollo en cuanto a estilo o
diseño, reglas del juego y arquitectura del sistema, y como quedará todo una vez terminado
el desarrollo.
4.2.1
Diseño de la Interfaz de Usuario
Aunque se comenzó con una interfaz menos cuidada, desde el punto de vista del diseño y
se dio más importancia a la lógica de programación, ésta ha ido evolucionando hasta seguir
unos diseños más actuales y mejorar la experiencia de usuario.
Al comienzo del presente proyecto los dispositivos móviles como Android, iOS, etc, tenían unas interfaces nativas más basadas en el skeumorph (Skeumorfismo), que viene del
griego skeuos (herramienta) y morphe (forma) y se refiere a una propiedad de un objeto evolucionado (o derivado) que mantiene detalles del diseño del objeto original con el objetivo
de hacerlo más familiar para su usuario.
No se ha abandonado radicalmente este estilo pero ahora se siguen una serie de recomendaciones de guía de estilo para interfaces de usuario como las que Apple publicó el verano
de 2012 junto con la primera beta de iOS 7 ([Apple(2014b)]).
La razón de seguir esta guía de estilo y no otra como podría ser de Android o de otros
35
diseñadores es porque la aplicación es para plataforma iOS y se hace un diseño centrado en
los usuarios de esta plataforma para que encuentren en ella una interfaz ”familiar”.
La guía de estilo de iOS 7 comienza definiendo los temas que incorpora:
Deferencia: La interfaz de usuario ayuda a los usuarios a entender e interactuar con el
contenido, pero no compite con él.
Claridad: El texto es legible en todos los tamaños, los iconos precisos y los adornos
son sutiles y apropiados, y se centra en que la funcionalidad motiva el diseño.
Profundidad: Capas visuales y movimiento realista dan vitalidad y mejoran la experiencia de usuario.
Un ejemplo del cambio que supone la interfaz de usuario en iOS 7 con respecto de las
anteriores versiones se puede visualizar en la figura 4.2.
Figura 4.2: UI de Barra de navegación en iOS 6 e iOS 7 (imagen obtenida de https://
developer.apple.com)
En la siguiente tabla se muestran las diferencias visuales entre las diferentes versiones de
iOS:
Estilo de la barra
Apariencia
Tinte
Botón atrás
iOS 7
iOS 6
Translúcida clara (por defecto) o translúcida oscura
Linea de un píxel en el borde inferior
tintColor para personalizar los botones,
barTintColor para personalizar el fondo
El botón atrás es un botón hecho con el
título de la pantalla previa
Opaco con degradado azul (por defecto)
u opaco negro
Sombra en el borde inferior
tintColor para personalizar la barra
El botón atrás es un botón con borde que
contiene el título de la pantalla previa
Cuadro 4.1: Comparativa sobre UI de NavigationBar
Siguiendo estas y otras características más específicas como tamaños de botones, fuentes,
colores, etc, se definirán las escenas de las que estará compuesta la aplicación, las cuales se
explicarán mas adelante.
36
Escenas de Juego
Registro: Tiene un diseño sobrio y sencillo, sin distracciones, solamente los campos
necesarios para la información requerida (nombre de usuario, contraseña e e-mail) junto con los botones para confirmar el registro y otro para poder volver a la identificación,
además del título de la aplicación en la parte superior.
Identificación: Muy similar al anterior, esta vez solo con los campos nombre de usuario y contraseña para poder identificarse y los botones para confirmar la identificación
y otro para ir a la escena de registro.
Menú de partidas: La siguiente pantalla ya es algo más compleja que las anteriores
como se puede ver en la figura 4.3, tiene una serie de botones en la parte superior,
a la izquierda el botón de opciones en el cual se puede cerrar la sesión y en la parte
derecha el botón de crear nueva partida, como se puede observar ambos controles están
realizados siguiendo las guías de estilo recomendadas citadas anteriormente.
Figura 4.3: Captura del menú de partidas de Battlex
En la parte centrar aparece el nombre del usuario con el que se inició la sesión y debajo
separadas en dos tablas, aparecen las listas de partidas que tiene el usuario en juego, a
la izquierda las partidas en las que tiene el turno, a la derecha en las que el turno es de
alguno de los rivales.
Refuerzos: En esta escena se muestran los controles asociados a los refuerzos, estos
son: Tropa de ejemplo y el número de las tropas de refuerzos restantes por colocar en el
tablero, las cuales podrán ser colocadas en los territorios que se tengan bajo control. El
botón para acceder a la siguiente fase se activa al colocar todas las tropas de refuerzo
y en caso de ser pulsado se guarda el progreso de refuerzos y de fase. También se
muestra el botón volver, para poder volver en cualquier momento al menú de partidas.
Como se puede ver en la figura 4.4 , se hace uso de la guía de estilo, los botónes tienen
un borde del mismo color del texto para diferenciar claramente los elementos con los
37
que el usuario puede interactuar y también del fondo, además están diseñados con un
borde fino para resaltarlos más frente al texto informativo de la partida.
Figura 4.4: Captura de la escena de refuerzos de Battlex
El tablero tiene una dimensión de 12x5, se utiliza esta medida por varias razones: La
primera es porque es un número redondo (60 territorios) para dividir los territorios
entre tres jugadores. La segunda es porque con el ancho de pantalla de menor ancho
en modo apaisado, 480 puntos, siguiendo la recomendación de que los elementos con
interacción no sean menores de 44x44 puntos (mismos pixels en no-retina y 88x88 en
retina) es la medida mas óptima alcanzada realizando los cálculos oportunos.
Con respecto al tablero, se utiliza la silueta de un soldado para representar las tropas
junto con el número de tropas en cada territorio, los cuales están representados en
forma de hexágono. El motivo de la elección de este polígono para representar los
territorios es porque está basado en los juegos de estrategia por turnos clásicos, es un
recurso muy utilizado en juegos de guerra y además puede permitir en el futuro generar
mapas aleatorios o personalizados por el usuario de una manera sencilla. Lo que sería
mucho más difícil si se tratara de polígonos irregulares y no homogéneos.
Ataque: Ya se han definido las decisiones con respecto al tablero, así que se describirán solamente los controles diferentes que hay entre la presente escena y la anterior.
En la fase de ataque se podrá realizar las siguiente interacciones:
• Selección de territorios: La acción para realizar el ataque empieza por seleccionar
un territorio bajo control, este se resalta añadiendo un tono de oscuridad a la tropa
y se muestra el número de tropas al lado de la figura, encima de las tropas que hay
en ese territorio. 4.5. A continuación con el ataque seleccionado se pulsa sobre
un territorio enemigo adyacente al anterior.
• Confirmar ataque: Se debe pulsar el botón situado en la parte central justo encima del tablero, cuyo título es ”Ataque” para que aleatoriamente se muestren los
38
Figura 4.5: Captura de la escena de ataque de Battlex
resultados del ataque.
• Retroalimentación posterior al ataque: Inmediatamente a realizar el ataque se
muestran los resultados y se quedan resaltados los territorios involucrados para
que el usuario sepa donde se ha realizado la acción.
Fortificar: Simplemente se selecciona el territorio desde el que se quieren mover tropas, el cual se resaltará y se mostrará el número de tropas a desplazar, y a continuación
se pulsa el territorio al que se desean mover las tropas para fortificar esa zona. 4.6.
Figura 4.6: Captura de la escena fortificar de Battlex
4.2.2
Arquitectura de la aplicación
Estará basada en módulos bien marcados por los SDK y/o API utilizadas para llevar a cabo
el proyecto, a continuación se describirán los módulos de la arquitectura de la aplicación
(Figura 4.7):
39
Figura 4.7: Arquitectura de Battlex
iOS: La base de la aplicación es el sistema operativo para dispositivos móviles de
Apple. El lenguaje para todos los módulos de la aplicación será el ya comentado
Objective-C y la versión mínima que soporta la aplicación será iOS 4.3.
Cocos2d: El framework gráfico que se utiliza en la aplicación, para navegar a través de
las diferentes escenas (CCScene) del juego gracias al director de escenas (CCDirector)
y dibujar las diferentes capas (CCLayer) donde se dibujarán el terreno del juego usando
mapas (CCTMXTiledMap), y las tropas de los jugadores (CCSprites).
Escenas de Juego: Como se ha comentado, el framework ofrece un director de escenas
que es el encargado de hacer la transición entre las mismas.
Primero se crean la escenas (Listado 4.1).
+ ( CCScene ⇤) scene
{
CCScene ⇤ scene = [ CCScene node ];
GameListScene ⇤ gameListScene = [ GameListScene node ];
[ scene addChild : gameListScene ];
return scene ;
}
Listado 4.1: Creación de una escena con Cocos2d
40
Y a continuación se cambia de escena hacia una nueva utilizando cualquier tipo de
transiciónes que ofrece el framework, como se puede ver en el listado 4.2 o se vuelve
a la escena anterior como en el listado 4.3.
CCTransitionFlipY ⇤ tran = [ CC Transi tionFl ipY
t r a n s i t i o n W i t h D u r a t i o n :0.5
scene :[ SingUpScene scene ]];
[[ CCDirector sharedDirector ] replaceScene : tran ];
Listado 4.2: Reemplazo de escena con efecto FlipY
[[ CCDirector sharedDirector ] popScene ];
Listado 4.3: Liberación de la escena actual
Escenas Registro y Login: Aunque no comparten la misma funcionalidad a nivel
visual muestran un formulario muy similar y básicamente se comunican con la capa
de servicios usando el modelo de datos para realizar las acciones pertinentes, registrar
nuevos usuarios e identificar usuarios respectivamente.
Como ejemplo en la figura 4.8, se puede observar el flujo de las llamadas entre las
diferentes capas para realizar un login con éxito y hacer una transición a la escena de
Partidas. El usuario se identifica en la ”Escena Login” llamando al servicio con sus
credenciales, el servicio responde con éxito (success) entonces ésta escena llama al
método scene de .Escena Partidas"la cual devuelve una instancia de si misma y entonces
la escena de login llama al CCDirector para realizar que realice la transición entre las
escenas.
Figura 4.8: Flujo de datos: Login con éxito
Escena Partidas: Esta escena muestra la tabla que contiene las partidas en juego del
usuario previamente identificado cuya configuración se muestra en el listado 4.4.
41
(void) o n E n t e r T r a n s i t i o n D i d F i n i s h
{
self . winSize = [[ CCDirector sharedDirector ] winSize ];
CCLabelTTF ⇤ tableTitle = [[ CCLabelTTF alloc ] initWithString : @ " Mi turno
" dimensions : CGSizeMake ( self . winSize . width ⇤ 0.85 / 2 , 20)
hAlignment : k C C T e x t A l i g n m e n t C e n ter vAlignment :
k C C V e r t i c a l T e x t A l i g n m e n t C e n t e r fontName : @ " Helvetica Light "
fontSize :15];
[ tableTitle setPosition : CGPointMake ( self . winSize . width ⇤ 0.05 + (
tableTitle . dimensions . width / 2) , ( self . winSize . height ⇤ 0.8) + (
tableTitle . dimensions . height / 2) ) ];
[ self addChild : tableTitle z :0 tag :504];
CGRect frame = CGRectMake ( self . winSize . width ⇤ 0.05 , self . winSize .
height ⇤ 0.2 , self . winSize . width ⇤ 0.85 / 2 , self . winSize . height ⇤
0.8) ;
self . tableView = [[ UITableView alloc ] initWithFrame : frame style :
UIT able Vi e w S t y l e P l a i n ];
[ self . tableView setS eparat orInse t : UIEdgeInsetsMake (0 , 0 , 0 , 0) ];
self . tableView . rowHeight = 58;
self . tableView . dataSource = self ;
self . tableView . delegate = self ;
[[[ CCDirector sharedDirector ] view ] addSubview : self . tableView ];
}
Listado 4.4: Configuración de la tabla de partidas
self . miTurnoTable = [ MiTurnoTable node ];
self . noMiTurnoTable = [ NoMiTurnoTable node ];
[ self addChild : self . miTurnoTable ];
[ self addChild : self . noMiTurnoTable ];
Listado 4.5: Creación y agregación de tablas de partidas en la escena
Se muestran dos tablas, una con las partidas que toca jugar al usuario identificado y
otra en la que se muestran las que le toca jugar a alguno de los rivales. Cada una de
ellas está en una clase diferente y se añaden a la escena como se puede ver en el listado
4.5.
Para que las tablas muestren las partidas es necesario llamar al servicio para obtener
las partidas del usuario. El flujo de llamadas se puede ver en la figura 4.9. Cuando
se carga la escena de partidas, ésta llama al servicio para obtener los datos de las
partidas del jugador identificado. A continuación el servicio devuelve un diccionario
con las partidas, entonces la escena llama al modelo de datos para que traduzca esos
diccionarios en objetos del mismo.
42
Figura 4.9: Flujo de datos: Cargar Partidas
Para terminar de analizar las tablas de partidas, se muestran las acciones a realizar
cuando el usuario escoge una partida en la que le toca jugar en el listado 4.6.
}
(void) tableView :( UITableView ⇤) tableView d i d S e l e c t R o w A t I n d e x P a t h :(
NSIndexPath ⇤) indexPath {
CCScene ⇤ scene = nil ;
switch ([ self . partidaList partidaAtIndex : indexPath . row ]. fase ) {
case 0:
scene = [ ReclutasScene scene :[ self . partidaList
partidaAtIndex : indexPath . row ]];
break;
case 1:
scene = [ AtaqueScene scene :[ self . partidaList
partidaAtIndex : indexPath . row ]];
break;
case 2:
scene = [ RecolocarScene scene :[ self . partidaList
partidaAtIndex : indexPath . row ]];
}
[[ CCDirector sharedDirector ] pushScene :[ CCTransitionFade
t r a n s i t i o n W i t h D u r a t i o n :0 scene : scene withColor : ccWHITE ]];
Listado 4.6: Selección de partida cuando se es poseedor del turno
Por último para mostrar un ejemplo del uso de la función guardar en el servicio, se
muestra en la figura 4.10 el flujo de datos que hace la presente escena a la hora de
generar una nueva partida y guardarla en el servidor. En este caso la escena de partidas,
genera una nueva partida, a continuación con el modelo de datos obtiene un diccionario
para llamar así al servicio y guardar ese diccionario de partida.
43
Figura 4.10: Flujo de datos: Crear Partida
Escena Juego: En este apartado se van a describir las escenas del juego. Son muy
similares ya que todas comparten la capa del tablero y como ya se ha comentado la
diferencia entre ellas son los controles. Lo primero es crear el tablero y añadirlo a la
escena, se inicializa la escena configurando el tablero a través del modelo ”Partida”
como se puede observar en el listado 4.7.
}
(id ) initWithMapa :( Partida ⇤) fromPartida {
if ( self = [ super initWithColor : ccc4 (218 ,219 ,220 ,255) ]) {
self . isTouchEnabled = YES ;
self . partida = fromPartida ;
[ self guardarJugador ];
self . winSize = [[ CCDirector sharedDirector ] winSize ];
NSString ⇤ mapName = @ " TileMap101x88_2 . tmx " ;
self . tileMap = [ CCTMXTiledMap t i le d M ap W i th T M XF i l e : mapName ];
[ self addChild : self . tileMap z :1 tag :1];
[ self centrarTileMap ];
}
return self ;
Listado 4.7: Creación y configuración del tablero de juego
Después de configurar el mapa se dibujan sobre éste las tropas de caja jugador como
se puede ver el el listado 4.8.
{
(void) cargarReclutas
self . playerList = [ PlayerList new ];
for ( NSInteger i = 0; i < self . tileMap . mapSize . height ; i ++) {
for ( NSInteger j = 0; j < self . tileMap . mapSize . width ; j ++) {
Tropa ⇤ tropa = [ Tropa new ];
[ tropa setSprite :[[[ CCSprite alloc ] initWithFile :[ self
colorTile : j conY : i ]] autorelease ]];
44
}
}
}
[ tropa setPosition : CGPointMake (j , i ) ];
CGPoint position = [ self p o i n t L o c a t i o n F r o m T i l e : CGPointMake
(j , i ) ];
position . x = 4;
[ tropa . sprite setPosition : position ];
[ self addChild : tropa . sprite z :2];
tropa . nTropas = (( Casilla ⇤) [ self . partida . mapa
casillaWithCoor : j andCoorY : i ]) . nTropas ;
tropa . o b j ec t IdP r o pi e t ar i o = (( Casilla ⇤) [ self . partida . mapa
casillaWithCoor : j andCoorY : i ]) . ob j e ct I d Pr o p ie t a ri o ;
tropa . nTropasLabel = [[ CCLabelTTF alloc ] initWithString
:[ NSString stringWithFormat : @ " %@ " , @ ( tropa . nTropas ) ]
dimensions : CGSizeMake (16 , 12) hAlignment :
k C C T e x t A l i g n m e n t C e n t e r vAlignment :
k C C V e r t i c a l T e x t A l i g n m e n t C e n t e r fontName : @ " Helvetica "
fontSize :11];
[ tropa . nTropasLabel setColor : ccc3 (0 , 0 , 0) ];
[ tropa . nTropasLabel setPosition : CGPointMake ( tropa . sprite .
position . x + ([ tropa . sprite boundingBox ]. size . width /
2) + 4 , tropa . sprite . position . y
([ tropa . sprite
boundingBox ]. size . height / 2) + 6) ];
[ self addChild : tropa . nTropasLabel z :2];
tropa . tropasUsarLabel = [[ CCLabelTTF alloc ] initWithString
: @ " " dimensions : CGSizeMake (16 , 12) hAlignment :
k C C T e x t A l i g n m e n t C e n t e r vAlignment :
k C C V e r t i c a l T e x t A l i g n m e n t C e n t e r fontName : @ " Helvetica "
fontSize :11];
[ tropa . tropasUsarLabel setPosition : CGPointMake ( tropa .
nTropasLabel . position .x , tropa . sprite . position . y + ([
tropa . sprite boundingBox ]. size . height / 2)
6) ];
[ tropa . tropasUsarLabel setColor : ccc3 (255 , 255 , 255) ];
[ self addChild : tropa . tropasUsarLabel z :2];
[ self . playerList addPlayer : tropa ];
Listado 4.8: Colocación de tropas sobre el tablero
Una vez se ha visto como se configura el mapa se va a definir brevemente las configuraciones de los controles, en las diferentes escenas del juego que se están definiendo.
• Refuerzos: En esta escena se configura un menú (CCMenu) con una serie de
elementos (CCMenuItem) los cuales son: Botón para volver a la escena de las
partidas, una tropa como leyenda para que el jugador sepa cual es su color, una
etiqueta con el número de tropas de refuerzo que se pueden colocar en el mapa y
un botón para pasar a la escena de ataque.
En esta escena se detecta cuando el usuario toca un territorio del tablero y si es
controlado por él, se añade una tropa de refuerzo en el territorio.
• Ataque: En esta escena también se configura un menú como en la anterior, hay
elementos similares como el botón para volver a la escena de partidas y el botón
para avanzar de escena de juego. Los controles que se añaden en esta fase son un
45
marcador con diferentes elementos.
El marcador tiene una etiqueta con el nombre del jugador actual, otra con la abreviatura ”vs” y a continuación el nombre del rival contra el que efectúa el ataque.
Debajo de cada jugador se mostrará el resultado de los ”dados” de cada jugador
cuando se pulse el botón ”Ataque” situado debajo de la abreviatura anteriormente
citada.
Todas las escenas de juego actualizan adecuadamente los datos en el servidor
cuando los jugadores terminan cada fase, pero en el caso del ataque, se guarda
cada ver que uno de éstos se realiza, ya que no hay vuelta atrás cuando se ha
realizado uno. En la figura 4.11 se puede observar el flujo de datos para llevar a
cabo la función de actualizar las casillas afectadas en el ataque.
Figura 4.11: Flujo de datos: Actualizar casillas después del ataque
• Fortificar: En esta escena la única diferencia es que se muestra el nombre del
jugador en una etiqueta centrada en la parte superior.
Aquí se resalta el territorio desde el que se quieren mover tropas, aparece una
etiqueta al lado del sprite que informa del número de tropas que se quieren mover,
y una vez seleccionado otro territorio, éstas se mueven y desaparece el resaltado
y la etiqueta.
Modelo de datos: Se utiliza esta capa para hacer más fácil la tarea del manejo de
datos, ya que la capa de servicios devuelve diccionarios, éstos son traducidos a objetos
de éste modelo de datos. Son utilizados por las escenas para configurarse y tratar la
información que contienen. Un ejemplo de modelos de datos utilizados puede verse a
continuación en el listado 4.9.
46
@interface Partida : NSObject
@property
@property
@property
@property
@property
@property
@property
( nonatomic ,
( nonatomic ,
( nonatomic )
( nonatomic ,
( nonatomic )
( nonatomic )
( nonatomic )
strong ) NSString ⇤ objectId ;
strong ) Mapa ⇤ mapa ;
NSInteger fase ;
strong ) JugadorColorList ⇤ jugadorColorList ;
NSInteger TurnoIndex ;
NSInteger LeaderIndex ;
NSInteger LeaderCount ;
@end
@interface Mapa : NSObject
@property ( nonatomic , strong ) NSString ⇤ objectId ;
@property ( nonatomic , strong ) NSString ⇤ nombre ;
@property ( nonatomic , strong ) NSMutableArray ⇤ casillas ;
( Casilla ⇤) casillaWithCoor :( NSInteger ) x andCoorY :( NSInteger ) y ;
(void) reemp lazarC asilla :( Casilla ⇤) nuevaCasilla ;
@end
Listado 4.9: Ejemplo de Modelos de datos Partida y Mapa
Parse SDK: Se utiliza para comunicarse con el servicio en la nube proporcionado por
Parse. Para ello se sirve de dos clases principales PFUser y PFObject que básicamente
son diccionarios que asocian elementos con claves. Tienen una funcionalidad muy
extensa y aunque se utilizan más elementos, por su extensión no serán nombrados en
este apartado.
Como ejemplo, se han mostrado figuras en algunas de las escenas anteriores para que
se pudiera observar el flujo de datos que se realizan cuando se hace uso de la capa de
servicios que a continuación se va a detallar. Se han mostrado ejemplos de restaurar
(figura 4.9), guardar (figura 4.10) y actualizar (figura 4.11) objetos en el servicio.
Guardar: En el caso de guardar objetos en la nube, se utilizan las clases del SDK
nombradas anteriormente, como se puede observar en el listado 4.10 el ejemplo de
creación de nuevos usuarios.
PFUser ⇤ newUser = [ PFUser user ];
[ newUser setUsername : self . userName . text ];
[ newUser setPassword : self . password . text ];
[ newUser setEmail : self . email . text ];
[ newUser s i g n U p I n B a c k g r o u n d W i t h B l o c k :^( BOOL succeeded , NSError ⇤ error )
{}];
Listado 4.10: Creación de un usuario utilizando Parse SDK
Restaurar Hay muchas maneras diferentes de buscar o pedir objetos a la base de datos
almacenada en la nube, en algunos casos se utiliza la clase PFQuery para formular
47
peticiones y así obtener la respuesta mas eficiente en cada caso. Como por ejemplo
cuando se quieren listar las partidas de un usuario, se busca en la tabla partidas donde,
en el campo de ”Jugadores” exista la coincidencia con el usuario identificado en la
aplicación (listado 4.11).
PFQuery ⇤ query = [ PFQuery queryWi thC la ss Na me : @ " Partida " ];
[ query whereKey : @ " Jugadores " equalTo :[ PFUser currentUser ]];
[ query f i n d O b j e c t s I n B a c k g r o u n d W i t h B l o c k :^( NSArray ⇤ objects , NSError ⇤
error ) {}];
Listado 4.11: Petición de partidas del usuario utilizando Parse SDK
Actualizar: Habiendo obtenido el objeto y cambiado los parámetros a actualizar, la
manera de guardar esos cambios en la base de datos se puede ver en el listado 4.12.
PFObject ⇤ casillaObject = [ PFObject o b j ec t W it h C l as s N am e : @ " Casilla " ];
[ casillaObject setObjectId : casilla . objectId ];
[ casillaObject setObject : @ ( casilla . coorX ) forKey : @ " CoorX " ];
[ casillaObject setObject : @ ( casilla . coorY ) forKey : @ " CoorY " ];
[ casillaObject setObject : @ ( casilla . nTropas ) forKey : @ " NTropas " ];
[ casillaObject setObject :[ PFUser currentUser ] forKey : @ " Propietario " ];
[ casillaObject s a v e I n B a c k g r o u n d W i t h B l o c k :^( BOOL succeeded , NSError ⇤
error ) {}];
Listado 4.12: Actualización de una casilla utilizando Parse SDK
Los listados explicados anteriormente, son solo pequeños ejemplos del extenso código de
la aplicación, éste se puede ver en el CD adjunto donde se encuentra todo el código fuente y
los recursos utilizados para la implementación de Battlex.
4.3 Evolución del proyecto
En la presente sección se va a describir la evolución no sólo de la implementación, sino
también de todo el estudio previo que se ha llevado a cabo para la preparación de ésta.
4.3.1
1a Etapa: Definición general y Anteproyecto
Reunidos de una parte el director del presente proyecto y el alumno, se definieron los requisitos generales para llevar a cabo el proyecto. A través del estado del arte y los requisitos,
se decidieron también las tecnologías a utilizar. Con los aspectos generales definidos y sin
haber encontrado un proyecto igual, se pasó a redactar el Anteproyecto presentado.
4.3.2
2a Etapa: Estudio previo
fue necesario adquirir conocimientos sobre la plataforma iOS, el lenguaje de programación de la misma y el framework gráfico utilizado en la implementación, ya que estos no
48
se han adquirido previamente durante la carreara. Fue necesario mucho tiempo durante esta
etapa, ya que no sólo no se tenían conocimientos sobre la plataforma, sino que tampoco se
había tomado contacto previo con ninguna librería de gráficos.
Para adquirir los conocimientos necesarios, han sido de gran ayuda varios libros y sobre
todo los blogs sobre la plataforma. A continuación se van a citar algunas de las fuentes
usadas, que más importancia han tenido durante el estudio y el desarrollo.
Para realizar los primeros ejemplos e investigar sobre el framework gráfico escogido para el desarrollo se utilizaron principalmente dos libros escritos sobre el mismo,
Aprende Cocos 2d 2 ([y Andreas Löw(2012)]) y Aprende desarrollo de videojuegos
con cocos 2d en iOS 5 ([y Andreas Löw(2011)]).
El blog de Miguel Díaz Rubio también ha sido de gran ayuda, gracias a sus tutoriales
([Rubio(2013a)]).
Durante la primera toma de contacto con iOS, los mejores tutoriales para adquirir la base de programación fueron los del blog de desarrollo Manzana mágica ([Mágica(2012)]).
La mayor comunidad utilizada para la ayuda cuando se ha visto atascado el desarrollo ha sido Stack Overflow ([Inc(2014)]), indiferentemente de la tecnología en esta
comunidad se ha buscado respuesta a las numerosas dificultades encontradas.
4.3.3
3a Etapa: Implementación
Después de la segunda etapa, habiendo adquirido conocimientos básicos sobre como llevar a cabo el proyecto y siguiendo la metodología anteriormente explicada, eXtreme Programming, se llevaron a cabo una serie de iteraciones. Éstas se definieron de manera que
se marcaban hitos, para de un modo incremental, completar un prototipo funcional de la
aplicación.
1a Iteración: Diseño del tablero de juego: En esta etapa se configuraron las herramientas necesarias para crear un ejemplo de proyecto de cocos2d. Este venía con una
escena de ejemplo, sobre la que se comenzaron a crear los primeros diseños del tablero y a tomar contacto con el framework gráfico. También se implementaron los gestos
para calcular los territorios que se pulsaban por el usuario y se pusieron sprites como
ejemplo de las tropas que se situarían en el futuro (Figura 4.12).
Como resultado se obtuvo un tablero con territorios hexagonales sobre el que se podía
obtener la información de los territorios pulsados. El proyecto podía ser compilado y
probado en dispositivos reales o el simulador de iOS. Éste mostraba una pantalla de
inicio de ejemplo donde estaba dibujado el logo de cocos2d y a continuación cuando
cargaba la escena, se podía ver e interactuar con el mapa.
2a Iteración: Escenas de juego: Esta iteración fue la más complicada, pues ya había que implementar lógica e jugadores, transiciones y sincronización (local en primer
49
Figura 4.12: Protipo Tablero Battlex
lugar). Entonces se crearon las siguientes tareas para cumplir el objetivo de esta iteración:
• Implementación del resto modelos para el manejo de datos.
• Creación de las diferentes escenas y sus transiciones.
• Implementación de escena de refuerzos.
• Implementación de escena de ataque.
• Implementación de escena de fortificar.
• Diseño de iconos y botones.
• Diseño de fondos.
El resultado des esta iteración fue un prototipo en el que se podía interactuar con las
escenas con su respectiva lógica, pero sin persistencia en la nube ni inicio de sesión.
Permitía colocar nuevas tropas sobre el tablero en la escena de refuerzos, realizar ataques entre territorios y migrar tropas de unos a otros. Pero no permitía jugar una partida
real ya que no se tenía gestión de los usuarios. Fue la iteración más larga y en la que
se aprendio más sobre el framework y sus diferentes clases, como CCDirector para la
transición entre escenas y CCMenu y CCMenuItem para la creación de los menús de
controles de cada escena.
3a Iteración: Controles: En esta etapa se definió la experiencia de usuario de cada
escena.
Para la escena de fortificar se definió la interacción de como colocar los refuerzos sobre
el tablero, de manera que cada vez que el usuario pulsara un territorio controlado por
él, se sumaba una tropa, mientras quedaran tropas de refuerzo, en cuyo caso se activaría
el botón para pasar a la siguiente fase. También se podían deshacer los cambios para
comenzar de nuevo a colocar los refuerzos.
50
En la escena de ataque, éste estaba definido de manera que se seleccionaba el territorio
origen y con un contro de + y -, se aumentaban las tropas con las que efectuar el ataque
y, a continuación, se seleccionaba el objetivo. Por último se pulsaba el botón de ataque
para realizarlo. Pero la selección del número de atacantes fue mejorada, pues lo que
se decidio fue que se mostraba el número de tropas elegidas al lado de la tropa en el
territorio y, cada vez que se pulsase, éste número aumentaría hasta alcanzar el valor
deseado.
Por último la escena de fortificar es muy similar a la elección del atacante en la anterior. Se pulsa el territorio tantas veces como para alcanzar el valor de tropas a mover
deseado y se pulsa después en el destino para mover las tropas.
Esta iteración no fue complicada en cuanto a implementación se refiere, sino que se intentó alcanzar la mejor experiencia posible para la comodidad del usuario. El resultado
fue la experiencia explicada anteriormente, aún sin gestión de usuarios.
4a Iteración: Registro e identificación: En esta iteración se comenzó a integrar el
SDK de Parse para iOS, que permitía la comunicación con un servidor en la nube, para
implementar la lógica de registro e identificación, además de toda la persistencia de
los datos del juego en la base de datos remota.
Se creó la cuenta en Parse para registrar la aplicación en el sistema y poder comunicarse con éste desde la aplicación. Después de integrar el SDK y configurar las claves
en la clase principal de la aplicación, se comenzaron a hacer pruebas de registro e
identificación.
En esta iteración también se crearon los formularios de las escenas de registro y login
y se hicieron pruebas con datos obtenidos desde éstos para realizar las pruebas.
Gracias a la documentación en la web de Parse https://parse.com/docs/, no se
tuvo demasiada complicación mas allá de la familiarización con el uso de sus clases.
El resultado fueron las escenas con los formularios que recibían datos de los usuarios
y registraban o identificaban a éstos.
5a Iteración: Persistencia en la nube: Esta iteración fue una de las más complicadas.
En ella se hizo uso del portal de la web de Parse para crear la base de datos remota y
poder guardar, recuperar y actualizar los datos de las partidas, jugadores, etc.
En la figura 4.13 se pueden ver el panel de clases creadas en el Explorador de Clases
del portal de Parse.
Se observan las clases principales para llevar a cabo la gestión de las partidas y los
jugadores.
En esta etapa se implementaron una serie de tareas asociadas a la persistencia en la
nube:
51
Figura 4.13: Explorador de clases de Parse
• Recuperación de partidas del usuario identificado.
• Recuperación de una partida seleccionada de entre las anteriores y mostrada la
información en el tablero, en la escena correspondiente a la fase actual de la
partida.
• Creación y guardado de partidas del usuario identificado.
• Actualización de las casillas modificadas en la escena de refuerzos.
• Actualización de las casillas afectadas en los ataques efectuados por un jugador
durante la fase de ataque.
• Actualización de las casillas modificadas durante la fase de fortificar territorios.
El resultado fue un prototipo de aplicación en la que se podían registrar e identificar usuarios y hacer uso de todas las funcionalidades citadas, es decir, ya se
podía jugar con la aplicación a falta de la gestión de notificaciones y revision de
diseño.
6a Iteración: Notificaciones: Se llevó a cabo en esta la gestión de notificaciones, para
avisar a los jugadores de los cambios en sus partidas, haciendo uso de la plataforma de
parse.
Se puede observar en la figura 4.14, como se muestra la llegada de una notificación de
Battlex.
Para realizar esta iteración se hizo uso nuevamente del SDK de Parse y de una clase
especial proporcionada por la plataforma llamada ”Installation” (Instalación). En ella
se guardaban los identificadores únicos de dispositivo (UDID) en el momento de la
identificación, para asociar un usuario con su dispositivo.
Entonces para mandar una notificación, una vez un jugador había completado todas las
fases de su turno, se configura ésta y se le dice a la plataforma que mande el mensaje
al dispositivo asociado con el usuario al que pasa el turno.
7a Iteración: Revisión de Diseño: Con el fin de que la aplicación tuviera una interfaz
agradable y actualizada a los diseños de aplicaciones actuales, se llevo a cabo una
revisión de diseño de iconos, creando éstos con programas como Adobe Illustrator, el
52
Figura 4.14: Notificación de partida de Battlex
cual también se usó para diseñar los fondos, botones, tablero, hexágonos y con una
plantilla de soldados, personalizarlos para hacer uso de estos dentro de la aplicación.
Se obtuvo por tanto la aplicación que ya funcionaba correctamente en la iteración
anterior, pero con la interfaz mejorada.
4.3.4
4a Etapa: Documentación
En esta última etapa se comenzó a redactar la memoria, detallando toda la evolución,
herramientas, estado del arte, etc, en el que se ha basado para realizar el trabajo.
4.4 Pruebas Realizadas
En esta sección se definirán los diferentes tipos de pruebas realizadas sobre la aplicación.
Pruebas de compatibilidad entre dispositivos, pruebas de jugabilidad y pruebas de funcionalidad.
4.4.1
Pruebas de Compatibilidad
En la subsección 2.4.2 se identificaron los dispositivos que se iban a utilizar para probar
la aplicación durante el desarrollo. El problema es que al comienzo del desarrollo sólo se
tenía como dispositivo de pruebas el iPhone 4, lo que derivó mas tarde en problemas de
compatibilidad al compilar la aplicación para iPad.
Cuando se realizó la primera compilación del proyecto para el iPad, ya se había implementado toda la lógica de las escenas del juego, sólo quedaba por implementar la integración con
el servicio, entonces aparecieron problemas de compatibilidad:
Interfaz: Los recursos (como imágenes, fondos, etc) no estaban hechos para soportar
la resolución del iPad. Las dimensiones de los elementos de pantalla (cajas de texto,
botones, etiquetas, etc) no estaban implementadas relativas al tamaño de cada pantalla.
Lógica: El tamaño del mapa es siempre el mismo, y la lógica para detectar la celda
53
pulsada por el usuario está hecha para un mapa con las dimensiones de un iPhone.
Versiones: La aplicación se ha probado en versiones de iOS desde la 5.0 y el proyecto
está configurado para que la aplicación pueda ser usada en dispositivos iOS con ésta
versión como mínimo.
Apple recomienda siempre que saca una nueva versión de iOS, que los desarrolladores
actualicen sus aplicaciones a esa última, sin embargo se puede ofrecer la aplicación
para diferentes versiones, con esto se pueden aprovechar las mejoras del sistema operativo en cada versión, sin que los usuarios con versiones anteriores tengan que dejar
de actualizar la aplicación.
La solución a estos problemas de compatibilidad se solucionó configurando el proyecto
para que la compilación no fuera universal (Figura 4.15), sino que fuera optimizada para
iPhone y en este caso el iPhone 4.
Figura 4.15: Dispositivos de la configuración del proyecto
Esta solución no significa que la aplicación no funcione en iPad, pero si que funcionará
en el modo iPhone en este dispositivo. Este modo permite escalar la aplicación para que se
vea dos veces más grande y sea completamente funcional al igual que en iphone 4 (Figura
4.16).
Figura 4.16: Captura de Battlex en ejecución en iPad
54
4.4.2
Pruebas de Jugabilidad
Para realizar las pruebas de jugabilidad se hizo una encuesta (Anexo D) que realizaron
algunos compañeros. A continuación se van a mostrar los resultados obtenidos mediante
dicha encuesta y las conclusiones al respecto.
Los siguientes gráficos muestran los resultados obtenidos después de encuestar a 15 personas.
Jugabilidad Intrínseca
Figura 4.17: Resultados de la faceta de Jugabilidad Intrínseca
En la gráfico de la figura 4.17 se pueden ver los puntos flojos de esta faceta, como en la
efectividad, que se debe a la estadística de la puntuación obtenida de los dados ya que que
perjudicaría al atacante, y el requisito social se debe a que no se pueden elegir los rivales a
la hora de crear las partidas, estos se general aleatoriamente.
Jugabilidad Mecánica
Figura 4.18: Resultados de la faceta de Jugabilidad Mecánica
En general la figura 4.18 muestra buenos resultados, sin embargo la menor puntuación la
55
obtiene el requisito de satisfacción, esto se debe a que se utiliza un servidor externo y podría
darse el caso de qu tarde en responder a las peticiones.
Jugabilidad Interactiva
Figura 4.19: Resultados de la faceta de Jugabilidad Interactiva
En la figura 4.19 se obtienen resultados muy bajos en el requisito social ya que no existe
comunicación entre los jugadores durante la partida, y la motivación puede deberse a que no
se interpretan fácilmente los resultados de los ataques.
Jugabilidad Artística
Figura 4.20: Resultados de la faceta de Jugabilidad Artística
En general en la figura 4.20 se obtienen buenos resultados, la puntuación más baja es la
obtenida en la faceta de satisfacción, en lo referido al diseño de la interfaz de usuario.
56
Jugabilidad Intrapersonal
Figura 4.21: Resultados de la faceta de Jugabilidad Intrapersonal
En la figura 4.21 se obtiene puntuación regular en 4 de 7 requisitos:
Satisfacción: Se ve como los usuarios están a medio camino entre el juego de tablero
original y el uso de la aplicación
Aprendizaje: Se interpreta de manera que los jugadores que conocen el juego si saben
usar la aplicación y los que no necesitan ayuda para conocer las reglas.
Efectividad: Como se ha comentado antes, si las partidas no avanzan rápido es debido
a que la mayoría de las puntuaciones de los ataques favorecen a los defensores.
Inmersión: El usuario no tiene demasiada sensación de que está organizando sus tropas
en una guerra.
Jugabilidad Interpersonal
Figura 4.22: Resultados de la faceta de Jugabilidad Interpersonal
57
Los puntos más flojos de esta faceta son:
Inmersión: La comunicación y control sobre las partidas no está presente mas allá de
jugar la partida seleccionada, no hay personalización de las mismas.
Motivación: No existe sistema de recompensas en el juego, por lo que este requisito
tiene una puntuación muy baja.
Conclusiones
La puntuación global sobre la aplicación al realizar el test sobre 15 personas ha sido de
3,46 sobre 5.
Se es consciente de las limitaciones en cuanto a todos los aspectos que engloban la realización de un juego, por eso hay algunos puntos que mejorar en el futuro, estos puntos de
mejoras futuras se expondrán más adelante en la sección 5.5.
4.4.3
Pruebas de Funcionalidad
Para realizar las pruebas de funcionalidad del software, durante el desarrollo se implementaron registros que mostraban en la consola de XCode los resultados a la hora de procesar
los datos.
Para realizar los registros se utiliza la clase de objective-C llamada NSLog, en el listado
4.13 se puede ver un ejemplo del código necesario para lanzarlo. A continuación se describirán algunas de las partes que componen la aplicación, con el fin de mostrar como se realizan
los registros a la hora de probar las funcionalidades del software y recibir retroalimentación
de los eventos que se realizan durante la ejecución de la misma.
NSLog ( @ " Error : %@ %@ " , error , [ error userInfo ]) ;
Listado 4.13: Ejemplo de registro con la clase NSLog
Obtener partidas de usuario
En la subsección 4.2.2 se definió la manera de crear la escena donde se cargan las partidas
de usuarios y se muestra un diagrama de flujo de datos (Figura 4.9) de las llamadas que
se producen al cargar las partidas. A continuación se describirá la manera de registrar los
eventos que suceden durante este flujo de datos.
Carga de la escena: Existen dos maneras de acceder a esta escena, la primera es haciendo
login desde la escena de login y la segunda es entrando en la aplicación con el usuario
cacheado localmente en el dispositivo.
Desde login: En el siguiente listado (listado 4.14) se muestran los registros que se
capturan desde que el usuario se identifica hasta que se carga la escena de partidas.
58
2014 08 21 21:16:46.687 Battlex [608:60 b ]
Correcto
2014 08 21 21:16:46.688 Battlex [608:60 b ]
GameListScene
2014 08 21 21:16:46.691 Battlex [608:60 b ]
Instancia de la escena creada
2014 08 21 21:16:47.262 Battlex [608:60 b ]
y tablas cargados
( Escena Login ) Login
( Escena Login ) Cargando
( Escena Partidas )
( Escena Partidas ) Menus
Listado 4.14: Login correcto, transición a Escena Partidas
Usuario cacheado: En el listado (listado 4.15) se muestrar los registros que se capturan desde que arranca la aplicación y se identifica el usuario cacheado, hasta que se
carga la escena de partidas.
2014 08 21 21:47:42.630 Battlex [624:60 b ]
cache
2014 08 21 21:47:42.664 Battlex [624:60 b ]
GameListScene
2014 08 21 21:47:42.669 Battlex [624:60 b ]
Instancia de la escena creada
2014 08 21 21:47:42.711 Battlex [624:60 b ]
started with frame interval : 60.00
2014 08 21 21:47:42.743 Battlex [624:60 b ]
960 x640
2014 08 21 21:47:43.068 Battlex [624:60 b ]
y tablas cargados
( AppDelegate ) Usuario en
( AppDelegate ) Cargando
( Escena Partidas )
cocos2d : animation
cocos2d : surface size :
( Escena Partidas ) Menus
Listado 4.15: Usuario cacheado, transición a Escena Partidas
Por supuesto, cuando el dispositivo se queda sin conexión a internet y se intanta acceder al
servicio, también se muestra un registro con el mensaje de error concreto (listado 4.16).
2014 08 21 21:55:08.342 Battlex [624:182 b ] Error : Error Domain =
NSURLErrorDomain Code = 1009 " The Internet connection appears to be
offline . " UserInfo =0 x17da9930 { N S E r r o r F a i l i n g U R L S t r i n g K e y = https :/
/ api . parse . com /2/ update , N S E r r o r F a i l i n g U R L K e y = https :/ / api . parse .
com /2/ update , NS Lo cal i z e d D e s c r i p t i o n = The Internet connection
appears to be offline . , N SUnder lying Error =0 x17d6e9c0 " The Internet
connection appears to be offline . " } ( Code : 100 , Version : 1.2.19)
Listado 4.16: Registro de error sin conexión
Obtener partidas del servicio
A continaución se definirán brevemente los registros con los cuales se puede observar
como se van obteniendo los datos del servicio, desde las partidas de un jugador, después
los jugadores que forman la partida, y por último las casillas que conforman el mapa, hasta
conseguir mostrar los datos de las partidas en las tablas.
Obtener partidas del jugador: Cuando la petición al servicio ha tendido éxito antes
59
de comenzar el procesamiento de la respuesta se muestra un registro en la consola
informando de ello.
Obtener jugadores de cada partida: Una vez que se han recuperado las partidas, por
cada una de ellas se manda una nueva petición para obtener los jugadores, cuando llega
la respuesta un registro informa del resultado.
Obtener casillas del mapa: Nuevamente, cada tabla por separado creará otra petición
por cada elemento de la tabla para pedir las casillas que corresponden al mapa de la
partida, este ya ha sido recuperado en la petición de la partida. Se mostrará un registro
cada vez que se obtengan las casillas de una partida.
Mostrar contenido de las partidas en las tablas: Cuando se ha terminado de recibir
toda la información anterior, se lanza un método de la clase UITableView llamado
”reloadData” que realizará la recarga de los datos para mostrarlos en pantalla, una vez
se haya realizado la recarga un registro informa de ello, significará que en la pantalla
se podrá visualizar la información de las partidas.
Como ejemplo en la lista 4.17, se muestran los registros de obtener los datos de las partidas
del usuario ”Test”, para que no fuera muy extenso, se creó este usuario con una sola partida,
así se entiende mejor la secuencia de los registros.
2014 08 21 23:54:32.498 Battlex [704:60 b ] Partida Creada
2014 08 21 23:54:36.468 Battlex [704:60 b ] ( GameListScene ) Partidas de
Test recibidas
2014 08 21 23:54:36.471 Battlex [704:60 b ] Partida : < Partida : yN7TlsyWqx
:( null ) > {
Fase = 1;
Jugadores =
(
" < PFUser : a8OWYkf2HY :( null ) > {\ n } " ,
" < PFUser :1 AUwXcSOe7 :( null ) > {\ n } " ,
" < PFUser :8 lshWGgpNE :( null ) > {\ n } "
);
LeaderCount = 0;
LeaderIndex = " 1" ;
Mapa = " < Mapa : gp7JHfecHK > " ;
TurnoIndex = 0;
}
2014 08 21 23:54:36.720 Battlex [704:60 b ] ( GameListScene ) Jugadores de
partida : yN7TlsyWqx recibidas
2014 08 21 23:54:37.169 Battlex [704:60 b ] ( MiTurnoTable ) Casillas de
partida : yN7TlsyWqx recibidas
2014 08 21 23:54:37.183 Battlex [704:60 b ] ( MiTurnoTable ) Tabla
recargada
Listado 4.17: Registros de carga de partidas
En este punto ha quedado definido el registro que se hace de los comportamientos de la
aplicación desde que se hace login hasta que se muestran la información de las partidas en
las tablas.
60
Interacción con el mapa
En este punto se definirá un ejemplo de como se tiene constancia de que se está capturando correctamente el territorio que el usuario está pulsando. Con esto quedarán definidos
los diferentes comportamientos de la aplicación, no se ilustrarán los demás porque resultaría repetitivo, aunque sus registros están implementados en el código. Comportamientos
como navegar entre escenas, recuperación de datos desde el servidor y configuración de los
elementos de la vista, así como los registros de la interacción del usuario quedarán definidos.
Cálculo de territorio pulsado: La pantalla de ataque será sobre la que se mostrará el
ejemplo de captura y cálculo del territorio pulsado por el usuario.
En la figura 4.23 se puede observar como el territorio situado en la primera fila y cuarta
columna está sombreado y muestra el número de tropas atacantes en blanco.
Figura 4.23: Ejemplo del territorio pulsado
Justo desde el comienzo de la pulsación del usuario sobre la pantalla del dispositivo empiezan a producirse los cálculos, cuyo registro se muestra en el listado 4.18.
2014 08 22 00:27:53.669
132.50 200.00
2014 08 22 00:27:53.674
(265.0 , 400.0)
2014 08 22 00:27:53.680
territorio pulsado
2014 08 22 00:27:53.683
obtenido : (3 , 0)
2014 08 22 00:27:53.687
: (3.0 , 0.0)
2014 08 22 00:27:53.700
atacantes
Battlex [725:60 b ] ( AtaqueScene ) Punto pulsado :
Battlex [725:60 b ] ( AtaqueScene ) Pixel pulsado :
Battlex [725:60 b ] ( AtaqueScene ) Calculando
Battlex [725:60 b ] ( AtaqueScene ) Territorio
Battlex [725:60 b ] ( AtaqueScene ) Tropa Sombreada
Battlex [725:60 b ] ( AtaqueScene ) Aumentando
Listado 4.18: Registros de territorio pulsado
61
Como se puede observar en el registro del listado anterior, primero se muestra la coordenada del punto seleccionado, se llama punto porque por defecto iOS te devuelve esta medida,
en una pantalla retina como la que se utiliza en la prueba equivale a dos píxeles por punto,
como se muestra en el segundo registro. Después de mostrar esta información se procede a
calcular el territorio pulsado, es (3, 0) porque el primer número de fila y columna empieza
por 0. Una vez se ha calculado la coordenada del mapa del territorio, se realizan las llamadas
correspondientes para configurar visualmente el territorio.
Conclusiones
Aunque no se han realizado test unitarios, el sistema de pruebas realizado ofrece mucha
visibilidad sobre el estado de la aplicación en caso de que se produzca cualquier tipo de error
o excepción.
Como se ha tenido constancia, sobre todo en las llamadas al servicio, de cuando se producían errores que se tenía mucha información del estado de la aplicación como se ha podido
ver en los registros cuando se pierde la conexión, se ha considerado suficiente para gestionar
las pruebas de esta manera.
Aun así, para dar mas visibilidad sobre los errores, se podrían integrar herramientas de
gestión de errores, de terceros, que envían informes de errores y otros registros que se pudieran considerar relevantes, que les ocurren a los usuarios cuando la aplicación esta en
producción. Una de las posibilidades podría ser la reciente herramienta obtenida por Apple
llamada TestFlight (https://www.testflightapp.com).
62
Capítulo 5
Resultado y Conclusiones
E
N este capítulo, después de que el esfuerzo realizado durante el desarrollo haya dado sus
frutos, se resumirá de un modo general el trabajo llevado a cabo. También se procederá
a comparar los objetivos propuestos con los conseguidos y se expondrán las limitaciones de
las tecnologías utilizadas y propuestas de trabajo futuro.
5.1 Resultado
El resultado final obtenido como Trabajo fin de grado ha sido Battlex, nombre que aparece de fusionar la palabra en ingles Battle, que en la categoría militar significa: ”Encuentro
hostil entre fuerzas militares opuestas”, con otra palabra inglesa, Hexagon, que en castellano
quiere decir ”hexágono” o ”polígono de 6 lados”. La pronunciación de la primera sílaba de
la palabra Hexagon es similar a la de la letra ”x” en inglés. Ese es el origen del nombre, que
hace referencia a batallas en territorios con forma de hexágono, forma geométrica escogida
para el diseño del tablero.
Para realizar el desarrollo, se ha seguido la metodología ágil, eXtreme Programming. El
diseño y la experiencia de usuario se han realizado con el criterio UCD, siguiendo patrones y
guías de estilo de diseños planos, más simples y profundos.
El desarrollo se ha realizado de manera nativa para el sistema operativo de Apple, iOS,
optimizando el desarrollo para el dispositivo iPhone 4. De esta manera la dimensión del
mapa no cambia para un dispositivo iOS de 4 pulgadas, como podrían ser el iPhone 5, 5C
o 5S, ya que con el dispositivo en posición horizontal, solo cambia la anchura, y se tomó
la decisión de que los hexágonos fueran regulares, con lo cual se debían dejar iguales para
ambas resoluciones para no perder espacio para los controles.
Aún así la experiencia de usuario es muy similar, si no tenemos en cuenta que los dispositivos iPhone de 5a generación son superiores en hardware.
En las siguientes figuras se muestra el resultado visual de la aplicación, las diferentes
pantallas que la forman.
En la figura 5.1 se puede ver como el usuario a través de un formulario podrá introducir
sus datos para registrarse o identificarse.
63
Figura 5.1: Pantallas Registro y Login
Figura 5.2: Pantalla partidas
En la figura 5.2 se muestra la pantalla en la que el usuario, una vez identificado, podrá
interactuar con sus partidas, crear nuevas o cerrar la sesión.
En la figura 5.3 se muestra la pantalla de refuerzos, en la que el usuario podrá colocar las
tropas de refuerzo sobre sus territorios, deshacer los cambios, volver a la pantalla de partidas
o pasar a la siguiente fase.
En la figura 5.4 se puede observar la pantalla de ataque, en ella el usuario podrá realizar
sus ataques, seleccionando un territorio aliado y uno enemigo para realizar el ataque, cuyos
resultados se mostrarán en esta misma pantalla. A parte de esta función se podrá volver a la
pantalla de partidas o pasar a la siguiente fase igual que en la pantalla anterior.
Finalmente se muestra la figura 5.5 en la que se observa la pantalla de fortificar los territorios, en ella el usuario podrá realizar la fortificación de los territorios aliados que desee y
las funciones comunes de las pantallas del juego citadas anteriormente.
64
Figura 5.3: Pantalla refuerzos
Figura 5.4: Pantalla ataque
Figura 5.5: Pantalla fortificar
65
5.2 Aspectos Generales
Al principio del documento se citaban varias aplicaciones asíncronas famosas del mercado
actual de aplicaciones móviles. Pero no se encontró ninguna que estuviera basada en juegos
de conquista de territorios. Entonces se empezó a definir lo que sería la descripción del
problema.
Con lo cual, sin alternativas en el mercado de aplicaciones, al menos directas, pues existen
infinidad de juegos de guerra, estrategia y conquista de territorios, Battlex podría ser una
referencia en el campo de los juegos asíncronos, ya que se diferencia mucho del resto de
aplicaciones asíncronas actuales en la temática de juego, aunque todos comparte el mismo
origen, los juegos de mesa o tablero.
5.2.1
Adaptación de las reglas originales para crear una aplicación
asíncrona
Una de las fases clásicas de juegos de mesa como Risk, necesita de una respuesta directa
del rival a la hora de efectuar los ataques.
A la hora de definir los ataques, en el juego original, el defensor puede decidir hacer uso
de uno o dos dados de defensa. En el caso de Battlex se suprime esta decisión por parte del
defensor, ya que en el momento del ataque solo el atacante está interactuando con la partida.
Con lo cual cuando se efectúa un ataque el número de dados de la defensa será el máximo
posible, siendo 2 en caso de haber 2 o más tropas defendiendo un territorio atacado.
Otro de los aspectos que requerían una interacción menos amigable por parte de los integrantes de una partida era, el reparto de territorios. Ya que en el juego original, éstos se
sitúan en el tablero en orden de uno en uno pasando el turno de jugador en jugador en cada
colocación.
El reparto de territorios se adaptó de la siguiente manera: Se hace un reparto aleatorio de
los territorios siempre manteniendo el mismo número de los mismos controlados por cada
jugador.
En este aspecto, la estrategia de los jugadores al comienzo del juego podría verse mermada,
sin embargo, se ha definido una estrategia de adyacencia a la hora de atacar, de tal manera
que todos la amenaza de conquistar los territorios este balanceado.
5.3 Objetivos Alcanzados
En el capítulo 2 se marcaron una serie de objetivos específicos y operativos, que ahora se
van a repasar para explicar como se ha llevado a cabo su cumplimiento.
66
5.3.1
Objetivos Específicos
Las siguientes fases mezclan lo que sería una partida del juego complementado con
funcionalidades para adaptarlo a la plataforma móvil:
• 1. Registrar usuario
• 2. Identificar usuario
• 3. Crear partida
• 4. Unirse a las partidas creadas por otros usuarios
• 5. Distribuir nuevas tropas sobre sus territorios en el tablero
• 6. Realizar ataques para conquistar nuevos territorios
• 7. Redistribuir tropas de territorios dominados
En el capitulo 1 se proponía esa lista de fases que podrían ser ahora las de Battlex.
Ya que se han alcanzado todos los puntos citados, gracias a la implementación de las
diferentes escenas y la gestión de usuarios.
1. Diseñar la mecánica del juego e implementar mediante análisis de herramientas,
tecnologías y estado del arte con el fin de asegurar la jugabilidad y potenciar el interés
del usuario.
Para cumplir este objetivo se ha realizado una aplicación con la temática de conquista,
pero siguiendo el estilo de la gestión de partidas de las diferentes aplicaciones asíncronas que hay en el mercado. Ayudandose de adaptaciones de Risk en juegos para
ordenador y consolas se definieron las reglas que debía tener la aplicación para cumplir el requisito general de ser asíncrona. Y complementado las reglas clásicas que
tanto éxito han tenido desde la creación de este género como juego de tablero con las
interfaces táctiles y el servicio de notificaciones, se obtiene el interés del usuario sobre
la aplicación.
2. Implementar el juego mediantes los lenguajes y tecnologías más apropiados para
alcanzar el objetivo general.
Ya que el trabajo está orientado al sistema operativo iOS, se pudieron elegir las herramientas para desarrollar de manera nativa para esta tecnología. Además, ya que tanto
cocos2d for iPhone como Parse tienen SDK escrito en Objective-C, lenguaje nativo de
iOS, todo el desarrollo de la aplicación ha sido llevado a cabo en éste lenguaje. Con
lo cual, dado que los lenguajes y tecnologías utilizados fueron los más apropiados, se
cumplió este objetivo.
3. Asegurar el correcto funcionamiento y la consecución del objetivo general mediante
pruebas del software generado.
Para cumplir este objetivo, se han llevado a cabo durante todo el proceso de desarrollo,
pruebas de interacción, estrés y funcionamiento por parte del equipo de desarrollo para
67
asegurar que cada iteración cumplía con un correcto funcionamiento.
5.3.2
Objetivos Operativos
1. Se realizarán una serie de tutoriales y pruebas para avanzar en el aprendizaje
del lenguaje de programación para la plataforma escogida llamado Objective-C. Se
harán diferentes tareas, desde interfaces básicas hasta realizar peticiones a servicios
web. También se realizará una estudio previo de los diferentes frameworks que se
pudieran utilizar en el proyecto y una vez elegido el que se integrará en el proyecto, se
procederá a realizar tareas incrementales para aprovechar el tiempo de aprendizaje
en el desarrollo de la aplicación final.
Para cumplir este objetivo, como se puede observar en el capítulo 4, se crearon las
interfaces de usuario para las escenas dle juego utilizando cocos2d. También se hizo uso de la metodología incremental eXtreme Programming para la realización de
iteraciones, que de manera incremental, ayudaron a desarrollar la aplicación.
2. Simplificar y/o adaptar las reglas de un juego de estrategia clásico, para que haga
uso de la interacción de un dispositivo móvil con pantalla táctil. Esto implica también
adaptar las reglas para que la jugabilidad se lleve a cabo de manera asíncrona, es
decir, que los diferentes integrantes de una partida no tenga porqué coincidir en estar
conectados al mismo tiempo. Para adaptar el juego se deberá partir de las fases que
componen un turno, descritas en la sección 1.2.2 del capítulo 1.
El cumplimiento de este objetivo operativo ha sido explicado anteriormente en la sección 5.3.1.
3. Diseñar e implementar las diferentes escenas del juego. Desde el inicio de sesión
y el registro hasta el visor de partidas y el tablero. Las primeras no tendrán mucha
complejidad ya que deberán mostrar una interfaz sencilla para que lo usuarios introduzcan sus credenciales, sin embargo, el visor y el tablero tendrán mas complejidad.
Este último tendrá que representar territorios y que los usuarios vean que jugadores
los controlan.
Se crearon todas las escenas, desde las más sencillas a las mas complejas, usando cocos2d para iPhone. Y para representar los territorios se escogió un tablero, en el que
los territorios son de forma hexagonal, de manera que cumpliendo las recomendaciones de Apple sobre interfaces de usuario, se mostraran en la pantalla de manera que
los usuarios pudieran interactuar con ellos.
4. Se realizará una búsqueda de información a través del estado del arte, con aplicaciones similares, para conocer como resuelven diferentes problemas de interacción y
saber como se podría enfocar el diseño de la interfaz de usuario, que es uno de los elementos mas importantes en proyectos de este tipo. También se hará uso y se tendrá en
cuenta las recomendaciones que ofrece Apple en su documentación [Apple(2014a)].
68
Se hizo un estudio sobre las aplicaciones asíncronas más famosas, para coger ideas y
poder representar debidamente la interfaz de usuario y que éste entendiera lo que se
quería transmitir.
5. La aplicación dispondrá de un servicio web o backend, con el que realizar llamadas
para guardar, obtener o modificar la base de datos allí almacenada. Esta dispondrá
de todos los elementos necesarios para persistir las partidas y los usuarios. También
dispondrá de un SDK para realizar peticiones al servicio REST.
Este objetivo se cumplió de la siguiente manera: Integrando el SDK de Parse para iOS
en el proyecto y configurando la aplicación, base de datos y notificaciones push en el
portal web, como se puede ver en el anexo A.
6. Una notificación push es, básicamente, un mensaje enviado por un servidor a un
cliente que está suscrito a sus notificaciones [Mateos(2013)]. Se implementará este
servicio para que los usuarios no tengan que estar pendientes del estado de las partidas en las que participan, sino que sea el propio dispositivo que te avise a través de
esta tecnología de cuando tienes el turno de alguna de las partidas en juego.
Para cumplir este objetivo se configuró debidamente la aplicación para poder suscribir
los dispositivos de los usuarios para que pudieran recibir notificaciones. En el portal
de parse se configuró la aplicación y la base de datos para poder enviar notificaciones
a los dispositivos usando su SDK.
5.4 Limitaciones encontradas
Todas las limitaciones que se han tenido durante el trabajo han sido relacionadas con las
tecnologías utilizadas, al tener un completo desconocimiento de estas en el momento de
empezar.
Al comienzo se realizaron una serie de tutoriales y ejemplo simples de aplicaciones, primero usando iOS y más tarde integrando en éste cocos2d. La curva de aprendizaje del lenguaje
utilizado Objective-C es más alta que la de otros lenguajes como java, pero además nunca se
había tenido contacto con estas tecnologías. Sobre el lenguaje java si se tenían conocimientos
previos, pero la adaptación al lenguaje utilizado en el trabajo ha sido más complicada, mas
aún cuando se trataba de hacer iteraciones más complejas en el desarrollo.
También adaptarse a la arquitectura de cocos2d ha sido complicado, no sólo por que el lenguaje es el mismo, Objective-C, sino porque nunca se había tratado con frameworks gráficos,
ni se tenían conocimientos sobre lógica de videojuegos.
Por último añadir que tampoco se tenían conocimientos sobre integración con servicios
web, como el utilizado en la aplicación. Sólo se habían realizado tutoriales sobre la integración de bases de datos SQlite, descritos en el Anexo C.
69
En cuanto a documentación, la mayoría de lo consultado estaba en inglés, tanto los libros
sobre las tecnologías como su comunidad de usuarios y los portales utilizados, lo que conlleva otro esfuerzo más a la hora de encontrar solución a los problemas que se han tenido.
5.5 Trabajo Futuro
A continuación se proponen una serie de mejoras que se podrían realizar para ampliar el
trabajo realizado.
Para que los usuarios de la aplicación pudieran personalizar sus partidas, se podría crear
un sistema de creación de partidas que no fuera aleatorio y que el creador pudiera elegir el
número de jugadores, el tamaño del mapa y su forma, el color o las imágenes de las tropas,
etc. Creando una nueva pantalla en la que se mostrara un formulario con las opciones de
personalización de la nueva partida e implementado la lógica se podría llevar a cabo esta
mejora.
Otra mejora que se podría realizar es integrar un sistema de logros como Game Center
para iOS, así los jugadores de todo el mundo podrían ver un ranking de puntuación y retarse
desde el portal. Utilizando el framework de Game Center se podría integrar la aplicación para
ofrecer este sistema, este framework es nativo de iOS, la lógica no sería muy complicada,
excepto la parte de generar los logros, ya que habría que proponer estos de manera que
supongan un reto para los usuarios.
Otra de las mejoras sería crear una capa mas en la arquitectura para que la dependencia
de un servicio externo fuera mínima y fácilmente se pudiera cambiar de sistema de gestión
de la persistencia. En Objective-C la manera de implementar esta capa podría ser a través de
una serie de interfaces que pudieran abstraer a las llamadas al servicio del SDK externo, es
decir, las llamadas aceptarían objetos nativos que se tradujeran al modelo de datos sin que
estos se conocieran.
Otra mejora sería añadir animaciones en el mapa para que fuera más atractiva la interfaz.
Por ejemplo animaciones de movimiento de tropas, explosiones cuando se realizan los ataques, etc, mejorarían la experiencia de usuario. También sería posible realizar unas texturas
más detalladas para mejorarla.
Como en los ejemplos de aplicaciones que se han visto en el estado del arte, se podría
realizar un chat de partidas, en las que lo usuarios que la forman pudieran hablar entre ellos
para, por ejemplo, formar pactos contra otros. Esto mejoraría la estrategia y por tanto la
jugabilidad. Si el servicio utilizado en la aplicación pudiera almacenar los datos de los chats,
creando una nueva pantalla en la aplicación y las correspondiente lógica de peticiones, se
llevaría a cabo esta mejora.
Para realizar de manera nativa toda la aplicación para iOS, se podría utilizar el framework
gráfico integrado a partir de iOS 7 así sería mucho más mantenible el desarrollo. Llamado
70
SpriteKit, podría ser una mejor elección que el presente framework utilizado, ya que le da
soporte el fabricante del sistema operativo y el hardware.
5.6 Conclusiones
Ha sido gratificante enfrentarse a una serie de tecnologías totalmente desconocidas, empleando todos los conocimientos previamente adquiridos durante la carrera, y poder llevar a
cabo este trabajo.
Esto ha abierto un mundo de oportunidades futuras muy motivador. Ya que a nivel de
usuario el alumno era apasionado por esta tecnología, y ahora lo es también del desarrollo
de ésta.
Lo mejor que ha ocurrido con la realización del trabajo, ha sido el aprendizaje de la plataforma móvil como es iOS, ya que complementa los estudios que el alumno ha realizado
durante la carrera. También el hecho de conseguir crear una aplicación videojueguil, consiguiendo los objetivos marcados, para una de las plataformas más extendidas, ha sido muy
satisfactorio.
Por último añadir que la realización del trabajo me ha servido para encontrar trabajo, de
lo cual estoy muy agradecido, pero no sólo eso sino que también estoy trabajando en la
plataforma móvil en al que está basada el presente trabajo.
71
ANEXOS
73
Anexo A
Parse
D
que la persistencia y comunicación usando la nube, es uno de los pilares mas
importantes de la aplicación. Se va a describir el proceso de creación de las tablas
aprovechando el potencial del panel de control que proporciona Parse desde su web www.
parse.com.
ADO
A.1 Registro y Configuración
Inmediatamente después de hacer el registro como usuario de Parse, se registra la aplicación en Parse para conseguir las App Keys (Figura B.4), que darán acceso a la plataforma
desde la aplicación, una vez ésta sea configurada.
Figura A.1: Claves de aplicación de Parse
Para configurar el SDK en la aplicación y poder comenzar a utilizarlo se añaden las credenciales obtenidas de la siguiente manera:
# import < Parse / Parse .h >
[ Parse setApplicationId : @ " v 4 p W h I w Q p G n D c W w w E X k L h p u x 7 G k f 9 9 l W j 9 V U 6 I c Y "
clientKey : @ " E U B z o Q q Q o 0 n n 4 u 3 3 d O W 7 r x s 3 f P b d t W M 0 O S j W J w G y
" ];
Listado A.1: Configuración en el cliente de las credenciales de Parse
75
Una vez realizados estos primeros pasos, ya se puede comenzar a usar el SDK correspondiente a la plataforma, en este caso iOS.
A.2 Panel de control
Desde el panel de control se puede elegir la aplicación que queremos configurar, pues se
pueden registrar varias aplicaciones con la misma cuenta. Se mostrará un resumen de los
usuarios y las peticiones, es decir, el tráfico que tiene la aplicación (Figura A.2).
Figura A.2: Resumen de Battlex en Parse
Como se puede observar en la figura A.2, muestra una serie de apartados, de los cuales el
que más nos interesa en este momento es ”Data Browser” (Explorador de datos).
A.2.1 Clases
Ya se han citado anteriormente las clases o tablas que componen la base de datos, pero
ahora se va a describir el contenido de éstas.
Para empezar, se pueden crear clases de varios tipos nativos que ofrece Parse o personalizada (Figura A.3. En el caso de Battlex todas las clases serán personalizadas, excepto la
de usuario e instalación, ya que la plataforma dispone de sistemas de seguridad y control de
usuarios y dispositivos.
Figura A.3: Creación de tablas o clases en Parse
76
A modo de ejemplo, en la figura A.4 se pueden ver los campos que forman parte de la
tabla ”User”.
Figura A.4: Campos de la tabla User en Parse
Como se puede apreciar, sólo uno de los usuarios tiene registrado el ”deviceId”. Esto
se debe a que cuando un usuario cierra sesión en la aplicación, también lo realiza en la
plataforma de Parse, es decir, en ese momento solo había un usuario identificado.
A.2.2 Relaciones
El mejor ejemplo que se encuentra en la base de datos para mostrar las relaciones, es la
clase ”Partida”. Ya que esta contiene, entre otros campos, los usuarios que forman la partida
en el campo ”Jugadores” y el mapa de cada partida.
Como ya se ha comentado, cada partida esta formada por tres jugadores, con lo cual, el
campo ”Jugadores” de la clase ”Partida”, estará formado por una lista de punteros a usuarios
de la clase ”User”.
Cuando se realiza una petición para conseguir los datos de una partida, el campo ”Jugadores” será deuvelto en forma de Array o Lista como se puede observar en el Listado A.2.
[{ " __type " : " Pointer " ," className " : " _User " ," objectId " : " i7fMFLMrSw " } ,{ "
__type " : " Pointer " ," className " : " _User " ," objectId " : " 1 AUwXcSOe7 " } ,{ "
__type " : " Pointer " ," className " : " _User " ," objectId " : " 8 lshWGgpNE " }]
Listado A.2: Jugadores de una partida en Parse
Una vez obtenido en este caso el contenido de una partida, si se quieren obtener los datos
de los jugadores que la forman, se debe hacer una petición más a la clase ”User” usando
la clase PFQuery. En el listado A.3, se puede observar como se configura la petición para
obtener la información completa de los jugadores contenidos en una partida.
77
NSMutableArray ⇤ jugadores = [[ partida objectForKey : @ " Jugadores " ]
valueForKey : @ " objectId " ];
PFQuery ⇤ query = [ PFQuery q ue ryW it hC la ss Na me : @ " _User " ];
[ query whereKey : @ " objectId " containedIn : jugadores ];
Listado A.3: Query de obtención de jugadores contenidos en una partida en Parse
Al igual que la clase ”Partida” contiene una lista de los jugadores que la forman, también
contiene el campo ”Mapa”. Pero este sólo contiene el identificador del mapa de la partida, ya
que es una relación directa. En la figura A.5 se observa como se crea una columna del tipo
relación con alguna de las clases de la base de datos.
Figura A.5: Creación de columna con relación en Parse
A.2.3 Ventajas e Inconvenientes
Ahora se van a nombrar las ventajas y los inconvenientes que tiene el uso de Parse como
BAA S en la aplicación.
Ventajas:
Interfaz amigable
Rápida configuración
Mucha documentación y comunidad activa
Gratuito hasta cierto volumen de datos, el cual es los suficientemente alto como para
no tener que llegar a pagar por el servicio hasta obtener un volumen muy alto de tráfico.
Inconvenientes:
La aplicación tendrá mucha dependencia del servicio, impidiendo escalar si éste cerrara o se quisiera cambiar a otros servicios.
Aunque las suscripciones no hacen falta hasta tener mucho volumen de datos, la tarifa
”Pro” es muy cara, 199$/mes.
78
Como conclusión, decir que la versión gratuita para el uso de la plataforma ofrece los
siguientes limites de tráfico al mes, los cuales son bastante elevados.
1.000.000 de peticiones API
1.000.000 de notificaciones push
1 Gb de espacio en disco
Un máximo de 20 peticiones por segundo
79
Anexo B
Manual de Usuario
E
el juego Battlex, el objetivo es conquistar todos los territorios enemigos para conseguir el control de todo el tablero.
N
Para realizar esto primero se debe realizar el registro del usuario, a continuación la identificación del usuario registrado y con ello ya se entra dentro de la aplicación.
B.1 Registro
Para realizar el registro el usuario debe pulsar cada una de las cajas de texto de la pantalla,
aparecerá un teclado con el cual introducirá los datos solicitados en las mismas. Una vez se
hayan introducido los datos, se debe pulsar el botón ”Registrarse”.
Figura B.1: Battlex paso a paso: Registro
81
B.2 Identificación
Como en el apartado anterior, se deben rellenar los campos con los datos requeridos. Pulsando sobre ellos aparecerá el teclado con el cual se introducen los datos. Una vez introducidos, se debe pulsar el botón ”Identificarse”.
Figura B.2: Battlex paso a paso: Identificación
82
B.3 Menú Partidas
En el menú partidas existen diferentes controles que se explicarán a continuación.
B.3.1
Opciones
Pulsando el botón de opciones, situado en la parte superior izquierda de la pantalla, aparecerá un menú emergente en el que el usuario podrá cerrar sesión.
Figura B.3: Battlex paso a paso: Opciones
83
B.3.2 Nueva Partida
En la parte superior derecha de la pantalla, está situado el botón crear partida con el simbolo ”+”. Pulsando sobre él se creará una nueva partida, que se añadirá a la lista de partidas
en las que le toca jugar al usuario identificado.
B.3.3 Partidas
En la parte central del mapa aparecen dos tablas. A la izquierda las partidas que le toca
jugar al usuario identificado y a la derecha las del turno rival. Para elegir una partida a jugar,
el usuario debe pulsar sobre una de las partidas situadas en la tabla llamada ”Tu Turno”. Una
vez elegida una partida, se mostrará el mapa y los controles correspondientes a la fase en la
que esté.
Figura B.4: Battlex paso a paso: Partidas
84
B.4 Situar Refuerzos
En la pantalla refuerzos, aparece en la parte superior a modo de leyenda, una tropa del
color del jugador al lado del nombre de éste. También se tiene el botón ”Deshacer” justo al
lado del número de refuerzos.
Para ordenar a una tropa que se sitúe sobre un territorio, el usuario debe pulsar ese territorio
y una tropa se colocará en él. Un refuerzo por cada toque, mientras queden refuerzos por
situar. Si el usuario se equivoca, la opción deshacer devolverá el último refuerzo situado
sobre el tablero a la reserva de refuerzos que situar.
Una vez que los refuerzos están situados, aparecerá el botón ”Siguiente” que llevará al
usuario a la siguiente fase: El ataque.
En el ejemplo de la figura B.5 se puede observar como se ha ordenado la colocación de
los 6 refuerzos en el territorio situado en la primera fila y séptima columna.
Figura B.5: Battlex paso a paso: Situar refuerzos
85
B.5 Configurar Ataque
Pasos para configurar el ataque deseado:
1. Pulsar sobre el territorio de ataque tantas veces como tropas se quieran usar en el
mismo. Se podrán utilizar un máximo de 3 tropas, siempre dejando una tropa defendiendo el territorio, es decir, si el territorio tiene 3 tropas, se podrán utilizar un máximo
de 2, sin embargo, si tiene 5, solo se podrán utilizar 3.
Figura B.6: Battlex paso a paso: Configurar Ataque, atacante
2. Pulsar sobre un territorio adyacente al territorio de ataque seleccionado. El territorio
seleccionado defenderá con un máximo de 2 tropas. Si sólo tiene 1, defenderá con ella.
En caso de perderla, el atacante ganará el territorio.
Figura B.7: Battlex paso a paso: Configurar Ataque, defensor
86
3. Para realizar el ataque, el usuario debe pulsar sobre el botón ”Ataque”, situado en la
parte central de los controles superiores.
Figura B.8: Battlex paso a paso: Configurar Ataque, confirmación
4. La puntuación obtenida en los dados (los dados son aleatorios, los genera la aplicación) se sitúa debajo de su correspondiente jugador.
La puntuación se interpretan de la siguiente manera:
• Las puntuaciones de cada jugador se ordenan de mayor a menor por separado.
• Se cotejan las puntuaciones una a una después de haberse ordenado. El primero
con el primero, el segundo con el segundo, y así sucesivamente.
• En caso de empate gana el jugador que defiende su territorio.
• En el caso de la figura B.8, el jugador ”Estefanie” ha perdido 6-6 una de sus
tropas y el jugador ”Minguel553” ha perdido 6-4 otra.
87
B.6 Fortificar
Al igual que en las fases anteriormente explicadas, en la presente, el usuario deberá pulsar
un territorio de origen para mover sus tropas hacia otro, tantas veces como tropas quiera
mover. Una vez alcanzado el valor de tropas deseado, con un máximo de n-1 tropas seleccionadas, el usuario debe pulsar sobre el territorio de destino de éstas.
Por ejemplo: Si en un territorio se tienen 8 tropas, se podrán seleccionar un máximo de 7
para realizar su movimiento.
Una vez el usuario lo desee, puede pulsar sobre el botón siguiente, se guardarán los cambios y se volverá a la pantalla de selección de partida.
Figura B.9: Battlex paso a paso: Fortificar
88
Anexo C
Proyectos de Prueba
A
comienzo del trabajo se definieron una serie de requisitos de arquitectura, librerías
y caché. Finalmente se introdujo Parse (Anexo A) y se decidió no utilizar SQLite ni
una base de datos remota alojada en un servidor con MySql.
L
No obstante, se hicieron diversas pruebas e incluso se introdujo en la propia aplicación de
Battlex. A continuación se van a mostrar los ejemplos que se realizaron para estudiar estas
tecnologías.
C.1 Base de Datos: SQLite
XCode tiene por defecto un framework llamado ”libsqlite3.0.dylib” el cual sirve para leer
o escribir en ficheros con extensión ”sqlite”. Se hizo uso de esta librería para guardar los
datos de la aplicación en una base de datos local del dispositivo con el fin de realizar las
primeras pruebas.
En la figura C.1 se puede observar que aspecto tenía la base de datos llamada ”BDBattlex.sqlite”.
Figura C.1: Tablas de Battlex en SQLite
89
A continuación en las figuras C.2 y C.3 se muestran los campos de la tabla ”Partida” y los
datos de un mapa guardados en la tabla ”Mapa” respectivamente.
Figura C.2: Campos de la tabla Partida en SQLite
Figura C.3: Datos de la tabla Mapa en SQLite
Por último se muestra en la figura C.4, como quedaba la capa de servicios cuando se
utilizaban las clases DAO en la aplicación.
Figura C.4: Capa de servicios con SQLite integrado
El código correspondiente en la aplicación a la lectura/escritura de la base de datos SQLite
no se muestra en la memoria por su extensión y porque no es relevante, sin embargo se
incluirá en el CD adjunto a la presente por si se quiere consultar esta información.
C.2 Prueba de registro
Antes de integrar el framework de sqlite en Battlex, se realizó un proyecto de prueba en
XCode en el que se realizaba un registro de usuarios, creando éstos en una base de datos
SQLite. A continuación se describirá brevemente los componentes que formaban parte de
este proyecto de prueba.
90
C.2.1 Interfaz de Usuario
Para aprender a usar en Interface Builder de XCode, se realizó una interfaz sencilla que
constaba de varias pantallas con las que se podía interactuar para acceder a las diferentes
pantallas y rellenar un formulario para finalmente, crear los usuarios de prueba.
En la figura C.5 se puede ver ésta interfaz creada en XCode.
Figura C.5: Interfaz de usuario de prueba
C.2.2 Registro en base de datos
Como se ha comentado, la prueba que se hizo fue registrando usuarios, aunque en la
interfaz se muestre la interfaz de la identificación. Al pulsar el botón de registro, después de
rellenar el formulario, se ejecuta el método que se puede ver en el listado C.1 que abre la
base de datos y genera la consulta correspondiente para generar el usuario.
( IBAction ) btnregistrar :( id ) sender {
AppDelegate ⇤ appDelegate = ( AppDelegate ⇤) [[ UIApplication
sharedApplication ] delegate ];
// Ahora instanciamos la variable database de tipo sqlite3
sqlite3 ⇤ database ;
// Creamos el sqlite3_stmt que contendra despues la sentencia a
ejecutar compilada .
sqlite3_stmt ⇤ sentencia ;
// Abrimos la base de datos de la ruta indicada en el delegate
if( sqlite3_open ([ appDelegate . DataBasePath UTF8String ] , & database )
== SQLITE_OK ) {
// Si no ha habido errores al abrir , creamos la sentencia de
insercion .
NSString ⇤ sqlStatement = [ NSString stringWithFormat : @ " Insert
into Usuarios VALUES (\" % @ \" , \" % @ \" , \" % @ \") " , self .
91
txtcorreo . text , self . txtusuario . text , self . txtcontrasena .
text ];
// Lanzamos la consulta y recorremos los resultados si todo ha
ido OK
if( sq li te 3_ pr ep ar e_ v2 ( database , [ sqlStatement UTF8String ] , 1,
& sentencia , NULL ) == SQLITE_OK ) {
// En otros casos recorremos los resultados . En este caso
no habra .
while( sqlite3_step ( sentencia ) == SQLITE_ROW ) {
}
} else {
NSLog ( @ " Error en la creacion del insert " ) ;
}
// Libero la consulta
sqlite3_finalize ( sentencia ) ;
}else{
NSLog ( @ " No se ha podido abrir la BD " ) ;
}
// Cierro la base de datos
sqlite3_close ( database ) ;
}
// Si todo ha ido bien podemos abandonar la ventana e ir a la
superior .
[ self . na v i g a t i o n C o n t r o l l e r p o p V i e w Co n t r o l l e r A n i m a t e d : YES ];
Listado C.1: Generación de usuarios en Sqlite
Todo esto sirvió de toma de contacto para realizar posteriormente la integración de SQLite
en Battlex, aunque como se ha comentado, finalmente se decidió no utilizar este framework
para implementar la persistencia de la aplicación.
El resto de este proyecto de prueba se incluirá en el CD adjunto con el presente proyecto,
donde podrá ser visualizado.
92
Anexo D
Formulario del Test de Jugabilidad
En este anexo se adjunta el formulario realizado para que una serie de usuarios puedan dar
su punto de vista sobre la realización de la aplicación.
93
Test%de%Jugabilidad%de%Battlex%
!
Objetivos:%
!
•
•
•
Identificar!el!nivel!de!satisfacción!de!los!atributos!de!la!jugabilidad.!
Medir!la!usabilidad!y!motivación!por!el!juego.!
Identificar!problemas!con!respecto!de!los!dos!objetivos!anteriores.!
Población%
!
A!partir!de!los!7!años!de!edad.!
!
Política%de%privacidad%
!
El!test!es!completamente!anónimo!y!los!cuestionarios!no!incluirán!información!
sobre!la!identidad!de!los!participantes.!
!
Metodología%
!
En!el!presente!test!se!van!a!evaluar!una!serie!de!facetas!de!jugabilidad.!Son!las!
siguientes:!
!
• Jugabilidad!Intrínseca:!Evalúa!el!diseño!del!juego!y!sus!reglas.!
• Jugabilidad!Mecánica:!Evalúa!el!comportamiento!de!la!aplicación!desde!el!
punto!de!vista!del!software.!
• Jugabilidad!Interactiva:!Evalúa!la!interacción!con!el!usuario!y!el!diseño!de!
toda!la!interfaz.!
• Jugabilidad!Artística:!Evalúa!la!relación!de!la!estética!con!la!naturaleza!
propia!del!juego.!
• Jugabilidad!Intrapersonal:!Evalúa!la!percepción!que!tiene!el!usuario!del!
juego!y!que!sensaciones!le!produce.!
• Jugabilidad!Interpersonal:!Evalúa!la!competitividad!del!juego.!
!
Instrucciones%
!
Una!vez!comprendidas!las!facetas!de!la!jugabilidad!a!evaluar,!se!deberán!puntuar!
los!atributos!de!cada!faceta!de!la!siguiente!manera:!En!una!escala!del!1!al!5,!siendo!
1!Nada!Satisfactorio!y!5!Totalmente!Satisfactorio.!
!
!
!
!
!
!
!
!
Faceta!
!
!
Jugabilidad!
Intrínseca!
!
!
Jugabilidad!
Mecánica!
!
!
!
Jugabilidad!
Interactiva!
!
!
Jugabilidad!
Artística!
Atributo!
Satisfacción!
Aprendizaje!
Efectividad!
Inmersión!
Motivación!
Emoción!
Social!
Satisfacción!
Aprendizaje!
Efectividad!
Inmersión!
Motivación!
Emoción!
Social!
Satisfacción!
Aprendizaje!
Efectividad!
Inmersión!
Motivación!
Emoción!
Social!
Satisfacción!
Aprendizaje!
Efectividad!
Inmersión!
Motivación!
Emoción!
Social!
Satisfacción!
!
!
!
Aprendizaje!
Jugabilidad!
Efectividad!
Intrapersonal! Inmersión!
Motivación!
Emoción!
Social!
!
Satisfacción!
!
Aprendizaje!
Jugabilidad!
Efectividad!
Interpersonal! Inmersión!
Motivación!
Emoción!
Social!
Requisitos!a!cumplir!
Valoración!del!Sistema!de!Juego!
Reglas!fácil!de!entender!
Intentos!para!conquistar!territorios!
Conquistar!el!mapa!
Reconquistar!territorios!perdidos!
Ganar!la!partida!conquistando!el!mapa!
Uso!de!compañeros!para!jugar!!
No!apreciación!de!retrasos!ni!sincronizaciones!
Estrategia!
Detecciones!táctiles!de!los!elementos!
Reconocimiento!táctil!
Tiempos!de!carga!mínimos!
Cambios!de!escena!
Sincronización!de!partidas!por!WiVFi!o!3G!
Interacción!táctil!
Comprensión!de!los!elementos!visuales!
Correcto!reconocimiento!táctil!de!los!elementos!
pulsados!
Diferentes!controles!del!mapa!en!cada!fase!
Resultados!visuales!de!los!ataques!
Efectos!de!cambio!de!escena!
Comunicación!con!otros!jugadores!
Diseño!de!la!aplicación!
Se!diferencia!cada!territorio!por!su!color!
Es!fácil!reconocer!las!tropas!de!cada!jugador!
Colores!típicos!de!juegos!de!conquista!
Retroalimentación!al!pulsar!territorios!
Visualización!de!los!cambios!
Se!muestra!la!información!de!las!partidas!
Se!prefiere!usar!la!aplicación!a!usar!el!juego!de!
mesa!
Se!comprende!el!juego!sin!ayuda!exterior!
Se!avanza!rápido!en!las!partidas!
El!jugador!cree!que!es!el!general!de!las!tropas!
El!jugador!está!pendiente!de!los!cambios!en!sus!
partidas!
El!jugador!se!alegra!al!conquistar!territorios!
Incentivar!las!ganas!de!revancha!
Gestión!de!recursos!para!las!partidas!
Adaptarse!a!los!cambios!de!los!rivales!
Número!de!turnos!para!terminar!la!partida!
Comunicación!y!control!de!las!partidas!
Recompensas!por!las!partidas!ganadas!
Incentivar!la!rápida!respuesta!de!los!jugadores!
Fomentar!el!cambio!de!estrategia!entre!jugadores!
Puntuación!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
Referencias
[Anónimo(2014)] Anónimo. Objective-c. www.wikipedia.org, último acceso en Junio de
2014, 2014.
[AppAnnie(2013)] AppAnnie. Index market q2 2013. blog.appannie.com, último acceso en
Mayo de 2014, 2013.
[Apple(2012)] Apple. Llvm compiler overview. https://developer.apple.com/library/mac,
último acceso en Julio de 2014, 2012.
[Apple(2014a)] Apple. ios developer libary. https://developer.apple.com/library/ios/navigation/,
último acceso en Julio de 2014, 2014a.
[Apple(2014b)] Apple. ios human interface guideline. developer.apple.com último acceso
en Julio de 2014, 2014b.
[Apple(2014c)] Apple. ios dev center. developer.apple.com, último acceso en Julio de 2014,
2014c.
[Bandera(2006)] Pedro Fulleda Bandera. Ludología: La indagación del juego por el juego.
www.redcreacion.org, último acceso en Abril de 2014, 2006.
[Beck(1999)] Kent Beck. Extreme Programming Explained: Embrace Change. US ed,
1999.
[Etermax(2014a)] Etermax. Apalabrados, 2014a. URL www.apalabrados.com.
[Etermax(2014b)] Etermax. Etermax. www.etermax.com, último acceso en Junio de 2014,
2014b.
[Inc(2014)] Stack Exchange Inc. Stack overflow. stackoverflow.com, último acceso en Mayo
de 2014, 2014.
[Languedoc(2012)] Kevin Languedoc. How to become an iphone app creator. HubPages.com, último acceso en Junio de 2014, 2012.
[Letelier(2005)] Patricio Letelier. Metodologías ágiles para el desarrollo de software: Extreme programming. 2005.
97
[Mágica(2012)] Manzana Mágica. Desarrollo. http://www.manzanamagica.com/desarrollo/,
último acceso en Febrero de 2014, 2012.
[Marques(2013)] Asier Marques. Conceptos sobre apis rest. asiermarques.com, último acceso en Junio de 2014, 2013.
[Mateos(2013)] Manu Mateos. Tecnología push así funciona. www.genbeta.com, último
acceso en Julio de 2014, 2013.
[Omgpop(2014)] Omgpop. Draw something. http://omgpop.com/drawsomething, último
acceso en Junio de 2014, 2014.
[Rubio(2013a)] Miguel Díaz Rubio. migueldiazrubio.com. www.migueldiazrubio.com, último acceso en Julio de 2014, 2013a.
[Rubio(2013b)] Miguel Díaz Rubio. Desarrollo ios: Parse. www.migueldiazrubio.com, último acceso en Agosto de 2014, 2013b.
[Triviados(2014)] Triviados. ¿qué es triviados? http://triviados.org/triviados/, último acceso
en Junio de 2014, 2014.
[Wells(2009)] Don Wells. Extreme programming. www.extremeprograming.org, último acceso en Junio de 2014, 2009.
[y Andreas Löw(2011)] Steffen Itterheim y Andreas Löw. Learn cocos2d Game Development with iOS 5. Apress, 2011.
[y Andreas Löw(2012)] Steffen Itterheim y Andreas Löw. Learn cocos2d 2. Apress, 2012.
98
Este documento fue editado y tipografiado con LATEX
empleando la clase esi-tfg que se puede encontrar en:
https://bitbucket.org/arco group/esi-tfg
[Respeta esta atribución al autor]
99
Descargar