MMORPG location-based for Android - IIT

Anuncio
 ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
MMORPG location-based for Android
Autor: Antonio Rodríguez López
Director: Alfonso Villar Chicharro
Madrid
Septiembre 2012
Autorizada la entrega del proyecto del alumno/a:
Antonio Rodríguez López
EL DIRECTOR DEL PROYECTO
Alfonso Villar Chicharro
Fdo.: …………………… Fecha: 03/ 09/ 2012
Vº Bº del Coordinador de Proyectos
David Contreras Bárcena
Fdo.: …………………… Fecha: ……/ ……/ ……
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMATICA
Agradecimientos
Gracias en primer lugar, a mis padres por todo su apoyo y dedicación. Por la gran labor
que han hecho al brindarme una educación inmejorable y por el tremendo esfuerzo que
han realizado para que pueda estudiar la carrera que he deseado, donde he querido. Sin
vosotros faltaría la piedra angular sobre lo que se asienta todo. Sin vosotros, nada
hubiera sido posible.
A Trini, por estar siempre a mi lado, apoyándome en los momentos de flaqueza y
acompañándome en los momentos de alegría. Sin ella, no hubiera sido capaz de
encontrar las fuerzas para continuar.
A mi director, Alfonso, por brindarme la oportunidad de no acabar la carrera sin haber
programado un videojuego, el broche perfecto para el fin de mis estudios universitarios.
A Fernando por ser mi diseñador gráfico particular y por las conversaciones silenciosas
de una sola mirada.
A mi abuela Maruja, un referente de cariño. A toda mi familia por las muestras de afecto
recibidas.
I
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMATICA
II
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMATICA
MMORPG location-based for Android
Autor: Rodríguez López, Antonio
Director: Villar Chicharro, Alfonso
Resumen
El objetivo de este proyecto es la programación de un MMORPG basado en localización
para el sistema móvil Android de Google.
Palabras clave: Android, Andengine, MMORPG, videojuego, cliente-servidor.
1
Prólogo
Antes de continuar se subraya que los términos de juego y videojuego van a ser usados
de indistintamente a lo largo del presente documento, pero refiriéndose siempre al
mismo concepto de software de entretenimiento y ocio electrónico.
MMORPG hace referencia a un estilo o tipo de videojuego, acrónimo en inglés de
Massively Multiplayer Online Role Playing Game, una traducción aproximada del
español podría ser videojuego de rol multijugador masivo online. Los videojuegos, al
igual que ocurre con los libros, la música o las películas, también se clasifican en
diferentes estilos, algunos ejemplos son: aventura, survival-horror, simulación de
deportes, simulación de carreras, arcade, plataformas, MMORPG, etc. Decir que un
juego es un MMORPG sólo es decir que pertenece a ese estilo.
2
Introducción
¿Qué implicaciones tiene que un juego sea un MMORPG? Las características básicas de
un MMORPG son dos: primero el jugador va a asumir un alter ego, ya sea una sola
identidad o colectiva, interpretando un papel ficticio en un mundo ficticio que no podría
representarse en la vida real. Asumiendo el jugador todos los requisitos necesarios para
el desarrollo y evolución de este alter ego, medido comúnmente en forma de niveles. Y
segundo, el juego multijugador masivo. El jugador no va a estar sólo en este mundo.
Una gran cantidad de jugadores van a coincidir con él en tiempo real.
III
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMATICA
El juego desarrollado se llama Shadow Fire y pone al jugador al mando de una ciudad
ficticia que se mueve en una dimensión paralela e idéntica al mundo real. Esta ciudad
tiene un vínculo único con el jugador siendo capaz de captar y sintetizar para su
evolución todos los elementos que rodean al jugador, convirtiendo estos elementos
“reales” en recursos “digitales” usables. Además esta ciudad tiene la gran peculiaridad
de ser capaz de moverse junto con el jugador, siguiéndolo en todo momento.
3
Diseño del juego
El cuerpo principal del juego consta de una sección para un solo jugador en el que se
deberán gestionar los recursos de una base para evolucionar. Esta base está
representada por una ciudad que consta de siete edificios con diferentes cualidades y
enfoque y dispondrá de plantas únicas. La clave de la evolución de los edificios será
construir en su interior hasta un total de cinco plantas con beneficios distintos, teniendo
en cuenta que la disponibilidad de plantas por edificio será mayor a la cantidad que se
puede construir. El jugador también tendrá acceso a la mejora y evolución de las
unidades o tropas que serán usadas para el enfrentamiento, siendo necesaria una
correcto cuidado de sus habilidades y aprendizaje. Por lo tanto, será vital en para el
correcto desarrollo del potencial del jugador buscar la combinación interna de los
edificios perfecta que maximice su estrategia y se complemente a la perfección con las
habilidades de sus tropas mientras pone la atención necesaria a que todo combine a la
perfección con los beneficios que se le otorgan por climatología y lugar.
La segunda mecánica de juego será la encarga de enfrentar a dos jugadores que
compiten por los recursos de una zona. Los encargados de combatir serán las unidades
que previamente se han entrenado y se les han enseñado los ataques que el jugador
crea convenientes. Durante los enfrentamientos, la mecánica de juego cambiará a
combate por turnos, actuando los jugadores cuando les sea indicado, intercambiando
ataques con el objetivo de mermar por completo los puntos de vida de la unidad de su
oponente.
4
Localización
La localización tendrá implicaciones adicionales dentro del juego. Permite determinar
que la posición geográfica de los jugadores determine también la proximidad en el
juego, permitiendo a los jugadores cercanos interactuar entre ellos (por ejemplo,
IV
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMATICA
atacando a un jugador para obtener beneficios en forma de recursos). Además la
localización determina las condiciones climatológicas a las que está sujetas el juego
gracias a la API Weather Underground y haciendo uso de la API de Google Places
determinar si se encuentra en un establecimiento comercial determinado, otorgando
ambas ventajas únicas e indispensables para los recursos y atributos del jugador,
necesarias ser explotadas eficientemente para que las posibilidades competitivas del
jugador se maximicen.
4.1
Uso de la localización
La gran novedad del juego será que estos recursos obtenidos por localización se
repartirán entre los jugadores cercanos, mermando los beneficios. La única forma que
tiene un jugador de volver a adquirir la mejora completa, será retando a los jugadores
cercanos en combate. El ganador de estos enfrentamientos, adquirirá una proporción de
los recursos por zona y climatología de su rival.
5
Implementación
El juego está desarrollado para la plataforma Android de Google e implementada
íntegramente en leguaje Java y ejecutado por la máquina virtual Dalvik, presente en
todos los sistemas Android. Java tiene la ventaja de ser un leguaje de programación
orientado a objetos muy potente y versátil, con una API muy madura que permite
incorporar clases muy complejas fácilmente en el desarrollo que facilitan la labor de
programación permitiendo centrar los esfuerzos de programación en otros aspectos
importantes.
5.1
Motor gráfico
Desarrollar un juego es una tarea altamente compleja y que requiere conjugar multitud
de habilidades y capacidades que son difíciles encontrar una única persona. Diseño
gráfico, programación, diseño de videojuegos, de niveles, de IA y un largo etc. Por ello,
elegir framworks y APIs que faciliten el trabajo es vital. Para este proyecto se ha
incorporado el motor gráfico Andengine en su versión GLES2. La API de este motor
gráfico añadida al proyecto modifica ligeramente el ciclo de vida y la forma de
programar una aplicación Android, pero facilita labores extremadamente complejas
como por ejemplo la carga de recursos gráficos, texturas o la incorporación de físicas.
V
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMATICA
5.2
Infraestructura cliente-servidor y multijugador
Para la incorporación del juego multijugador basado se ha desarrollado mediante un
servidor remoto desarrollado en Java con una base de datos MySQL accedido mediante
red IP. El servidor se encarga de dos procesos básicos en el juego online. Determina la
distancia de los jugares en tiempo real, comunicando a los jugadores que se encuentran
geográficamente cercanos y gestiona todo el proceso de interacción entre jugadores
que deseen combatir entre ellos. Se ha creado un algoritmo complejo y eficiente de
cálculo de distancias cercanas entre jugadores que reducen la necesidad de cálculo. El
otro cometido del servidor será gestionar los enfrentamientos entre dos jugadores
cercanos, realizando los cálculos necesarios y comunicándoselo a los terminales.
VI
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMATICA
Abstract
The goal of this project is MMORPG location-based for Google´s Andriod programming.
Key words: Android, Andengine, MMORPG, videogame, server-client.
1
Prologue
Before continue is underlined that game and videogame terms are going to use
interchangeably throughout this document, but always with the same concept of
entertainment software and electronic leisure.
MMORPG refer to a videogame style or type, Massively Multiplayer Online Role Playing
Game. Videogames, as same as happen with books, music or films, are clasificated by
styles, some examples are: adventure, survival horror, sports simulations, runs
simulations, arcade, platforms, MMORPG, etc. Said that a game is a MMORG only
means that owns to this style.
2
Introducction
What a game imply to be a MMORPG? The basics characteristics about MMORPG are
two: First, is a role game. The player are going to take an alter ego, just been one identity
or collective, performing a fictitious role in a fictitious world that wouldn’t be performed
in real life. Taking the player all the needs requires for development and evolution of this
alter ego, measure in common with levels. Second, is a massively multiplayer game. The
player is not going to be alone in this world. A big amount of players are going to clash
with him in real time.
The develop game is called Shadow Fire and put to the player a fictitious city on his
hands that moves in a parallel dimension like real world. This city have a unique link with
player and is able to catch and synthesized for it evolution all the elements that
surrounds to player, converting these “real” elements in usable “digital” resources.
Besides this large city has the peculiarity of being able to move along with the player,
following him at all times.
3
Game desing
VII
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMATICA
The game´s main body has one part to one only player in which he should to manage
resources in a base to develop. This base is represented by a city which has seven
buildings with different qualities and focuses and will have unique floors. The key of
building`s evolution will be to build inside just five floors with different advantages,
taking availability of floors in account by each building that would be more in quantity
that you could build. The player will have access to the improvement too and unities
development or storm-troops that will use to confrontation, being needed a well care on
their abilities and learning. By the way, will be vital for the well potential development of
the player search the effect internship combination of buildings that maximize their
strategy and complement each other perfectly with your storm-troops meanwhile you
pay the needed attention that all combine perfectly with benefits that granted by
climatology and places.
The second games mechanism will be to make sure to confront two players compete
for the resources of one zone. The changers of fight will be the unities previously are
been trained and are been teached attacks that player thinks properly. During
confrontations the game mechanism will change to fight turns, acting the players when
is indicated. Exchanging attacks with the objective of decrees a completely healthpoints of your opponents unity.
4
Localition
Location will have additional implies inside the game. Let us determined that geographic
position of players determine too proximity in the game, letting closer players interacting
each other (for example, attacking to one player to obtain benefits as resources). In
addition location determine some weathers conditions which are subjected to the game
thanks to API Weather Underground and making use of API Google Place to determinate
if is placed a business establishment determinate, granted both unics advantages and
essential for resources and player´s attribute, needed to be exploit efficiently to
competitive possibilities of player are maximized.
4.1
Localition uses
The game big news will be that this resources obtained by location are shared among
closer players, decreasing benefits. The one way that a player have to come back is to
VIII
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMATICA
acquire the complete improvement, will be to challenge other players in combat. Winner
in this confrontation acquiring a piece of resources by zone and climatology of his rival.
The game is developed to Android Google platform and completely interacting on Java
language and execute by Dalvik virtual machine, present at all Android systems. Java
has the advantage to be a programming language orientated to objects very powerful
and versatile, with an API very properly that allow incorporate class very complex easily
on development that easier programming work letting focus on programming efforts in
other important aspects.
5
Implementation
Develop a game is really complex task and require to combine lot of abilities and
capacities that are difficult to find in one person. Graphic´s design, programming,
videogame´s design, levels, IA and a long etc. For that, choose frameworks and API´s
that easier work is vital. For this project has been incorporated graphic motor Andengine
on its version GLES2. The API of this graphic motor added at project to slightly change
the circle of life and the form of programming an Android application, but easier work
extremely complex like for example the charge of graphic resources, texture or physic´s
incorporations.
5.1
Game engine
For the multiplayer incorporation game has been developed through remote server on
Java developed with a MySQL database through access IP red. The server is made sure
of two basics process in online game. Determined the players distance on real time,
communicating to players that are placed geographically of interaction among players
who like battle each other. Is created a complex algorithm and calculate efficient. The
other server tasks will be managed confrontations between two closer players doing the
necessary calculate and communicating to the terminals.
IX
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMATICA
X
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMATICA
Contenido 1 2 3 4 Prólogo ....................................................................................................................................... 3 1.1 La industria del videojuego ............................................................................................ 4 1.2 El proceso de creación de videojuegos ....................................................................... 4 1.2.1 Cadena de valor ....................................................................................................... 5 1.2.2 Diseño........................................................................................................................ 5 1.2.3 Arte y banda sonora................................................................................................ 6 1.2.4 Programación .......................................................................................................... 6 1.2.5 Testing....................................................................................................................... 6 Introducción .............................................................................................................................. 9 2.1 Motivación ...................................................................................................................... 10 2.2 Objetivos.......................................................................................................................... 11 2.2.1 Desarrollo para Android ....................................................................................... 12 2.2.2 Desarrollo para el servidor................................................................................... 12 Estado del arte ........................................................................................................................ 14 3.1 Nacimiento de los MMORPG....................................................................................... 14 3.2 MMORPG para Android ................................................................................................ 15 3.3 Incorporación de la localización a los MMORPG .................................................... 16 Diseño del juego ..................................................................................................................... 20 4.1 Tipos de jugadores ........................................................................................................ 21 4.2 Shadow Fire .................................................................................................................... 23 4.2.1 Descripción ............................................................................................................. 23 4.2.2 Navegación............................................................................................................. 26 4.2.3 Interfaz de usuario ................................................................................................ 29 4.2.4 Combate Jugador-Jugador ................................................................................ 38 4.2.5 Tipos de recursos.................................................................................................. 41 XI
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMATICA
5 4.2.6 Estructura de la ciudad ........................................................................................ 42 4.2.7 Tipos elementales ................................................................................................. 49 4.2.8 Efectos del clima ................................................................................................... 54 4.2.9 Efecto de la localización ...................................................................................... 56 4.2.10 Ejemplo de mejoras por localización................................................................. 59 4.2.11 Juego offline o sin conexión ............................................................................... 61 Tecnologías ............................................................................................................................. 65 5.1 Resumen de la arquitecura.......................................................................................... 65 5.1.1 Arquitectura de la aplicación............................................................................... 65 5.1.2 Arquitectura de tecnologías ................................................................................ 67 5.2 Android ............................................................................................................................ 69 5.2.1 Activity ..................................................................................................................... 69 5.2.2 Ciclo de vida de una aplicación Android ........................................................... 69 5.2.3 Service ..................................................................................................................... 71 5.3 SQLite............................................................................................................................... 71 5.4 Android vs HTML5......................................................................................................... 71 5.5 Elección de un motor gráfico ...................................................................................... 72 5.6 Andengine ....................................................................................................................... 76 5.6.1 Elementos de Andengine ..................................................................................... 77 5.6.2 Android vs. Andengine.......................................................................................... 78 5.7 XML .................................................................................................................................. 80 5.8 Weather Underground .................................................................................................. 80 5.9 Google Places................................................................................................................. 82 5.10 MySQL ............................................................................................................................. 83 6 Diseño software ..................................................................................................................... 87 6.1 Modelo de dominio........................................................................................................ 87 6.2 Casos de uso .................................................................................................................. 88 XII
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMATICA
6.3 7 6.3.1 Shadow Fire............................................................................................................ 92 6.3.2 Servidor ................................................................................................................... 95 6.4 Estructura de paquetes ................................................................................................ 96 6.5 Modelo de datos ............................................................................................................ 98 6.5.1 Tabla TUSER .......................................................................................................... 98 6.5.2 Tabla TBUILDING .................................................................................................. 99 6.5.3 Tabla TFLOOR........................................................................................................ 99 Implementación ................................................................................................................... 103 7.1 8 9 Diagrama de clases....................................................................................................... 92 Shadow Fire ..................................................................................................................103 7.1.1 TheShadowOfFireActivity .................................................................................. 103 7.1.2 Localización ......................................................................................................... 124 7.2 CombatActivity ............................................................................................................. 139 7.3 Servidor ......................................................................................................................... 142 7.3.1 Algoritmo de localización .................................................................................. 142 7.3.2 Combate entre jugadores .................................................................................. 144 Trabajos futuros y conclusiones ...................................................................................... 151 8.1 Trabajos futuros .......................................................................................................... 151 8.2 Conclusiones ................................................................................................................ 152 Estudio económico .............................................................................................................. 157 9.1 Personal......................................................................................................................... 157 9.2 Hardware ....................................................................................................................... 158 9.3 Coste del proyecto....................................................................................................... 161 Anexo A .......................................................................................................................................... 163 Plan de gestión del proyecto ...................................................................................................... 163 1 Resumen del proyecto ........................................................................................................ 165 9.4 Estructura de división del trabajo ............................................................................. 165 XIII
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMATICA
9.5 10 Descripción de paquetes de trabajo ........................................................................ 166 Equipo de trabajo .............................................................................................................171 10.1 Organigrama del equipo de trabajo.......................................................................... 171 10.2 Descripción de puestos de trabajo .......................................................................... 172 11 Planificación ..................................................................................................................... 176 Bibliografía ..................................................................................................................................... 179 XIV
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMATICA
Índice de ilustraciones
Ilustración 1- Cadena de valor....................................................................................................... 5 Ilustración 2 - Cadena de desarrollo ............................................................................................ 5 Ilustración 3 - World of Dragons ................................................................................................. 15 Ilustración 4 - Pocket Legends .................................................................................................... 16 Ilustración 5 - Star Legends ......................................................................................................... 16 Ilustración 6 - Parrallel Kingdom................................................................................................. 17 Ilustración 7 - Paralell Zombies .................................................................................................. 17 Ilustración 8 - Botón atrás ............................................................................................................ 26 Ilustración 9 - Botón Home .......................................................................................................... 26 Ilustración 10 - Botón Aplicaciones............................................................................................ 26 Ilustración 11 - Navegación ......................................................................................................... 27 Ilustración 12 - HUD ...................................................................................................................... 29 Ilustración 13 - Alta de usuario .................................................................................................. 31 Ilustración 14 - Pantalla Splash .................................................................................................. 32 Ilustración 15 - Panorámica de la ciudad.................................................................................. 33 Ilustración 16 - Interior de edificio .............................................................................................. 34 Ilustración 17 - Menú de nueva planta ...................................................................................... 35 Ilustración 18 - Menú de mejora ................................................................................................. 36 Ilustración 19 - Menú de información ........................................................................................ 37 Ilustración 20 - Combate jugador-Jugador .............................................................................. 38 Ilustración 21 - Colmena .............................................................................................................. 42 Ilustración 22 - Baliza .................................................................................................................... 43 Ilustración 23 - Planta de energía ............................................................................................... 44 Ilustración 24 - Centro de mando ............................................................................................... 45 Ilustración 25 - Hospital ............................................................................................................... 46 Ilustración 26 - Base militar ......................................................................................................... 47 Ilustración 27 - Laboratorio ......................................................................................................... 48 Ilustración 28 – Resumen detecnologías del lado cliente cliente ........................................ 67 Ilustración 29 – Resumen de tecnologías del lado servidor ................................................. 68 Ilustración 30 – Ciclo de vida de Andengine............................................................................. 79 Ilustración 31 - Modelo de dominio............................................................................................ 87 XV
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMATICA
Ilustración 32 - Casos de uso ...................................................................................................... 88 Ilustración 33 - Diagrama de clases cliente.............................................................................. 92 Ilustración 34 - Diagrama de clases servidor ........................................................................... 95 Ilustración 35 - Diagrama de paquetes ..................................................................................... 96 Ilustración 36 - Modelo entidad-relación .................................................................................. 98 Ilustración 37 - Localización de jugadores ............................................................................. 143 Ilustración 38 – Top de países con mayor número de Smartphones ............................... 152 Ilustración 39 – Consola OUYA y mando de control OUYA ................................................. 153 Ilustración 40 - Servidor de aplicaciones ................................................................................ 158 Ilustración 41 - Switch ................................................................................................................ 159 Ilustración 42 - Router de salida ............................................................................................... 160 Ilustración 43 - estructura de división del trabajo ................................................................. 166 Ilustración 44 - Equipo de trabajo ............................................................................................. 171 Ilustración 45 - Ejemplo diagrama de quemado de Pivotal Tracker .................................. 177 Índice de tablas
Tabla 1 - Estados de la navegación del UI ................................................................................ 28 Tabla 2 -Diseño de los atributos de un emisario ..................................................................... 39 Tabla 3 - Diseño de los atributos de un ataque ....................................................................... 39 Tabla 4 - Diseño de recursos ....................................................................................................... 41 Tabla 5 - Plantas de la colmena .................................................................................................. 42 Tabla 6 - Plantas de la baliza ....................................................................................................... 43 Tabla 7 - Plantas de la planta de energía .................................................................................. 44 Tabla 8 - Plantas del centro de mando ...................................................................................... 45 Tabla 9 - Plantas del hospital ...................................................................................................... 46 Tabla 10 - Plantas de la base militar .......................................................................................... 47 Tabla 11 - Plantas del laboratorio............................................................................................... 48 Tabla 12 - Diseño de los tipos elementales .............................................................................. 52 Tabla 13 - Efectos de combate ................................................................................................... 53 Tabla 14 - Efectos del clima......................................................................................................... 55 Tabla 15 - Efectos de la localización .......................................................................................... 59 Tabla 16 - Prueba de rendimiento .............................................................................................. 75 XVI
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMATICA
Tabla 17 - Tabla TUSER................................................................................................................ 99 Tabla 18 - Tabla TBUILDING ....................................................................................................... 99 Tabla 19 - Tabla TFLOOR ........................................................................................................... 100 Tabla 20 - Horas/Personal ......................................................................................................... 157 Tabla 21 - Especificaciones del servidor ................................................................................. 158 Tabla 22 - especificaciones del switch .................................................................................... 159 Tabla 23 - Especificaciones del router..................................................................................... 160 Tabla 24 - Inventario ................................................................................................................... 161 Tabla 25 - Coste del proyecto.................................................................................................... 161 Tabla 26 - Planificación .............................................................................................................. 176 XVII
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMATICA
XVII
I
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMATICA
1
Prólogo
1
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
2
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
1 Prólogo
Es indudable que la industria del videojuego no ha dejado de crecer desde los sus
inicios, allá por la lejana década de los años 80, donde comenzó su andadura para
convertirse en la reina del entretenimiento electrónico [UPC12]. La labor que emprendió
en la popularidad de salones recreativos donde juegos como Pac-man, Mario o Donkey
Kong comenzaban sus andaduras de popularidad en antiguas máquinas arcade, siete
generaciones de consolas después, la parición de Internet, las redes sociales junto al
juego social y la fuerte apuesta de los dispositivos móviles como smart-phones y
tablets por los juegos han terminado de acercar los videojuegos a un público masivo
nunca antes imaginado [CLA11].
Un pasado reciente y único, un presente asombroso y lleno de posibilidades y un futuro
que sólo puede ser calificado de espectacular son las claves que han levantado a los
videojuegos al estatus de “arte” más revolucionario jamás creado por la mano del
hombre.
Es importante entender un videojuego como un todo. Es necesario, preciso e
inexcusable tener una visión de conjunto porque, después de todas las fases de
desarrollo, después de de todo el trabajo realizado, sólo quedará la obra. Es necesario
tener claro que en la realización de un juego se conjugan gran multitud de habilidades
complejas de programación, arte, diseño gráfico, entre muchos otros y que pueden en
ocasiones necesitar rozar el virtuosismo para crear una experiencia de éxito que los
jugadores nunca olvidaran.
Es apasionante comprobar que el videojuego no sólo despierta adrenalina. Tenemos
obras, títulos, que han hecho asomar alguna lágrima e emoción. Otros han descolgado
la mandíbula por asombro y otros han conseguido unir a toda la familia en el salón
alrededor del televisor en una experiencia de canciones, baile, minijuegos, acertijos y
diversión.
Este aspecto social de los juegos es clave, ya que el hecho “social” siempre ha estado
presente en este mundo y ha rodeado a los videojuegos desde siempre. Y en los últimos
tiempos, esta dialéctica la han asumido los creadores, gracias a las virtudes de Internet
y el juego online, para compartir ese ocio digital. La red, como base, hace que consolas,
3
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
ordenadores, smart-phones o tablets expandan los videojuegos exponencialmente.
Internet es el patio de recreo, el sitio donde se han apoyado los dispositivos y el lugar
donde la experiencia crece.
Los videojuegos son sin duda, el octavo arte.
1.1 La industria del videojuego
La industria de videojuegos ha experimentado en los últimos años altas tasas de
crecimiento, principalmente debidas al desarrollo de la computación y capacidad de
procesamiento así como a la dedicación cada vez mayor de capital por parte de las
editoriales y empresas de desarrollo. En la década de 2000, los videojuegos han pasado
a generar más dinero que la del cine y la música juntas, como en el caso de España. La
industria de videojuegos generó 57.600 millones de euros durante 2009 en todo el
mundo.
Al igual que ocurriera con el cine y la televisión, el videojuego ha logrado alcanzar en
apenas medio siglo de historia el estatus de medio artístico, y semejante logro no ha
tenido lugar sin una transformación y evolución constante del concepto mismo de
videojuego y de su aceptación. Nacido como un experimento en el ámbito académico,
logró establecerse como un producto de consumo de masas en tan sólo diez años,
ejerciendo un formidable impacto en las nuevas generaciones que veían los videojuegos
con un novedoso medio audiovisual que les permitiría protagonizar en adelante sus
propias historias.
1.2 El proceso de creación de videojuegos
Cuando se habla del desarrollo de videojuegos, aunque se trate a todos los efectos de
un desarrollo software, difiere en aspectos importantes con una aplicación de software
comercial y tradicional al uso. De nuevo, es necesario explicar las salvedades y puntos
distintivos pues, como se ha indicado anteriormente, se necesitan conjugar multitud de
disciplinas dispares para completar el producto.
4
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
1.2.1
Cadena de valor
La cadena de valor del desarrollo de un videojuego, a primera vista, puede parecerse al
proceso de creación y distribución de software comercial tradicional.
Desarrollo
Edición
Producción
Marketing y
distribución
Ilustración 1- Cadena de valor
Primero el equipo de desarrollo crea el juego. La editorial es la encarga de adaptar el
juego al consumidor, realizando labores como la traducción, doblaje, localización, darlo
a conocer al público. En este punto, la máquina comercial que todos conocemos se
pone en marcha para producir en masa las copias del juego (en caso de distribución en
formato físico) y el juego se distribuye, publicita y vende.
Pero es en el desarrollo donde se encuentran las grandes diferencias y el equipo de
desarrollo toma importancia. Al realizar un zoom al eslabón del equipo de desarrollo
destacan perfiles que no se necesitan en los desarrollos tradicionales [Raposo12].
Ilustración 2 - Cadena de desarrollo
1.2.2
Diseño
La labor del diseñador es definir los aspectos que relacionan al usuario con el juego, que
posteriormente necesitan hacerse realidad a manos de los artistas y los
programadores. Es el encargado de definir cómo van a ser todos los aspectos y
5
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
trasfondo, junto con la manera en la que se juega. Define el estilo de juego y el sistema
de juego, la curva de dificultad, los personajes, la historia, escenarios y los niveles, etc.
Aspectos que tienen un impacto directo en la valoración del juego por parte del usuario,
un mal diseño hace que el juego sea aburrido, tedioso o incluso frustrante, un juego mal
diseñado, es un fracaso total desde el principio.
1.2.3
Arte y banda sonora
Aunque la labor de artistas gráficos y músico es distinta y no suele considerarse como
unificada, dada su condición de artistas se va a tratar como única para la clasificación.
La labor de los artistas es crear los gráficos que tiene el juego, los elementos visuales y
sonoros que el usuario percibe. Este perfil es el más creativo al crear tanto los gráficos
como la música y los efectos de sonido que acompañan el juego. Es necesario tener
una formación artística, una técnica experimentada y muy depurada así como un gran
talento para poder desarrollar bien estos elementos.
1.2.4
Programación
Pone a disposición del diseñador y del artista las herramientas necesarias para realizar
su trabajo en relación con el hardware que va a soportar. Su labor es de unificación,
acopla el trabajo de todo el equipo a la vez que lo hacer al hardware, programa todo el
sistema de juego ideado por el diseñador y añade el trabajo realizado por el artista,
dotándolo de la lógica necesaria para que tenga sentido dentro del juego. Es necesario
tener una formación técnica de sistemas y desarrollo de software, así como
conocimiento de IA, física, matemáticas entre otros para desarrollar correctamente un
juego.
1.2.5
Testing
La labor del testador no es el desarrollo del juego y realmente no forma parte del equipo
de desarrollo. Su trabajo consiste en buscar y depurar el juego, fomentando el feedback
con el equipo para la mejora y corrección de los errores. Para medir se el juego es apto
para el público masivo.
6
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
2
Introducción
7
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
8
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
2 Introducción
En el título del proyecto que tiene entre sus manos, MMORPG location-based for
Android (MMORPG basado en localización) destacan tres aspectos muy distintos, pero
que juntos, tienen un gran potencial [WIKIMM12].
Primero ser un MMORPG. La industria del videojuego es un paradigma de crecimiento
que año tras año demuestra que a los usuarios nos gusta jugar. Seguramente usted
mismo, en mayor o menor medida, sin ser consciente o conscientemente, alguna vez
has jugado a un videojuego. Pero no hay que dejarse engañar, el desarrollo de
videojuegos está plagado de duros inconvenientes: la competencia es altísima, el
conocimiento necesario para su desarrollo es muy elevado, se requieren perfiles muy
distintos para llevarlo a cabo (este aspecto se tratará más adelante con un poco más de
detalle) y los usuarios exigen una calidad extrema en el software que acaban de
adquirir. Sin un gran esfuerzo y dedicación, hacer un buen juego es muy difícil, que
tenga éxito comercial es casi imposible.
Segundo, estar basado en localización. Los dispositivos modernos hace tiempo que
dejaron de ser simples teléfonos para convertirse en autenticas navajas suizas
tecnológicas. Encontrar un Smartphone sin GPS es tarea complicada, y la tendencia
actual del mercado marca que todo el mundo tendrá tarde o temprano uno. La
geolocalización capaz de transformar aplicaciones normales en autenticas maravillas,
elevando la experiencia del usuario a nuevas cotas.
Y tercero, estar desarrollado para Android. Android es la plataforma de software que
está revolucionando el mercado global de telefonía móvil. Se trata de la primera
plataforma móvil de código abierto que ha logrado introducirse en los principales
mercados mundiales. Con un gigante como Google junto con la Open Handset Alliance
(agrupación de más de 50 entidades), en unos pocos años se ha convertido en una
fuerza de cambio, ganándose de paso el respeto de muchos.
9
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
2.1 Motivación
Las motivaciones que han impulsado a desarrollar un MMORPG para Android son muy
diversas, sobre todo si tenemos en cuenta las poderosas implicaciones que la
incorporación de la geolocalización añade al sistema.
¿A quién no le gusta jugar o competir?
Todos disfrutamos jugando, desde un simple juego de niños de indios y vaqueros hasta
los juegos tan complejos que podrían ser el objeto de varios libros. Y todos disfrutamos
compitiendo entre nosotros, deportes de equipo, competiciones, torneos… La lista es
muy extensa, la gran virtud del ocio electrónico y multijugador aúna ambos aspectos a
la perfección.
Es cierto que este aspecto puede levantar muchas controversias y es muy delicado. El
mundo de la competición humana en ocasiones ha vivido épocas muy amargas,
independientemente de si se trata de ocio electrónico o otra forma de competición, ya
sea deportiva, comercial, etc. Aunque no esté contemplado como requisito de pleno
derecho en el proyecto, uno de los objetivos es crear un software que, sin sacrificar
nada de jugabilidad ni diversión, encontrar una mecánica que permita una sana y leal
competencia.
El volumen de la industria del videojuego
Como ya se ha comentado anteriormente, el crecimiento y volumen de la industria del
videojuego es inmenso hoy en día y es indiscutiblemente la forma de ocio electrónico
más consumida. Los potenciales jugadores son miles y es posibles encontrar multitud
de jugadores que se amoldan a perfiles muy distintos a los que es interesante lanzar un
producto con unas cualidades determinas y conseguir cierto éxito.
Reto tecnológico
Programar un videojuego no es tarea fácil. Programar una aplicación que haga un
correcto uso del GPS y permita interactuar a los usuarios entre sí tampoco es tarea
sencilla. Trabajar para una nueva plataforma aun en desarrollo y desconocida que
necesita un gran estudio previo y que le va a requerir un aprendizaje desde cero para el
10
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
correcto desarrollo en la aplicación. Todo junto triplica la dificultad del proyecto y
supone un reto muy gratificante a superar.
Falta de madurez en los MMORPG para Smartphones.
Aunque los MMORPG son muy conocidos y jugados para plataformas más clásicas
como el PC o los navegadores, aun queda un largo recorrido para alcanzar productos
innovadores y atractivos para el consumidor de smart-phones y tablets. Con este
proyecto este se quiere proponer algunas nuevas ideas nuevas e ideas al mundo de la
jugabilidad en los MMRPG, especialmente en el uso de la localización, que sean
originales o muy poco vistas y explotadas.
2.2 Objetivos
El objetivo por tanto es la creación de un juego completo para la plataforma móvil
Android, haciendo uso de todas las capacidades de localización que expandan la
experiencia del jugador y soportar todas las capacidades necesarias para incorporar
elementos jugables y creíbles que modifiquen la jugabilidad adecuadamente.
El juego será capaz de gestionar todos los elementos disponibles para el jugador,
permitiendo una compleja posibilidad de crear todos los elementos disponibles y
gestionando el momento en que se puedan crear, permitiendo consultar el estado de su
progreso tanto para un elemento en concreto como en general, actualizar aquellos
elementos que puedan o precise el jugador cambiar y eliminar aquellos que ya no
necesita.
También será necesaria la creación de un servidor centralizado que unifique la tarea de
gestionar las posiciones relativas de los jugadores en tiempo real y determinar si se
encuentran en una posición cercana. Será el servidor el encargado también de la
gestión de los enfrentamientos entre los jugadores, incluyendo la lógica y reglas del
combate y enfrentamientos.
Resumiendo con una estructura más ordenada y desglosados por categorías, los
objetivos que forman parte del proyecto son:
11
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
2.2.1
»
»
»
Motor gráfico Andengine
‐
Diseñar e implementar la UI
‐
Gestionar los recursos gráficos de la UI
Un solo jugador
‐
Gestión y evolución completa de la base.
‐
Gestión completa de los recursos.
‐
Gestión y evolución de las unidades para el enfrentamiento.
Geolocalización
‐
‐
‐
‐
»
Desarrollo para Android
Medir la localización geográfica del jugador.
Medir correctamente la climatología de la posición del jugador.
Adquirir información relevante sobre el lugar donde se encuentre el jugador.
Aplicar las características de la geolocalización al juego
Juego Multijugador
‐ Combate Jugador/Jugador
2.2.2
»
Geolocalización
‐
‐
»
Desarrollo para el servidor
Controlar y medir en tiempo real la posición relativa a jugadores cercanos
Gestionar las interacciones entre jugadores cercanos
Juego Multijugador
‐ Gestión del combate Jugador/Jugador
12
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
3
Estado del arte
13
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
3 Estado del arte
El mundo de los MMORPG es enorme y basto., especialmente si nos olvidamos de la
cuestión de localización, aunque esto no quiere decir que en los últimos años hayan
surgido jugos que explotan la localización de los dispositivos móviles, ya existen
algunos MMORPG basados en localización para Android. Pero es un mercado que aún
no ha podido romper las directrices de sus hermanos mayores para PC/consola, juegos
menores para navegador o redes sociales ya asentados. Los juegos que están
disponibles beben directamente de ellos sin aportar nada nuevo, y es un segmento de
mercado que necesita ideas y directrices nuevas que puedan desviar la tendencia actual
y sean atractivos para el usuario. Especialmente con las características únicas de las
pantallas de los dispositivos móviles, donde la mayoría requieren el uso de controles
táctiles de la pantalla y están en continuo movimiento con su dueño.
Estas características que pretenden aplicarse sin un estudio a las plataformas móviles
son producto de la inercia del mercado y los desarrolladores que insisten en trasladar
las bondades de los juegos ya asentados en el mercado directamente a las plataformas
móviles sin un estudio adecuado para adaptar los juegos a las características que estas
plataformas necesitan realmente. Para entender un poco mejor estos pequeños
problemas, es necesario realizar un ligero repaso histórico de los títulos que han
marcado el camino a seguir para entender cuáles son las fórmulas ya establecidas y
asentadas, desde los primeros y básicos MMORPG, hasta su evolución hasta la
MMORPG basados en localización que se pueden encontrar hoy día y las ideas que
intentan trasladarse a los juegos para móviles directamente.
3.1 Nacimiento de los MMORPG
El primer MMORPG comercial reconocido fue basado en texto fue Islands of Kesmai,
publicado en 1984. Pero la popularidad de estos juegos se logró con el primer MMORPG
gráfico, Neverwinter Nights, que nació en AOL en 1991 y se mantuvo hasta 1997.
The Realm Online fue uno de los primeros MMORPGs con verdadero éxito comercial.
Publicado por Sierra Online en 1996, incluía un motor gráfico de dos dimensiones y un
sistema de niveles de personajes y un sistema de combate por turnos inspirados
14
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
en Dungeons & Dragons. No obstante a Ultima Online publicado en 1997, se le acredita
la popularización del género.
El 23 de noviembre de 2004 salió a la venta World of Warcraft, creado por la compañía
Blizzard. Este juego ha batido récords en su género, ya que ha superado la increíble cifra
de 13 millones de jugadores. Destaca por su facilidad de uso, su interactividad y por los
escenarios gigantescos sin cargas que conforman un universo continuo. Hasta ahora,
World of Warcraft es el juego con más suscriptores de la historia [NEOT09].
3.2 MMORPG para Android
Los primeros MMROPGs para Android beben directamente de la vertiente iniciada con
World of Warcraft, donde jugadores controlan un avatar dentro de un mundo en una
vista de tercera persona explorando el entorno, combatiendo contra varios monstruos y
jugadores, completando misiones e interactuando con personajes no jugadores u otros
jugadores, mientras evolucionan las habilidades y atributos de su avatar, medido en
forma de niveles.
Cabe destacar que estos primeros MMORPG no hacen uso de las capacidades de
localización del usuario ni lo extrapolan a la jugabilidad ni capacidad del juego. La
cercanía de los jugadores dentro del juego únicamente es medida por los movimientos
dentro del propio juego.
Algunos ejemplos de Android de esta vertiente son:
World of Dragons
Desarrollado por CorsairBand.
Ambientado en el mundo de fantasía y basado en la
época medieval, dónde dragones, orcos, elfos,
humanos y más especies conviven en constante
batalla para dominar sobre las demás especies. Con
Ilustración 3 - World of Dragons
un nivel gráficos poco espectaculares, que no hacen
uso de muchos elementos 3D.
15
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Pokect Legends
Desarrollado por Spacetime Studio.
Ambientado en el mundo de fantasía y basado en la época
medieval con gráficos estilo cartoon. En el juego encarnamos a
un personaje con una categoría, oficio o estilo de lucha que lo
diferencia. El objetivo es cumplir misiones en solitario o
formando un grupo de jugadores (popularmente conocido
Ilustración 4 - Pocket
Legends
como raid), mejorando a nuestro personaje a medida que
subimos de nivel ganando experiencia.
Star Legends
Desarrollado por Spacetime Studio.
Siguiendo las bases de Pocket Legends, Star
Legends cambia la temática medieval por la
Ilustración 5 - Star Legends
exploración y aventuras en un mundo creado
siguiendo las bases de la ciencia ficción pura. Dentro
de Star Legends podemos escoger un avatar con una categoría que marcan su estilo de
juego. El objetivo es cumplir misiones en solitario o formando un grupo de jugadores sin
dejar de evolucionar nuestro personaje, consiguiendo capacidades que nos hagan más
competente para el cumplimiento de misiones más complejas o de mayor dificultad.
3.3 Incorporación de la localización a los
MMORPG
Comercialmente ya existen juegos que aúnan en la localización del jugador con los
MMRRPG de corte clásico. Estos juegos son de reciente aparición y aún son una
vertiente muy poco explotada. El principal uso de que hacen estos juegos de la
localización es seguir la posición del jugador y permitir la conquista de las diferentes
zonas en las que se encuentra.
Algunos ejemplos comerciales de juegos ya disponibles son:
16
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Parallel Kingdom
Desarrollado por PerBlue.
Parallel Kingdom fue el primer RPG basado en
localización para iOS u Android. El juego se
desarrolla en un mundo paralelo conocido como
Ilustración 6 - Parrallel Kingdom
Parallel Kingdom donde los usuarios reclaman
sus territorios viajando físicamente en el mundo
real a partir del dispositivo GPS o invitando a nuevos jugadores para que puedan viajar a
nuevos territorios que no pueden alcanzar físicamente.
Parallel Zombies
Desarrollado por PerBlue.
En Parallel Zombies, los jugadores toman las calles en una
lucha por su supervivencia en un mundo post-apocalíptico en
el que los zombies invaden la tierra. Gracias a la tecnología
GPS, los zombies serán capaces (de manera figurada) de
acercarse a las zonas donde habitan los jugadores e incluso
golpear y entrar en sus propias casas. El componente
Ilustración 7 - Paralell
Zombies
MMORPG permite que todos los jugadores cercanos entre sí
colaboren en las labores de exterminio y supervivencia y
ayudarse mutuamente para aumentar las posibilidades de
vivir.
17
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
18
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
4
Diseño del juego
19
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
4 Diseño del juego
En el desarrollo de videojuegos, el documento de diseño es una herramienta esencial
que requiere una atención especial antes de comenzar con el verdadero desarrollo, pues
en este documento se recogen todos los detalles relativos al diseño del juego [SION10].
Se especifican elementos como la jugabilidad, historia, personajes, posibilidades,
entorno, ambientación etc. Es la versión tradicional de la Especificación de Requisitos
Software pero especializado y orientado al mundo del videojuego.
En un documento de diseño se comienza dando simples pinceladas sobre el juego que
se va a modelar hasta llegar al máximo nivel de detalle, definiendo controles, pantallas
de juego y mecánicas concretas. En él se plasman todas y cada una de las ideas que
aparecerán en el juego.
Cuales son utilidades de un documento de diseño.
Concretar ideas
Las ideas que surgen para el desarrollo de un videojuego son muy prolíficas y en
ocasiones incluso contradictorias o pueden desembocar a la larga un problema que
puede hacer que el proyecto acabe en fracaso, sobre todo si se da en fases muy
avanzadas del desarrollo. Un documento de diseño sirve para plasmar y concretar ese
pequeño caos en un papel donde se aclarare las ideas y asegurándose que son capaces
de funcionar unidas en un juego. Así mismo, podremos discernir de forma muy
preliminar las buenas ideas de las malas.
Estar en el mismo barco
No es extraño diferentes integrantes del mismo equipo de trabajo no tengan claros los
objetivos y características del juego que va a desarrollarse e incluso tengan ideas
totalmente opuestas. Durante la elaboración del GDD se deberán detectar los puntos de
desacuerdo y se podrán zanjar los problemas. De esta manera nos aseguramos de que
todos los compañeros están en el mismo barco y tienen un objetivo común.
20
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Preparar el desarrollo
Como en cualquier proceso de construcción de software, la fase de ingeniería nos
prepara para la implementación. Gracias al GDD nos embarcaremos en etapas
posteriores conociendo el desarrollo y las tecnologías a las que el equipo debe
enfrentarse. En algunos casos estas especificaciones permiten adaptar el desarrollo a
los conocimientos del equipo o incluso a las búsquedas de integrantes que se adapten a
las necesidades.
Comunicación
Tanto en desarrollos comerciales como el que nos ocupa en este momento la
comunicación con el exterior es importante. En el caso de un juego comercial, el equipo
querrá conseguir la financiación de una editora. Con el documento de diseño adecuado
puede conseguirse que personas y compañías ajenas al proyecto comprenda la idea
que pretende desarrollarse, se compruebe que es un proyecto serio y estudiado y
accedan a colaborar.
4.1 Tipos de jugadores
Antes de especificar cómo va a ser el sistema de juego, a definir la experiencia del
jugador al usar el software. Existen dos perfiles de usuario distintos que demandan
juegos totalmente diferentes.
Casual gamer o jugador casual
Se caracteriza por dedicar tiempo o interés en jugar muy limitado. Puede ser cualquier
persona que muestre un interés pasajero por los videojuegos. Los videojuegos que
buscan atraer a jugadores tienden a presentar reglas simples y una jugabilidad fácil que
gente de cualquier edad o con cualquier nivel de habilidad pueda disfrutar.
Generalmente se inclinará por la videoconsola o videojuego más económico, más fácil
de utilizar y jugar, o simplemente que esté de moda. Comúnmente no tiene mucho
conocimiento sobre la construcción, calidad u otros temas más específicos de los
videojuegos. Son los jugadores más abundantes, pero los menos fieles.
21
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Hardcore gamer o jugador extremo
Se interesa principalmente por videojuegos más complejos, difíciles de manejar y
dominar que realmente presenten un verdadero reto, dedicando una gran cantidad de
horas jugando para conocer y explotar todos los aspectos del juego. Dominando e
interesándose por términos y temas más específicos. Son mucho más críticos y menos
abundantes, pero la dedicación que profesan les hace ser consumidores más fieles.
El diseño del juego va a orientarse principalmente a jugadores extremos.
22
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
4.2 Shadow Fire
Shadow Fire es un juego multijugador masivo online basada en localización. La primera
versión del juego pretende realizarse para Android como proyecto de fin de carrera de la
Universidad Pontificia Comillas.
Para un futuro no se descarta la posibilidad del desarrollo de una nueva versión del
juego que se asiente en las bases marcadas por Shadow Fire, aumentando sus
capacidades e incorporando nuevos elementos en la jugabilidad o mejoras generales.
Igualmente, dadas las características del desarrollo del juego para Android, también es
posible realizar en un futuro un port a otras plataformas móviles como Iphone/IOS o M
Windows Mobile. Con la integración total de todos los jugadores en una única
experiencia de juego global.
4.2.1
Descripción
Shadow Fire pone al jugador bajo el control de toda una ciudad que no se encuentra
físicamente en el mundo real, si no en un mundo paralelo similar a la tierra conocida.
Desde el momento de la creación de esta ciudad, la ciudad queda vinculada con un
vínculo único al jugador, por lo que se ve afectada de una manera directa por los
movimientos del jugador, de las condiciones climáticas de donde se encuentre y de los
lugares que visite.
La ciudad está compuesta por un total de siete edificios con características y objetivos
distintos. En el interior de estos edificios se pueden construir un total de cinco plantas y
un total de 35 puntos estructurales a gastar. Estas plantas además pueden tener un
nivel entre 1 y 5. Cuanto mayor sea el nivel, un mayor beneficio aportaran al conjunto.
Cualquier subida de que decida hacer en una planta, ya sea elevando el nivel de una ya
construida como creando una nueva, reducirán consumirán el total de puntos
estructurales del edificio.
Por la limitación de los puntos estructurales y el límite de plantas nunca se podrán tener
cinco plantas de nivel 5 en un mismo edificio., la cantidad de plantas disponibles por
edificio es muy superior a las cinco. El objetivo de este sistema es forzar al jugador a
buscar una combinación exitosa que complemente a la perfección sus necesidades
23
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
para el enfrentamiento contra otros jugadores que maximicen sus posibilidades de
obtener la victoria a la vez que se busca optimizar los beneficios por clima y lugar.
La construcción o subida de nivel de las plantas además conllevarán un gasto extra de
recursos. En total existen cinco tipos diferentes de recursos: ciencia, material de
construcción, energía, comida y población. Todos los recursos disponen de un medidor
de cantidad/tiempo que se sumarán al total de los recursos automáticamente y de
máximo que nunca podrá ser superado independientemente de la cantidad/tiempo que
se gane de un recurso, salvo que se destinen plantas específicamente a subir el
máximo.
A los beneficios obtenidos por las plantas hay que sumar beneficios obtenidos por
climatología y lugar. Tanto por el clima como por el lugar donde se encuentre un
jugador se obtienen unos beneficios prefijados. Estos beneficios pueden ser muy
dispares, como una mejora en la cantidad/tiempo que se gana de un recurso o incluso
una mejora porcentual en un tipo elemental o una mejora en el potencial de ataque.
Encontrarse cerca de otro jugador tendrá efector devastadores en los beneficios que se
dan por lugar y clima, pues estos beneficios se repartirán a partes iguales entre los
jugadores. Es decir, que si dos jugadores coinciden en un mismo lugar, ambos recibirán
únicamente el 50% de la mejora; en caso de coincidir 10, cada uno recibirá sólo un 10%.
La única forma de mejorar este porcentaje es retando a un jugador cercano a un
enfrentamiento. El jugador que salga victorioso del enfrentamiento obtendrá una
cantidad del porcentaje de su oponente, aumentando los beneficios del ganador y
reduciendo los del perdedor.
El jugador dispondrá de un emisario para los enfrentamientos. Cuando un jugador reta o
es retado por otro en combate, serán estos emisarios el encargado de luchar por ellos.
Los jugadores, gracias a la experiencia ganada en combate por estos emisarios, podrán
hacerlos subir de nivel ganará un monto de puntos a repartir entre sus características.
Cada emisario dispondrá además de uno o varios tipos elementales a los que es afín y
un conjunto de ataques a realizar en combate. Igual que ocurre con los edificios, el total
de puntos es insuficiente para elevar todas las características a su máximo y el número
de ataques es superior al total que se pueden aprender. De nuevo el objetivo de este
sistema es forzar al jugador a buscar una combinación exitosa que complemente a la
24
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
perfección sus necesidades para el enfrentamiento contra otros jugadores que
maximicen sus posibilidades de obtener la victoria.
Resumiendo, el juego consta de:
Gestión de una base
La gestión de una base será la forma básica de juego para un solo jugador. El jugador
deberá gestionar unos recursos que le permitan mantener y avanzar una base,
epicentro de toda su actividad en el juego.
BTC (Based-turn Combat o combate basado en turnos)
Será el sistema de interacción para el enfrentamiento o combate entre jugadores y entre
el jugador y la máquina o inteligencia artificial. En este sistema, un personaje o grupo
controlado por cada combatiente actúan por turnos no simultáneos en la lucha por
derrotar a su rival.
Geolocalización
El rol que va a desempeñar la localización GPS dentro del juego va a ser diversa. La
ubicación del jugador determina las condiciones del juego, si el jugador se encuentra en
su casa, su personaje también estará en su casa. Establecerá la cercanía de dos
jugadores próximos físicamente, que en el juego estarán en la misma posición relativa,
si dos jugadores se cruzan por la calle, en el juego sus personajes también se estarán
cruzando. Y por último establecerá las condiciones climatológicas del juego iguales al
lugar en donde se encuentra el jugador, si en la vida real llueve, en el juego también.
25
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
4.2.2
Navegación
Botones de navegación
A continuación se muestra los usos de los botones de navegación estándar de los
sistemas Android en Shadow Fire. Estos botones táctiles y digitales pueden encontrarse
en la sección inferior de la pantalla del smart-phones y disponibles únicamente a partir
de la versión 4.0 Ice Cream Sandwitch de Android.
Atrás
Ilustración 8 - Botón atrás
Usado en la navegación permite volver a la pantalla o estado anterior. En caso de
encontrarse en la panorámica de la ciudad, se cierra la aplicación.
Home
Ilustración 9 - Botón Home
Pulsar el botón Home devolverá automáticamente a la pantalla de inicio del sistema
Android, colocando la aplicación en estado resume. En caso de volver a la aplicación, se
iniciará en el mismo punto en se pulso el botón Home.
Aplicaciones
Ilustración 10 - Botón Aplicaciones
No tiene uso en Shadow Fire.
26
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Esquema de navegación
A continuación se muestra el esquema de navegación de la interfaz ciudad.
Ilustración 11 - Navegación
27
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Descripción de los estados de la navegación.
Estado Nombre
Acciones
0
Nuevo
Estado accesible únicamente si se inicia la aplicación sin estar
usuario
previamente dado de alta. Se accederá a (1) al completar
correctamente el registro.
1
Splash
Estado de transito automático. Una vez completada la carga de
datos, automáticamente se accederá a (2).
2
Ciudad
Estado donde se muestra la panorámica de la ciudad. En caso
de pulsar un edificio, se accede a (3).
En caso de pulsar atrás, se finaliza la aplicación.
3
Interior
En este estado se muestra el interior del edificio accedido.
edificio
Pulsando una planta construida, se accede a (6).
Pulsando una planta vacía, se accede (5).
Pulsar atrás vuelve a (2).
4
Cambio nivel
En este estado se muestra las opciones de cambio de nivel de
una planta.
Pulsar cualquier posibilidad, tanto de subida o bajada, devuelve
el estado a (3).
Pulsar atrás vuelve a (3).
5
Nueva
En este estado se muestras las posibles plantas a las que se
planta
puede optar para ocupar la planta vacía.
Pulsar cualquier planta devuelve el estado a (3).
Pulsar atrás vuelve a (3).
6
Información
En cualquier estado de la aplicación, pulsar el botón de
información completa accede al estado (6).
Pulsar atrás vuelve a (2).
Tabla 1 - Estados de la navegación del UI
28
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
4.2.3
Interfaz de usuario
A continuación se explica detalladamente todos los interfaces y pantallas que el usuario
podrá encontrar a lo largo de su experiencia de juego.
HUD
HUD son las siglas en inglés de Head-Up Display, elemento del interfaz siempre visible y
superpuesto a las demás interfaces. Su objetivo es mostrar información relevante al
usuario y mejorar su experiencia.
Recursos
Viento
Temperatura
Botón Información
Ilustración 12 - HUD
Recursos
Los recursos se encuentran en la sección superior del HUD de la UI. Siempre se dispone
de la información relativa a la cantidad de recursos disponibles por el jugador. En ella se
puede encontrar la información relativa a los cinco recursos disponibles y sus valores
actuales.
29
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Viento
Muestra el indicador de la velocidad del viento. La velocidad del viento
es uno de los indicativos que permiten establecer las mejoras por
clima que consigue el usuario.
Temperatura
Muestra el indicador de la temperatura de la posición del jugador. La
velocidad del viento es uno de los indicativos que permiten establecer
las mejoras por clima que consigue el usuario.
Botón Información
Último elemento que se puede encontrar en la sección lateral derecha
del HUD de la UI. Pulsando este botón puede accederse a la
información completa sobre la posición relativa a clima y lugar, junto a
toda la información disponible sobre jugadores cercanos a esa
posición.
30
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Interfaz de nuevo usuario
Previo a poder jugar, un nuevo usuario debe darse de alta correctamente en el servidor,
es interesante antes de entrar en detalle sobre los interfaces de usuario del juego,
estudiemos la UI de nuevo usuario.
Nombre
Email
Botón enviar al servidor
Ilustración 13 - Alta de usuario
Nombre
Caja de texto reservada al nombre del usuario. El nombre de usuario deberá ser
exclusivo y el servidor no permitirá continuar con el juego repitiendo el proceso de alta
hasta que le jugador no haya introducido un valor válido y único.
Email
El email forma parte de la forma de comunicación básica y directa con el jugador. No
tiene un uso directo en la jugabilidad del juego.
31
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Interfaz Splash
Una pantalla splash es una imagen simple donde se presenta el logo del juego, la
portada del mismo y una barra de progreso. El objetivo de la pantalla splash es enseñar
algo más que una pantalla en negro al jugador mientras en segundo plano se cargan
todos los recursos necesarios. Es importante remarcar que la carga de recursos, sobre
todo los recursos gráficos, es vital para el correcto rendimiento del juego.
Logo y portada
del juego
Barra de progreso
Ilustración 14 - Pantalla Splash
Logo y portada
Simplemente se muestra en grande el logo y la imagen de portada del juego.
Barra de progreso
Barra de progreso que indica a medida que se completa el nivel de carga de todos los
recursos que precisa el juego. Al completarse se indica que todo se ha cargado
correctamente y se puede continuar con el juego.
32
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Interfaz de usuario en modo ciudad
El elemento principal de la interfaz de usuario es la visión general de la ciudad. En ella se
muestran todos los edificios a los que el usuario puede acceder. Tocando cada edificio
podemos acceder a su interior.
Los edificios son el elemento principal de Shadow Fire y en ellos pueden construirse las
plantas que nos permitirán conseguir mayores ventajas y beneficios en el desarrollo del
jugador.
A continuación se muestra una captura con la vista principal de la ciudad:
Scroll
Edificios
Ilustración 15 - Panorámica de la ciudad
Edificios
Sprites de los siete edificios que conforman la ciudad. En caso de tocar uno, se puede
acceder a su interior.
33
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Interfaz interior de un edificio
Al acceder al interior de un edificio se presentan las cinco plantas. Las plantas pueden
presentar un estado de construida o disponibles para su construcción.
Plantas disponible
Planta construida
Ilustración 16 - Interior de edificio
Planta construida
Se muestra la planta construida en esa sección del edifico. Al pulsar en ella se accede al
menú de actualización de nivel de la planta.
Planta en vacía
En caso de pulsar una planta vacía, se accede al menú de construcción de una nueva
planta para ser alojada en esa posición.
34
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Interfaz construcción de una nueva planta
Scroll
Planta a construir
Información sobre
la planta
Ilustración 17 - Menú de nueva planta
Planta a construir
Imagen de la planta que puede ser construida en el lugar. En caso de no poder ser
construida por falta de recursos, los elementos aparcarán en rojo.
Información sobre la planta
Información relativa a la construcción de la planta. Esta información consta de
información sobre los beneficios de construcción de la planta, el tiempo total para
completarse la construcción y el coste total de recursos necesarios.
35
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Interfaz de mejora de plantas
Subida de nivel
Bajada de nivel
Ilustración 18 - Menú de mejora
Subida de nivel
Muestra la información relevante a la subida de nivel de la planta. En total se muestra la
información de mejora aplicada, tiempo de construcción necesario y coste de la mejora.
Bajada de nivel
Muestra la información relevante a la bajada de nivel de la planta. En total se muestra la
información de la disminución aplicada, tiempo de deconstrucción necesario y coste de
la bajada.
36
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Interfaz de información completa
Posición
Clima
Lugar
Mejoras aplicadas
Bajada de nivel
Jugadores
cercanos
Ilustración 19 - Menú de información
Posición
Muestra la posición del jugador, mostrando la ciudad y país en la que se encuentra. Solo
es informativa y no tiene una aplicación directa en el juego.
Clima
Muestra la información de clima en la localización del jugador. En total se muestra el
clima, la temperatura, la velocidad y dirección del viento. Está información si tiene una
aplicación directa en la ganancia de recursos del juego.
Lugar
Muestra la información de lugar en la localización del jugador. En total se muestra
nombre y las características del lugar. Está información si tiene una aplicación directa
en la ganancia de recursos del juego.
37
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Mejoras aplicadas
Las mejoras aplicadas son el compendio completo de las ganancias extras obtenidas
por localización. Porcentaje de ganancias indica el monto que se está ganando del total
posible. Este porcentaje desciende del 100% al encontrarse cercano a otro jugador y
varía al derrotar o ser derrotado en un enfrentamiento.
Jugadores Cercanos
Muestra la información relativa a los jugadores cercanos a la posición del jugador. Se
indica el nombre como el nivel del jugador. Factor de victoria en una métrica que indica
las veces que se es mejor que ese jugador. Un valor por inferior a 1 indica que ese
jugador pierde recursos en nuestro favor, un valor superior indica que ese jugador pierde
recursos a favor el jugador.
4.2.4
Combate Jugador-Jugador
Esta vista no se muestra en el ciclo de vida por su característica especial, únicamente
puede ser accedida si un jugador es cercano al terminal que ejecuta la aplicación. Su
vista es la siguiente.
Vida
Ataques
Emisario
Ilustración 20 - Combate jugador-Jugador
El sistema de combate está basado en turnos, similar a los turnos de los juegos clásicos
como el ajedrez. Cada jugador enviará a su emisario para enfrentarlo con el de su
oponente,
actuará en su turno eligiendo uno de los cuatro ataques disponibles
intentando reducir por completo la barra de vida del emisario oponente. El lado derecho
corresponde al jugador mientras que el lado izquierdo corresponde con el rival.
38
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Emisario
Un emisario es una entidad abstracta que representa al jugador en caso de
enfrentamiento con otro jugador, el cual usará su propio emisario. Los atributos que
perfilan al emisario son:
Nombre
Descripción
Vida
Vida total que puede resistir antes de caer
Fuerza
Fuerza con la que golpea, a mayor fuerza, mayor daño.
Defensa
Capacidad de resistir golpes. A mayor defensa, menos vida se pierde.
Velocidad
Determina el orden de acción. Una mayor velocidad permite atacar antes
que el oponente. Además determina la capacidad de esquivar un ataque.
Tipo
Tipo elemental al que es afín el Emisario, que tendrá una importante
elemental
carga estratégica de cara al juego.
Ataque1
Ataque disponible para realizar contra el oponente. Cada ataque dispone
a su vez de un tipo elemental al que pertenece.
Ataque2
Ataque disponible para realizar contra el oponente. Cada ataque dispone
a su vez de un tipo elemental al que pertenece.
Ataque3
Ataque disponible para realizar contra el oponente. Cada ataque dispone
a su vez de un tipo elemental al que pertenece.
Ataque4
Ataque disponible para realizar contra el oponente. Cada ataque dispone
a su vez de un tipo elemental al que pertenece.
Tabla 2 -Diseño de los atributos de un emisario
Cada ataque dispone a su vez de los siguientes atributos.
Nombre
Descripción
Tipo
Tipo elemental al que es afín el ataque.
Fuerza
Fuerza con la que golpea, a mayor fuerza, mayor daño.
Velocidad Determina como se ve afectada la velocidad del emisario al realizar este
ataque.
Precisión
Capacidad de acertar al oponente con él.
Tabla 3 - Diseño de los atributos de un ataque
39
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Caida de la conexión durante un enfrentamiento
Durante el enfrentameitneo es necesario que mabos jugadores dispongan de una
conexión estable y continua a lo largo de todo el combate. En caso de producirse la
desconexión de uno de los dos jugadores, inditintamente se asumirá que el ganador del
enfrentamiento es el jugador que ha permanecido conectado al servidor, obteniendo la
parte proporcional de los beneficios de la batalla conseguidas hata ese momento.
Por contrapartida, el jugador que ha perdido la conexión se considerará desconectado
del sistema y parsará a considerarse un jugador no conectado, no obteniendo beneficio
alguno de la batalla. Cuando vuelva a estar disponible, se le dará de nuevo de alta en el
sistema de localización del servidor.
40
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
4.2.5
Tipos de recursos
Pueden encontrarse un total de cinco tipos de recursos distintos.
La población mide el índice de densidad de habitantes de la
Población
ciudad. Cualquier acción que requiera la acción humana para
llevarse a cabo (como la construcción o la investigación),
requerirá la dedicación de parte de la población inactiva.
La Ciencia mide de forma abstracta el conocimiento y
Ciencia
avances tecnológicos capaces de ser desplegados por tu
ciudad. Cualquier mejora compleja requerirá invertir parte de
la capacidad de ciencia.
La Construcción mide de forma abstracta la disponibilidad de
materiales capaces de ser desplegados por tu ciudad para la
Construcción construcción o mejora de estructuras. Cualquier cambio en
una estructura o edificio necesitará una inversión de este
recurso.
La energía será un recurso necesario para mantener la
actividad industrial y la calidad de vida de la ciudad. Nuevas
Energía
estructuras requerirán un consumo estable y continuo de
energía. Si no puede dedicarse la energía suficiente, parte o la
totalidad de los edificios dejarán de funcionar.
La comida es un recurso necesario para poder mantener la
Comida
actividad humana en la ciudad. A mayor población o
actividades complejas asignadas a los habitantes, mayor
demanda de comida. La falta de este recurso provocará la
disminución progresiva de la población.
Tabla 4 - Diseño de recursos
41
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
4.2.6
Estructura de la ciudad
A continuación se detallan todas las estructuras que pueden ser construidas.
Colmena
Ilustración 21 - Colmena
Puntos estructurales: 35
La colmena es un edificio destinado al bienestar de la ciudad. A rasgos generales se
centra en el alojamiento en su interior de plantas que mejoran notablemente los
recursos relativos a la población y a mejorar las condiciones que les afecten
directamente. Es uno de los edificios más importante y básico para tener niveles
aceptables de población elevados y estables.
Al iniciar el juego, la colmena consta por defecto de la planta Residencia a nivel 1
construida.
A continuación se detallan todas las plantas que pueden ser construidas en el interior de
la colmena.
Residencia
Sala del aclimatador
Centro deportivo
Cárcel
Restaurante
Paneles solares
Almacén
Cámara frigorífica
Ferretería
Grandes almacenes
Depósito de agua
Centro de ocio
Contenedores de reciclaje
Tabla 5 - Plantas de la colmena
42
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Baliza
Ilustración 22 - Baliza
Puntos estructurales: 30
La colmena es un edificio destinado a la comunicación de la ciudad. Contiene una
cantidad de plantas especializadas en el comercio exterior y a la mejora de todas las
condiciones que puedan ser obtenidas de fuentes externas, incluso de la localización.
No dispone de plantas construidas al inicio del juego.
A continuación se detallan todas las plantas que pueden ser construidas en el interior de
la baliza.
Centro de comunicaciones
Centro especial
Modulo lunar
Camera de comercio
Cañón solar
Escáner inter-planetario
Escáner inter-dimensional
Aduana
Controlador espacio-temporal
Sala del vórtice
Portal a dimensión vacía
Mercado negro
Cañón abre-portales
Tabla 6 - Plantas de la baliza
43
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Planta de energía
Ilustración 23 - Planta de energía
Puntos estructurales: 45
La planta de energía es un edificio especializado en la generación, eficiencia en la
producción, uso y almacenaje de la energía de la ciudad. Es uno de los edificios pilar del
juego y sin una clara estrategia sobre los recursos que facilita no se puede avanzar
mucho en el desarrollo.
Al iniciar el juego, la planta de energía dispone la planta sala de baterías construida a
nivel 1.
A continuación se detallan todas las plantas que pueden ser construidas en el interior de
la planta de energía.
Sala de baterías
Núcleo radiactivo
Control de residuos
Reactor fisión
Combustibles fósiles
Combustibles fósiles mixta
Fabrica de derivados
Energía renovable
Central solar
Central climatológica
Biocombustible
Tabla 7 - Plantas de la planta de energía
44
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Centro de mando
Ilustración 24 - Centro de mando
Puntos estructurales: 40
El centro de mando es el centro de la ciudad. En edificio central desde el que se coordina
y controla el resto de los edificios. Es uno de los edificios más difíciles de definir y
construir adecuadamente por que las plantas que deben ser alojadas en su interior
dependen exclusivamente de la configuración de los demás edificios para ser rentables
e eficientes.
Dispone de la planta centro de mando a nivel 1 construida desde el inicio.
A continuación se detallan todas las plantas que pueden ser construidas en el interior
del centro de mando.
Arquitecto
Centro de gestión
Inteligencia
Centro de verificación
Control de calidad
Despacho oval
Gabinete de gobierno
Juzgados
Ministerio
Centro de formación
Tabla 8 - Plantas del centro de mando
45
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Hospital
Ilustración 25 - Hospital
Puntos estructurales: 30
El hospital es el edificio centrado en la salud de la ciudad y de los emisarios. Las labores
que se ejercen en su interior van desde el tratamiento directo de las dolencias que
puedan surgir como tratamientos paliativos o preventivos. Una buena estrategia con el
hospital puede desembocar en una ciudad virtualmente duradera y sana, casi imposible
de debilitar.
No dispone de plantas construidas al inicio del juego.
A continuación se detallan todas las plantas que pueden ser construidas en el interior
del hospital.
Medicina nuclear
Depuradora
Control de plagas
Control de enfermedades
Primeros auxilios
Prenatal
Cuidados intensivos
Análisis clínico
Centro psiquiátrico
Farmacia
Tabla 9 - Plantas del hospital
46
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Base militar
Ilustración 26 - Base militar
Puntos estructurales: 35
El rol que juega la base militar dentro de la ciudad es claro y contundente, ampliar la
capacidad destructiva y ofensiva que se pose con la intención de derrotar al rival de una
forma más contundente posible. Aunque algunas mejoras pueden ser muy sutiles en
contraposición de las armas de destrucción masiva más evidentes.
No dispone de plantas construidas al inicio del juego.
A continuación se detallan todas las plantas que pueden ser construidas en el interior de
la base militar.
Armas de fuego
Misiles nucleares
Oficina de seguridad
Oficina de reclutamiento
Almacén de armas
Cuerpo especial
Cuerpo de agentes secretos
Unidad de explosivos
Brigada biológica
Ingeniería militar
Tabla 10 - Plantas de la base militar
47
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Laboratorio
Ilustración 27 - Laboratorio
Puntos estructurales: 35
El laboratorio es el edificio más complejo de configurar de todos los que son accesibles.
Toda planta que pueda ser construida en el laboratorio sirve como apoyo y soporte para
otras previamente edificadas, no siendo útil si no se planifica correctamente su uso.
Además dispone de otro gran inconveniente, es imposible abarcar todas las mejoras
que ofrece siendo necesario elegir que descartar. Pero sin duda, la potenciación que da
el laboratorio no puede ser comparada con ninguna otra edición.
No dispone de plantas construidas al inicio del juego.
A continuación se detallan todas las plantas que pueden ser construidas en el interior de
la base militar.
Laboratorio nuclear
Laboratorio biológico
Laboratorio genético
Farmacología
Laboratorio químico
Laboratorio físico
Acelerador de partículas
Centro de calculo
Granja transgénica
Ingeniería
Tabla 11 - Plantas del laboratorio
48
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
4.2.7
Tipos elementales
Los tipos elementales son estados afines de los emisarios con los que pueden
desarrollar poderes, tener cierta afinidad o debilidad y que permite clasificarlos dentro
de un tipo u otro. De la misma forma los ataques que pueden aprender los emisarios se
clasifican según el tipo elemental al que pertenecen.
Tipos disponibles
Biológico
El tipo biológico produce emisarios con unos atributos de ataque
y precisión muy equilibrados y una velocidad muy alta al carecer
de una capa protectora o de elementos adicionales que les
obstaculicen el movimiento. No obstante, su defensa es bastante
justa.
Los ataques biológicos se caracterizan por ser muy poco
potentes en primeros estadios del combate, pero a largo plazo,
son capaces de infectar al oponente, causando un daño masivo y
acumulativo cada vez mayor.
Corrosivo
El tipo corrosivo produce emisario muy lentos y aparatosos, pero
capaces de hacer destrozos en su rival si también es lento y muy
pesado, acabando rápidamente con su defensa.
Los ataques corrosivos se caracterizan por ser capaces de
destruir cualquier tipo de defensa y contra enemigo sin defensa
son capaces de causar estragos. No obstante, carecen de
velocidad y precisión elevadas.
Corte
Los emisarios de tipo corte se especializan en la defensa débil
compensada con una gran velocidad. Son capaces de realizar
múltiples ataques consecutivos sobre un mismo rival sin ser
golpeados.
49
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Los ataques de tipo corte son muy rápidos y precisos. Capaces
de provocar daño masivo con una gran cantidad de ataques
menores, pero les cuesta atravesar una defensa férrea.
Muerte
Los emisarios de tipo muerte están especializados en golpear al
rival duramente y sin piedad, siendo capaces de acabar el
combate de un único golpe fulmínate. Pero al no esperar una
repuesta, no están preparados para defenderse, siendo su coraza
nula.
Los ataques de tipo muerte son muy arriesgados, a todo o nada.
Es poco probable que acierten y requieren mucha precisión, pero
un solo golpe puede ser suficiente para acabar el combate.
Eléctrico
Los emisarios eléctricos son capaces de moverse a grandes
velocidades, las mayores que se pueden encontrar, siendo
además muy equilibrados en ataque y defensa. Pero pueden
tener problemas si el clima no les acompaña.
Los ataques de tipo eléctrico se caracterizan por ser directos y
brutales. Pero es fácil desviarlos se dispone de la defensa
adecuada y un clima propicio.
Fuego
Los emisarios de tipo fuego tienen una gran capacidad de
obtener ventajas de las temperaturas elevadas o incluso del sol.
Junto al tipo hielo, son los que más se ven afectados por un clima
adverso. Pero en general, son muy equilibrados con un ataque
ligeramente superior.
Los ataques de tipo fuego son muy equilibrados en precisión y
velocidad, con un extra de fuerza que puede ser ampliamente
mejorado con un clima extremo de sol y altas temperaturas, son
ataques para el verano y el buen tiempo.
50
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Hielo
Los emisarios de tipo hielo tienen una gran capacidad de obtener
ventajas de las temperaturas muy bajas o incluso de la nieve.
Junto al tipo fuego, son los que más se ven afectados por un
clima adverso. Pero en general, son muy equilibrados con una
defensa ligeramente superior.
Los ataques de tipo hielo son muy equilibrados en precisión y
velocidad, con un extra de fuerza que puede ser ampliamente
mejorado con un clima extremo de nieve y temperaturas por
debajo de los 10º, son ataques para el invierno y el mal tiempo.
Nuclear
Los
emisarios
de
tipo
nuclear
son
muy
inestables
e
impredecibles, la mayoría de las veces se causarán daño a sí
mismos, arrastrando al rival con ellos.
Los ataques nucleares son un peligro tanto para el rival como
para su ejecutor. Dañan a todos por igual de manera brutal y no
suelen fallar nunca. Son muy arriesgados si no se dispone una
defensa adecuada.
Reciclaje
Los emisarios de tipo reciclaje son muy conservadores. Poseen
una cantidad de vida y defensa altísimos y son capaces de
regenerar su vida o aumentar su defensa aun más. Por lo demás,
no destacan en nada y el resto de sus atributos son bajos o muy
bajos. Son jugadores de fondo.
Los ataques de este tipo son los únicos capaces de defender al
usuario que los emplea hasta el punto de regenerar las partes
que ha perdido casi por completo.
Toxico
Los emisarios de tipo tóxico son únicos en su especie. Se
51
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
especializan en causar un daño al rival capaz de matarlo a largo
plazo sin que pueda hacer nada para evitarlo.
Los ataques de tipo tóxico envenena al oponente causándole la
pérdida total de la vida con el tiempo. Un combate contra ataques
de tipo toxico es una contrarreloj donde el tiempo que se dispone
para acabar con el rival se limita cada vez más.
Tabla 12 - Diseño de los tipos elementales
52
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Efectos en combate
A la hora de realizar un ataque, se aplicará un bonificador dependiendo de la relación del
tipo elemental del ataque realizado y el tipo elemental del emisario.
1x Si tanto el ataque como el emisario no comparten el mismo tipo
1.5x Si tanto el ataque como el emisario comparten el mismo tipo
A la hora de soportar un ataque, cada tipo de movimiento aplica además un
multiplicador al bonificar final del ataque de acuerdo a la siguiente tabla.
Tipo del oponente
Tipo de atacante
-
x0.5
-
x0.5
-
X2
-
-
x2
-
X2
-
X2
X0.5
-
-
-
-
X0.5
-
X2
-
-
-
X0.5
X0.5
-
X2
X2
-
X2
-
-
-
-
-
X0.5
-
-
X0.5
-
-
X2
X2
X0.5
X0.5
X0.5
-
-
-
-
X2
X0.5
-
-
X0.5
X2
X0.5
-
-
X0.5
X2
X0.5
-
-
X2
X0.5
-
-
X2
-
-
-
X2
X0.5
-
-
X0.5
X2
X0.5
X0.5
-
-
-
X2
-
-
X0.5
-
X2
-
X0.5
-
-
X2
-
X2
-
-
-
Tabla 13 - Efectos de combate
53
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
4.2.8
Efectos del clima
A continuación se detallan todos los posibles estados del clima y todos los efectos que
suponen para el juego.
Mejora
Inconvenientes
Aumenta en
Disminuye en
Energía 5%
Comida 5%
Patches of Fog
Ciencia 15%
Construcción 5%
Biológico 5%
Fuego 5%
Hielo 5%
Tóxico 15%
Energía 10%
Comida 10%
Shallow Fog
Ciencia 10%
Construcción 10%
Biológico 5%
Fuego 10%
Hielo 5%
Tóxico 15%
Energía 15%
Partial Fog
Comida 5%
Construcción 15%
Ciencia 15%
Fuego 10%
Tóxico 15%
Energía 15%
Comida 5%
Patches of Fog
Construcción 20%
Ciencia 15%
Corrosivo 10%
Fuego 10%
Tóxico 15%
Población 15%
Overcast
Energía5%
Hielo 5%
Comida 5%
Corrosivo 5%
Fuego 5%
Biológico 5%
54
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Población 5%
Clear
Energía 20%
Comida 10%
Hielo 5%
Fuego 5%
Biológico 5%
Población 5%
Partly Cloudy
Energía10%
Hielo 10%
Comida 10%
Corrosivo 5%
Fuego 10%
Población 5%
Mostly Cloudy
Energía10%
Comida 10%
Fuego 10%
Energía 10%
Tóxico 5%
Eléctrico 5%
Energía15%
Scattered Clouds
Comida 10%
Hielo 5%
Fuego 5%
Corrosivo 5%
Nuclear 10%
Energía 10%
Small Hail
Hielo 15%
Fuego 5%
Población 5%
Muerte 10%
Construcción 5%
Ciencia 5%
Energía5%
Funnel Cloud
Comida 10%
Fuego 5%
Muerte 5%
Biológico 5%
Hielo 10%
Energía15%
Unknown
Comida 10%
Población 5%
Precipitation
Muerte 5%
Fuego 15%
Biológico 10%
Hielo 10%
Tabla 14 - Efectos del clima
55
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
4.2.9
Efecto de la localización
Los lugares se clasifican por un conjunto de tipos atendiendo a sus características y un
mismo lugar puede tener incluso varios tipo distintos. Los beneficios e inconvenientes
de un lugar vienen marcados por estos tipos.
A continuación se detallan todos los posibles estados de lugar y todos los efectos que
suponen para el juego.
Mejora
Inconvenientes
Aumenta en
Disminuye en
Contabilidad
Energía 10%
Banco
Comida 10%
Casino
Ciencia 10%
Contratista
Construcción 15%
Eléctrico 10%
Agencia de seguros
Hielo 5%
Reciclable 5%
Abogado
Fuego 5%
Finanzas
Nuclear 15%
Cajero automático
Tóxico 5%
Aeropuerto
Gasolinera
Tienda de bicicletas
Estación de autobuses
Venta de automóviles
Alquiler de coches
Aparcamiento
Aparcamiento para
caravanas
Estación de metro
Parada de taxi
Energía 10%
Comida 10%
Ciencia 10%
Biológico 5%
Construcción 10%
Corte 10%
Fuego 10%
Eléctrico 20%
Hielo 5%
Tóxico 15%
Estación de tren
Agencia de viajes
56
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Reparación de coches
Lavado de coches
Empresa de mudanzas
Lavandería
Cerrajero
Techador
Zapatería
Ayuntamiento
Embajada
Oficina municipal
Político
Corte de justicia
Oficina postal
Población 5%
Ciencia 10%
Construcción 5%
Ciencia 15%
Eléctrico 10%
Reciclable 5%
Muerte 10%
Energía 15%
Comida 5%
Ciencia 15%
Construcción 20%
Corrosivo 10%
Fuego 10%
Tóxico 15%
Código geográfico
Parque de atracciones
Acuario
Galería de arte
Gimnasio
Biblioteca
Museo
Parque
Centro comercial
Balneario
Población 15%
Energía 15%
Comida 15%
Hielo 5%
Fuego 5%
Corrosivo 5%
Biológico 5%
Estadio
Bolera
Camping
Restaurante
Zoo
57
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Librería
Tienda de ropa
Grandes almacenes
Tienda de electrónica
Establecimiento
Florista
Tienda de muebles
Ferretería
Población 5%
Energía 10%
Ciencia 10%
Construcción 5%
Muerte 10%
Energía 5%
Corte 10%
Corrosivo 10%
Joyería
Tienda de animales
Tienda de vinos y licores
Tienda
Población 15%
Comida
Comida 15%
Ultramarinos o
Biológico 10%
supermercado
Corte 10%
Dispositivos de
Corrosivo 5%
almacenamiento
Toxico 5%
Construcción 5%
Energía 5%
Tienda de barrio
Panadería
Bar
Salón de belleza
Cafetería
Peluquería
Alojamiento
Videoclub
Cine
Club nocturno
Pintor
Población 5%
Energía10%
Hielo 10%
Comida 10%
Corrosivo 5%
Fuego 10%
Fontanero
Policía
Colegio
Universidad
58
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Población 5%
Electricista
Energía10%
Bomberos
Comida 10%
Tóxico 5%
Funeraria
Eléctrico 5%
Fuego 5%
Comida a domicilio
Muerte 5%
Hielo 5%
Comida para llevar
Toxico 5%
Corrosivo 5%
Doctor
Población 10%
Dentista
Comida 15%
Salud
Muerte 10%
Ciencia 10%
Hospital
Corrosivo 5%
Reciclable 5%
Farmacia
Fisioterapeuta
Toxico 5%
Nuclear 10%
Atención veterinaria
Cementerio
Iglesia
Comida 10%
Templo hindú
Biológico 10%
Población 5%
Tienda de artículos para
Nuclear15%
Muerte 10%
el hogar
Reciclable 5%
Ciencia 10%
Mezquita
Toxico 5%
Lugar de culto
Sinagoga
Tabla 15 - Efectos de la localización
4.2.10
Ejemplo de mejoras por localización
Imaginemos el caso de un jugador que tras levantarse tremprano necesita realizar unas
gestiones importantes en el banco antes de comenzar sus obligaciones. Esa mañana ha
amanecido con sol, pero con nubes que amenazan ocasionalmente.
Sintetizando, el juego ha detectado que el jugador se encuentra en ese momento en un
banco y que además el tiempo marca sol parcialmente nublado, por lo tanto, el
cómputo total de las mejoras que le reportaría este hecho, partiendo de los recursos y
de los atributos para los tipos elementales que su ciudad le genera en ese momento.
59
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Total
Inconveniestes
Mejoras
Motivo
Base
Energía 10%
Energía 200
Población 80
Recursos
Comida 10%
Banco
Ciencia 250
Parcial.
nublado
Hielo 100
Fuego 50
Tipos
elementales
Nuclear 220
Banco
Reciclable 25
Corrosivo 100
N/A
Construc. 52
Comida 10%
Hielo 95
Fuego 5%
Eléctrico 10%
Fuego 57
Nuclear 15%
Reciclable 5%
Nuclear 253
Tóxico 5%
Parcial.
nublado
Población 84
Ciencia 275
Población 5%
Energía10%
Energía 240
Comida 120
Hielo 5%
Toxico 50
Electrico 25
N/A
Construc. 15%
Comida 100
Construc. 50
Ciencia 10%
Tóxico 52
Hielo 10%
Fuego 10%
Corrosivo 5%
Electrico 22
Reciclable 24
Corrosivo 95
Para el jugador es altamente beneficicio estar esa mañana nublada en el banco,
especialmente si nos fijamos en la gran cantidad de energía, ciencia y en menor medida
de comida que va ha obtener. Si permanece unas horas en el banco, va a poder disfrutar
de una gran reserva cuando disponga de tiempo para dedicar al juego.
Por otra parte, su estrategia de cara a otros jugadores se basa en ser muy agresivo
gracias a un emisario de tipo nuclear con implacables atques de tipo nuclear tambien,
tipo que recibe una importante mejora esa mañana que elevará la dureza de los
ataques. Combirtiendo al jugador en un gran rival a batir para el resto de oponentes que
se puedan encontrar el el banco y dispotarle las mejoras.
60
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
4.2.11
Juego offline o sin conexión
Adicionalmente de todo lo mencionado, el juego permitirá al jugador acceder al jeugo
sin conexión a la red, pemitiendo que no existan trabas deribadas al no poder manteren
la conectividad activa indefinidamente. Este echo conyeba importantes cambios en la
jubilidad y es importante que los jugadores lo tengan presente en todo memento,
incluso como una opción más a sopesar de cara a la estragia que desen desarrollar
según sus intereses, sopesando los pros y contras que acarrea no disponer de ella.
La consecuencia diracta más clara que determina la no conexión es la imposibilidad de
comunicación con el servidor. Este hecho por sí sólo no supone en problema, salvo que
el jugador no se haya dado de alta en el servidor todavía como jugador. Para poder
iniciar una partida será requisito indipensable una primera conexión para el alta en el
sistema, incluso aunque posteriormente el jugador no vuelva nunca más a jugar con
conexión.
La segunda consecuencia es la perdida de las mejoras que la localización proporciona a
los recursos y a los tipos elementales, dejando como única posibilidad la obtención de
los recursos que únicamente proporcione su ciudad.
Como tercer inconveniente, al no estar comunicado con el servidor, no se considera que
el jugador se encuentre en ese momento activo, no pudiendo relacionarse ni retar a
otros jugadores. De este echo se deriba la única ventaja real de jugar sin conexión,
auque el jugador no puede retar a otros jugadores, el mismo tampoco puede ser retado
por ellos, librándose del enfretamiento. Este detalle tiene unas consecuencias
estratégicas importantes que merecen ser sopesadas a favor de la perdida de recuroso
en muchos casos. Por ejemplo, ¿Qué ocurriría si el jugador no es lo suficientemente
poderoso como para acabar con sus oponentes en combate? Tal vez la mejor solución
es una retirada a tiempo desconectando el disponitivo de la red y ceder todos los
recursos para conseguir que no le ataquen.
61
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
62
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
5
Tecnologías
63
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
64
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
5 Tecnologías
Las aplicaciones Android se desarrollan habitualmente en el lenguaje Java haciendo
uso del Android Software Development Kit (Android SDK) [GOAAPI12]. Todo lo que se
necesita es un conocimiento aceptable de Java y estar en posesión del kit de desarrollo
de software provisto por Google que puede ser descargado gratuitamente.
Aunque la mayoría de las aplicaciones están escritas en Java, no hay una máquina
virtual Java en la plataforma. El bytecode Java no es ejecutado, sino que primero se
compila en un ejecutable Dalvik y corre en la Máquina Virtual Dalvik. Dalvik es una
máquina virtual especializada, diseñada específicamente para Android y optimizada
para dispositivos móviles que funcionan con batería y que tienen memoria y procesador
limitados [Ableson11].
Para el desarrollo de un videojuego se necesitan además Framworks y APIs adicionales
que faciliten algunas tereas e incorporen clases con funcionalidades de complejidad
elevada, permitiendo la abstracción de ciertos aspectos de la programación más a bajo
nivel. En concreto estos Frameworks son el motor gráfico Andengine, que permite la
abstracción de OpenGL entre otros, y las APIs de Google Places y Weather underground
para la obtención de datos de localización [ANDAPI12].
5.1 Resumen de la arquitecura
A continuación se detallan las arquitecturas de la aplicación y la arquitectura de todas
las tecnologías de las que hace uso la aplicacación.
5.1.1
Arquitectura de la aplicación
Como se ha remarcado con anterioridad, la arquitectura que sigue la aplicación es la
estructura clásica cliente/servidor donde el servidor es capaz de en tiempo real
mantener las localizaciones relativas de los jugadores los unos respecto a los otros.
No obstante, el juego también permite el juego offline. Admitiendo jugadores que no
dispongan de conexión y no estén conectados con el servidor.
En resumen la arquitectura de la aplicación pemmite los siguientes casos.
65
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Jugador
D
Jugador
A
Servidor
Jugador
C
Jugador
B
Jugador A
Jugador conectado al servidor que además se encuentra muy cercano al Jugador B. el
servidor ha estiamdo que ambos se encuentran cercanos entre si, se disputan los
recursos de la zona y además pueden combatir entre ellos.
Jugador B
Mismo caso que Jugador A.
Jugador C
Jugador que se encuentra conectado al servidor y está recibiendo beneficios por
localización, pero no se encuentra cercano a ningún otro jugador, por lo que no tiene
que combatir con otros jugadores por los recursos.
Jugador D
Jugador que no se encuentra conectado al servidor y por lo tento sin acceso a la red. No
recibe mejoras por localización ni otros jugadores pueden interaccionar con él.
66
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
5.1.2
Arquitectura de tecnologías
Tecnologías empleadas en la constructución del sistema cliente/servidor.
Cliente
Tecnologías usadas en cliente.
Ilustración 28 – Resumen detecnologías del lado cliente cliente
User Interface o Interfaz de usuario - Andengine
Motor gráfico encargado del dibujado de los gráficos y creación del interfaz de usuario.
Se encarga de gestionar todo aquel elemento que el jugador puede ver e interecional
con él.
Lógica - Java
El nucleo de la lógica de la placiación esta desarrollado con el leguaje de programación
Java, leguaje estándar de programación para Android.
Capa de acceso a datos – SQLite
El sistema gestor de base de datos incluido de forma nativa en la API de Android es
SQLite, un potente y ligero sistema gestor de base de datos que se empleará para las
necesidades de persistencia de datos en el lado cliente.
67
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Conexión – 3G/WiFi
La comunicación con el exterior se realizará a través de una conexión de datos 3G o
WiFi indistintamente
Servidor
Tecnologías usadas en servidor.
Ilustración 29 – Resumen de tecnologías del lado servidor
Lógica – Java
El nucleo de la lógica de la placiación servidor está desarrollado con el leguaje de
programación Java. Del mismo modo que en la aplicación cliente, pemitiendo la
unificación y reutilización de código.
Capa de acceso a datos – MySql
El sistema gestor de base de datos usado en el servidor es MySql, un potente sistema
gestor de base de datos que se empleará para las necesidades de persistencia de datos
en el lado servidor.
Esquema de comunicación – XML
La tecnología empleada para la comunicación entre cliente y servidor esta parseada en
documentos XML que se intercambiarán entre ambas.
68
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
5.2 Android
Antes de entrar en detalle, veamos las bases de Android usadas en el proyecto.
Gracias a la Android SDK, se dispone de una API completa y muy avanzada que facilita
la labor de acceso a todos los recursos que nos ofrece el sistema. En este apartado nos
centraremos en los aspectos concretos de la Android SDK para poder entender más
adelante ciertas peculiaridades del proyecto a desarrollar, en especial lo referente a la
incorporación de Andengine al conjunto.
5.2.1
Activity
Toda aplicación que necesite mostrar algún elemento al usuario necesita tener al
menos una clase que herede de la clase Activity. Al extender una la clase con Activity se
consigue la abstracción del ciclo de vida de la aplicación. Los métodos que Activity
aportan permiten al programador controlar los estados de la aplicación, pero sin poder
controlar directamente el ciclo de vida, como llevar la aplicación a ejecución, mostrarla
al usuario o dejarla en segundo plano, que se delega en el sistema operativo.
5.2.2
Ciclo de vida de una aplicación Android
Todo proceso en Android se incluye en una pila de ejecución. Cuando el usuario
interacciona con el sistema, las actividades se crean y se detienen en un orden concreto
mientras el sistema inicia y detiene procesos [IPCCVA12].
69
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Android proporciona diferentes estados en los que se puede encontrar una Activity, los
más habituales son:
onCreate()
Ciclo de vida completo
onRestart()
Fase de visibilidad
onStart()
Fase de primer plano
onResume()
onPause()
onStop()
onDestroy()
OnCreate()
Se invoca al crear la actividad. Aquí se realiza la configuración. También brinda acceso a
cualquier estado almacenado previamente.
OnRestart()
Se invoca se reinicia la actividad, si sigue en la pila, en lugar de iniciar una nueva.
onStart()
Se invoca cuando la actividad es visible en pantalla para el usuario.
onResume()
Se invoca cuando la actividad comienza a interactuar con el usuario. Siempre es
invocado.
onPause()
Se invoca al detener la aplicación o al reclamar la CPU u otros recursos. En este método
se guarda el estado para que al reiniciar una actividad pueda comenzar con el mismo
estado con el que acabó.
onStop()
70
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Se invoca para detener la actividad y pasar a una fase de invisibilidad.
onDestroy()
Se invoca al eliminar una actividad de la memoria del sistema.
5.2.3
Service
Si se necesita la ejecución de un proceso con un tiempo de vida prolongado y en
segundo plano, debe incluirse en un Service. Al igual que Activity, Service es una clase
proporcionada por el motor en tiempo de ejecución de Android y es necesario extender.
La gran diferencia entre Service y Activity es que a diferencia de la segunda, Service
carece de interfaz de usuario.
Se ha decidido usar dos clases Service para facilitar a la aplicación la obtención de
datos de localización y la comunicación desde/hacia el servidor sin una bajada notable
del rendimiento, dejando toda la potencia del sistema libre para ejecutar el juego.
5.3 SQLite
SQLite es un sistema gestor de base de datos del tipo relacional y ligero que Android
incorpora de forma nativa. Aunque no dispone de todas las funciones de los productos
de base de datos cliente/servidor comerciales, ofrece todo lo necesario para el
almacenamiento local de datos, a la vez que da un rápido acceso a la capa de datos
[SQLIT12].
5.4 Android vs HTML5
Existe una alternativa al desarrollo de una aplicación nativa Android para el juego que no
se ha mencionado con anterioridad, realizar íntegramente la aplicación sobre HTML5 y
ser accedida desde el navegador del dispositivo móvil. La tecnología HTML5 unido a
CCS3 aporta todo lo necesario para el desarrollo completo de la aplicación, además de
existir frameworks muy maduros en la rama de desarrollo de videojuegos.
HTML5 incorpora además una ventaja clara, el soporte sobre el que se ejecuta puede
cambiar sin problemas, no teniendo ningún problema para ampliar el alcance de la
aplicación a dispositivos más allá de Android e incluso, más allá de un dispositivo móvil.
71
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
No obstante, esta ventaja oculta una gran desventaja. No todos los dispositivos usados
por el usuario para acceder a la aplicación disponen de la facilidad de movimiento de un
dispositivo móvil, no teniendo sentido se ejecución en determinados sistemas, como
ordenadores portátiles en menor medida o en ordenadores de sobremesa en mayor
medida.
Pero el verdadero problema que aporta HTML5 es la necesidad de conexión continua e
ininterrumpida de la aplicación. Una gran cantidad de lógica puede ser ejecutada en el
cliente hasta el punto de no necesitar lógica en el servidor mediante el uso de
Javascript, pero la base de datos siempre se encontrará en el servidor, obligando por
tanto a la conexión ininterrumpida antes citada para iniciar la aplicación o para
cualquier cambio en los datos, siendo imposible el juego sin conexión. Como
anteriormente se dejó constancia, el juego debe permitir el juego sin conexión al jugador
sin ningún tipo de traba, siendo esto imposible con la tecnología HTML5.
Por este último motivo, se descarta totalmente el uso de HTML5 para el desarrollo.
5.5 Elección de un motor gráfico
Es interesante, antes de comenzar la implementación del juego, dedicar un tiempo de
estudio previo a comparar todas las posibilidades de elección para un motor gráfico que
facilite la labor de programación. La API de Android cargar una animación es muy fácil,
hacerlo de forma que se pueda controlar el número de repeticiones y el frame en el que
se encuentra la animación ya no lo es, entre otras facilidades importantes.
La oferta de motores open source es bastante amplia y llena de posibilidades A
continuación se listan los motores gráficos con una tasa de actividad, mantenimiento y
uso elevados.
AndEngine
Motor 2D con OpenGL libre bajo licencia LGPL desarrollado por Nicolas Gramlich. Entre
sus múltiples características se encuentran:
»
Optimización para Android y compatibilidad con la versión 1.6 en la versión
GLES1 y 2.2 en la versión GLES2.
72
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
»
Modo SpitScreen.
»
Multijugador en red.
»
Texturas vectoriales (en SVG).
»
Live-Wallpapers.
»
Posibilidad de MuiltTouch.
»
Motor de físicas con Box2D
»
Posibilidad de implementar realidad aumentada.
libGDX
Motor gráfico multiplataforma (Linux, OSX, Windows, Android) para 32 y 64 bits y que
entre sus principales características cuenta con la posibilidad de desarrollar para
sistemas de escritorio y después esa misma aplicación es fácilmente portada a Android
Distribuido con licencia Apache 2.0 entre el resto de sus características cabe destacar:
»
Shaders, vertex y soporte de OpenGL 1.0, 1.1 y 2.0 (solo en Android 2.0).
»
Sistema de partículas.
»
Carga de sonido en mp3, OGG y waw.
»
Carga de mapas TMX de MapEditor.
»
Soporte para ratones, teclados y touch.
»
Soporte del compas, acelerómetro y vibrador.
»
Soporte de eventos remotos, por ejemplo para interactuar con un PC.
»
Físicas con Box2D.
»
Incluye editor de partículas, generador de fuentes y empaquetador de texturas.
jPCT
Motor 3D multiplataforma de escritorio que cuenta además con una versión específica
para Android. Publicado bajo una licencia propia que permite sus redistribución. Entre
sus características:
»
Carga de modelos 3DS, OBJ, MD2, ASC y XML.
»
Animación por frames o por esqueleto.
»
Sistema de iluminación y efectos.
»
Construcción de primitivas.
73
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
»
Detección de colisiones.
»
Completo control de cámaras.
Forget3D
Framework 3D multiplataforma basado en OpenGL ES que permite realizar aplicaciones
para Android, Win32, WinCE. Distribuido bajo licencia GNU GPL v2 entre sus
características cuenta con:
»
Compatible con Android 2.0.
»
Carga de modelos MS3D, G3D (Glest) y MD2.
»
Texturas de 8 y 24 bits.
»
Manejo de escenas.
»
Control de cámaras.
»
Sistema de iluminación.
»
Soporte de fuentes.
Catcake
Motor 3D multiplataforma compatible con Linux, Android y Windows creado con la idea
de tener una pequeña curva de aprendizaje y un buen rendimiento. Está publicado bajo
licencia MIT. Entre las características que destacan de este motor se encuentran:
»
Carga de modelos 3DS.
»
Manejo de transparencias e iluminación.
»
Manejo de fuentes (TTF, TTC, OTF).
»
Monitor de depuración en tiempo real.
»
Creación automática de modelos 3D a partir de imágenes 2D.
»
Detección de colisiones.
e3roid
Motor 2D basado en OpenGL para Android 2.1 o superior bajo la nueva licencia BSD.
Con un ciclo de desarrollo bástate rápido cuenta con las siguientes características:
»
Manejo de capas y sprites.
»
Renderizado de texto.
»
Entrada analógica\digital con soporte para multi touch.
74
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
»
Físicas con Box2D.
»
Carga de mapas TMX.
»
Emulación de teclado.
»
Consola de depuración.
»
Incorpora intérpretes para scripts en Lua y JavaScript.
»
Manejo de sonidos.
De todos los motores mostrados, todos tienen unas características magnificas y
potencia suficiente para el desarrollo de un juego muy potente. Pero de entre todos
destacan en especial dos, Andengine y e3roid. Es importante destacar que el juego que
va a desarrollarse únicamente debe estar soportado por la plataforma Android y sólo
son necesario gráfico 2D sin mayor ostentación de potencia gráfica, no siendo
necesarias lógica de partículas ni iluminación.
Para determinar que motor gráfico se adapta menor a las necesidades del proyecto, se
realizará una prueba de rendimiento basada en frames. Esta prueba consiste en
presentar una cantidad cada vez mayor de pequeñas partículas en movimiento, dejando
al motor gráfico la posibilidad de ajustas el frame rate. Ejecutado sobre un Galaxy Nexus
con Android 4.0.4 (Ice Cream).
Andengine e3roid
FPS (1 Sprite)
58
52
FPS (50 Sprites)
60
46
FPS (100 Sprites)
36
42
FPS (500 Sprites)
25
35
Tabla 16 - Prueba de rendimiento
Comparando el rendimiento y las características de ambas, podemos observar que
AndEngine puede sufrir una caída de rendimiento en función de los objetos del juego
algo que e3roid parece que es capaz de mantener constante, aunque para nuestro
propósito ambos serian validos.
En definitiva cualquier opción sería válida, pero se decanta a favor de AndEngine por la
cantidad de código de ejemplos, actividad en sus foros, tamaño de la comunidad de
desarrollo y su modularidad ya que existen extensiones que permiten una evolución
posterior del juego con un mínimo impacto en el desarrollo.
75
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
»
AndEngine Live-Wallpaper Extension
»
AndEngine .MOD-Player Extension
»
AndEngine Multiplayer Extension
»
AndEngine MultiTouch Extension
»
AndEngine Physics Box2D Extension
»
AndEngine Augmented-Reality Extension
5.6 Andengine
AndEngine es un motor de videojuegos 2D para Android. En el momento de desarrollar
un videojuego hay características como los Sprites o la utilización de físicas que pueden
llegar a ser complejas de desarrollar. El uso de frameworks o librerías para estos puntos
benefician enormemente a conseguir un desarrollo más rápido y permite enfocar los
recursos en otras áreas también importantes.
Una de las características que más resalta de AndEngine es que es de código abierto y
que en sí, se trata de una implementación 2D de OpenGL para Android por lo que se usa
puramente el lenguaje Java.
Andengine se encuentra en su segunda versión GLES2, liberada en Diciembre de 2011 y
que a lo largo de 2012 se ha asentado en una versión estable y potente [GLES12].
Algunas mejoras incluidas en GLES2 que afectan al proyecto son [ANDF10]:
»
Se requiere como mínimo una versión Froyo (Android 2.2) o superior, soportado
por más del 89% de todos los dispositivos.
»
Mejora de rendimiento VertexBufferObject y un buffering más rápido.
»
Incorporación de LowMemoryVertexBufferObject con un uso de memoria un
50% menor que HighPerformanceVertexBufferObject.
»
Entity-Skewing añadido a la rotación, escala y traslación.
»
Nueva claseBitmapFont
»
Fuentes pre-renderizadas.
»
La compresión de texturas soportada por todos los dispositivos.
»
Incorporación de la clase TextureOptions
»
Nuevos DataTypes: Quadtree, LRUCache, UncoloredSprite / DiamondSprite,
TextureRegion rotation, TiledTextureRegion
76
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
»
MultiTouchExtension native para AndEngine.
»
Extension para la AugmentedReality.
»
Nuevas ScreenOrientations: SENSOR_LANDSCAPE, SENSOR_PORTRAIT para
Ginger Bread (Android 2.3) y superior.
»
Rotación de pantalla sin llamadas a los métodos de ciclo de vida.
5.6.1
Elementos de Andengine
Andengine provee de su propia API, poniendo a disposición del desarrollo una serie de
clases que incluyen la lógica necesaria para realizar las acciones comunes en los
videojuegos. Estas clases son:
BaseGameActivity
El BaseGameActivity es la raíz del juego, que contiene el motor y crea la vista donde se
va a dibujar todo. Hay siempre exactamente un solo Engine por cada BaseGameActivity.
BaseGameActivy facilita también la labor de carga y creación de los recursos así como
la especificación de las opciones y características necesarias.
BaseGameActivity hereda de Activity y al igual que ocurre con esta, es necesario
extender una clase con ella para poder mostrar gráficos. Además BaseGameActivity
incluye todos los métodos necesarios para la correcta configuración de los elementos a
usar.
Engine
El Engine es el motor interno del juego, se encarga de ir dibujando en pantalla y
actualizando objetos en la escena, que contiene todo el contenido que tu juego lleva.
Normalmente hay una escena por Engine, pero esta lógica puede extenderse para
implementar múltiples escenas con una única carga de recursos unificada.
IResolutionPolicy
Una implementación de IResolutionPolicy interface es parte del EngineOptions. Abstrae
la resolución del terminal, permitiendo trabajar para una resolución y AndEngine se
encarga de ajustar al resto.
Camera
77
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Un objeto Camera define el rectángulo visible de la escena actual que no tiene porqué
ser la escena completa. Normalmente hay una cámara por escena. Hay subclases
específicas que permiten hacer zoom y mover la cámara suavemente.
Scene
La clase Scene es el contenedor para todos los objetos que se van a dibujar en la
escena. Una escena puede tener Layers, que son capas para ordenar objetos. Hay
subclases
de
la
Scene
como
CameraScene/HUD/MenuScene
que
tienen
comportamientos específicos.
Entity
Una entidad es un objeto que puede ser dibujado, como Imágenes, rectángulos, Texto,
Líneas. Una entidad tiene posición/rotación/zoom/color...
Texture
Una textura es una imagen que se guarda en memoria. En Android, las imágenes deben
ser una potencia de 2.
TextureRegion
Una TextureRegion define un rectángulo en una imagen. Las TextureRegion se usan por
Sprites para usar una imagen grande en la que guardamos muchas imágenes menores.
PhysicsConnector
Motor de físicas integrado en el Engine
5.6.2
Android vs. Andengine
Si bien Andengine administra toda una API que facilita las labores de programación, si
es necesario tener en cuenta que BaseGameActivity incorpora una serie de métodos
propios que modifican ligeramente el ciclo de vida de la actividad, haciendo la clase uso
interno de los métodos clásicos de Activity antes mencionados, por lo que no es
recomendable su uso.
El ciclo de vida de la creación de una clase BaseGameActivity incluye la invocación en
orden de los siguientes métodos.
78
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Ilustración 30 – Ciclo de vida de Andengine
EngineOptions onCreateEngineOptions()
La invocación de este método se realice antes de ninguna otra. Permite la creación de
las configuraciones necesarias para el Engine o motor de la aplicación. En este método
también se crear las opciones necearías para la resolución de la pantalla sobre la que
trabajar y que posteriormente abstraerá de resoluciones distintas y la creación de la
Camera e inicialización.
Como salida se necesita devolver una clase del tipo EngineOptions con todas las
configuraciones antes especificadas.
onCreateResources()
Después de definir y abstraer todas las opciones necesarias, es necesaria la carga de
todos los recursos necesarios para la aplicación, en s mayoría gráficos en forma de
texturas, pero también pude tratarse de música, efectos de sonidos, etc.
onCreateResources crea las condiciones necesarias para la carga de recursos en
memoria de forma estable y abstrae los inconvenientes del cambio de estado de la
aplicación o de la memoria.
Scene onCreateScene()
Por último, se invoca onCreateScene que permite crear la primera Scene que se
mostrará al usuario. Aunque Scene abstrae la creación y dibujado de la primera escena
del juego, esta escena no tiene que ser única, pudiendo agregarse posteriormente
79
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
nuevas Scene al Engina para ser dibujados sin la necesidad de una nueva carga de
recursos.
5.7 XML
XML o Extensible Markup Language es un metalenguaje creado por el World Wide Web
Consortium más comúnmente conocido como W3C. XML no es exactamente un
lenguaje, en realidad es un lenguaje que permite la definición de otros lenguajes y que
se propone como un estándar para el intercambio de información estructurada entre
diferentes plataformas.
Toda comunicación externa o interna del proyecto se realiza a través de mensajes
estructurados XML, como la comunicación entre móvil/servidor como la petición de
datos a las APIs de localización Google Places y weather Underground.
5.8 Weather Underground
Weather Underground es una aplicación propietaria de Weather Underground, Inc para
la consulta online de datos climatológicos. WU dispone de una sencilla interfaz que
permite el envío de solicitudes vía protocolo http con una especificación de latitud y
longitud, devolviendo los datos relativos a la climatología de dicho punto en formato
JSON o XML.
El formato URL que se emplea está pendiente de actualización y la entidad responsable
recomienda el uso del nuevo formato, basado en clave de usuario. Pero el periodo de
vigencia del formato actual es el suficiente para poder incorporar la consulta al proyecto
y realizar una migración posterior al nuevo servicio.
La consulta se realiza configurando la siguiente URL:
http://api.wunderground.com/auto/wui/geo/WXCurrentObX
ML/index.xml?query=[LAT],[LONG]
Donde LAT y LONG representas números Long con la latitud y longitud de la que
queremos obtener la información.
80
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
El formato del XML recibido es el siguiente:
Listado 1
<current_observation>
<credit></credit>
<credit_URL></credit_URL>
<termsofservice ></termsofservice>
<image>
<url></url>
<title> </title>
<link> link>
</image>
<display_location>
<full> </full>
<city> </city>
<state/>
<state_name></state_name>
<country> </country>
<country_iso3166> </country_iso3166>
<zip></zip>
<latitude></latitude>
<longitude></longitude>
<elevation></elevation>
</display_location>
<observation_location>
<full></full>
<city> </city>
<state/>
<country> </country>
<country_iso3166> </country_iso3166>
<latitude></latitude>
<longitude></longitude>
<elevation></elevation>
</observation_location>
<station_id></station_id>
<observation_time></observation_time>
<observation_time_rfc822></observation_time_rfc822>
<observation_epoch></observation_epoch>
<local_time></local_time>
<local_time_rfc822> </local_time_rfc822>
<local_epoch></local_epoch>
<weather> </weather>
<temperature_string></temperature_string>
<temp_f></temp_f>
<temp_c></temp_c>
<relative_humidity></relative_humidity>
<wind_string></wind_string>
81
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
<wind_dir></wind_dir>
<wind_degrees></wind_degrees>
<wind_mph></wind_mph>
<wind_gust_mph/>
<pressure_string></pressure_string>
<pressure_mb></pressure_mb>
<pressure_in></pressure_in>
<dewpoint_string></dewpoint_string>
<dewpoint_f></dewpoint_f>
<dewpoint_c></dewpoint_c>
<heat_index_string> </heat_index_string>
…resto del documento no relevante
</current_observation>
5.9 Google Places
Del mismo modo que Weather Underground, Google Places es una aplicación
propietaria de Google, Inc para la consulta online de datos relativos a comercios
cercanos a una posición geográfica. Permite a las aplicaciones para móviles que
desean proporcionar información de un lugar a sus usuarios y la función de registro de
visitas a lugares de interés y empresas locales.
Al ser una API propietaria cuenta con los límites de consulta. Únicamente con la una
clave de API pueden realizar 1 000 solicitudes por un período de 24 horas. Pero
suficiente para el desarrollo del proyecto.
Google Places dispone de una sencilla interfaz que permite el envío de solicitudes vía
protocolo http con una especificación de latitud y longitud, entre otras opciones de
configuración, devolviendo los datos relativos de dicho punto en formato JSON o XML.
La consulta se realiza configurando la siguiente URL:
https://maps.googleapis.com/maps/api/place/search/xml
?location=[LAT],[LONG]&radius=[RADIUS]&sensor=true&ke
y=[GKEY]
Donde LAT y LONG representas números Long con la latitud y longitud de la que
queremos obtener la información.
82
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
RADUIS indica la distancia (en metros) que se desea utilizar para obtener resultados de
lugar.
GKEY indica la clave de API de la aplicación.
El formato del XML recibido es el siguiente:
Listado 2
<PlaceSearchResponse>
<status></status>
<result>
<name></name>
<vicinity></vicinity>
<type></type>
<type></type>
…
<geometry>
<location>
<lat></lat>
<lng></lng>
</location>
</geometry>
<icon></icon>
<reference></reference>
<id></id>
</result>
<result>
…
</result>
…resto del documento no relevante
</PlaceSearchResponse>
5.10
MySQL
MySQL es un sistema gestor de base de datos del tipo relacional, perteneciente a la
empresa Sun microsystems, se distribuye bajo licencia GPL, aunque también dispone
de software especializado para medianas y grandes empresas con una mejora de
prestaciones y servicios, admitiendo más conexiones simultaneas y un número mayor
de consultas.
Una base de datos relacional archiva datos en tablas separadas en vez de colocar todos
los datos en un gran archivo. Esto permite velocidad y flexibilidad. Las tablas están
conectadas por relaciones definidas que hacen posible combinar datos de diferentes
tablas sobre pedido. También acepta la conexión no solo directa desde su propio
83
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
terminal, sino que tiene implementada una propia API que permite a diferentes
lenguajes de programación acceder a los datos almacenados por este gestor. En Java
es obligatorio descargar un driver que permite la conexión con base de datos por medio
de la propia API de Java llamada JDBC.
La utilización de este tipo de Sistema Gestor de Base de Datos es casi una obligación al
ser uno de los sistemas más extendidos por todo el mundo, además es una herramienta
open source y junto con alguna de las anteriores implica que no hay que pagar ningún
tipo de licencia. Se ha decidido que la base de datos sea relacional puesto que ayuda a
obtener información relacionada de forma muy fácil y sencilla, frente a otro tipo de
bases de datos que son las llamadas NoSQL como puede ser MongoDB, es Sistema
Gestor de Base de Datos que tiene la información almacenada de una forma no
relacional, se basa en el uso de los estándares de JSON, que es un lenguaje nacido a
partir de Javascript cuya funcionalidad es la del intercambio de información entre
diferentes programas escritos en lenguajes diferentes, es por todo el mundo conocido
que los datos en cada uno desde los lenguajes de programación no son tratados de la
misma forma, ni si quiere un entero en Java puede llegar a ser igual en C. JSON llega a
ser mucho más importante en el desarrollo web, donde es muy normal el uso de varios
lenguajes de programación para desarrollar una misma aplicación.
84
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
6
Diseño software
85
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
86
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
6 Diseño software
En este apartado se especificara cual es el diseño de la plataforma desde un punto de
vista de los diagramas UML, para denotar cuales son la funcionalidad principal de
nuestro sistema al margen del código Java y de los framworks y APIs a emplear. Esta
especificación se realiza gracias a los diagramas de caso de uso que están englobados
dentro de los diferentes diagramas de la metodología UML.
6.1 Modelo de dominio
Diagrama de dominio de la aplicación Shadow Fire para soportar la lógica del juego.
Ilustración 31 - Modelo de dominio
Player
Player es la clase principal en el modelo de dominio de la aplicación. Su cometido es
doble, servir como base informativa para el juego, almacenando cierta información
relativa al jugador, y servir como pasarela para el intercambio de información entre
servidor y juego.
Building
Building es una clase que con dos objetivos. Por un lado almacena la información
referente a cada uno de los 7 edificios que forman parte del juego y por otro reúne todos
los métodos y atributos necesarios para el acceso a las clases Floor, abstrayendo el
tratamiento de la información que contiene dicha colección.
Floor
Floor posé la información relevante a cada una de las plantas construidas y su estado,
así como métodos para la actualización y consulta de datos como costes de
87
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
actualización o tiempo de construcción. Su uso más importante es añadir sus mejoras
al conjunto de variables para el cálculo total de las mejoras aplicables.
6.2 Casos de uso
Diagrama de casos de uso de la aplicación Shadow Fire para soportar la lógica
necesaria para las acciones del jugador.
Ilustración 32 - Casos de uso
88
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Nombre: Register as a new player
Actores: Player
Precondiciones: Iniciar la aplicación por primera vez
Iniciar la aplicación sin estar registrado
Trigger: N/A
Escenario primario:
1.
El jugador inicia la aplicación
2. El jugador completa el formulario de nueva alta correctamente
3. El jugador pulsa el botón enviar
Extensiones:
1.a. Datos incorrectos
1. El nombre o el email ya se encuentran en uso
Descripción de datos:
Datos del usuario a actualizar en la base de datos name, email, dinit
Nombre: Add Floor
Actores: Player
Precondiciones: El jugador debe acceder a un edificio.
Trigger: N/A
Escenario primario:
4.
El jugador seleccione una planta vacía
5. El jugador elije una de las plantas disponibles
6. Se muestra el interior del edifico actualizado
Extensiones:
1.a. Selección incorrecta
2. Selección de una planta que no se puede construir por falta de recursos necesarios
Descripción de datos:
Datos del la planta a actualizar en la base de datos building_type, type, level, poss,
isBuild, dinit y dfinish.
Nombre: Update Floor
Actores: Player
Precondiciones: El jugador debe acceder a un edificio.
Trigger: N/A
Escenario primario:
7.
El jugador seleccione una planta construida
8. El jugador elije una de las posibles actualizaciones (bajar un nivel o subir un nivel)
9. Se muestra el interior del edifico actualizado
Extensiones:
1.a. Selección incorrecta
1. Selección de una planta que no se puede construir por falta de recursos necesarios
Descripción de datos:
Datos del la planta a actualizar en la base de datos level, isBuild, dinit y dfinish.
89
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Nombre: Update emisary
Actores: Player
Precondiciones: N/A
Trigger: N/A
Escenario primario:
1.
El jugador seleccione un emisario
2. El jugador reparte experiencia entre los atributos del emisario
3. El jugador acepta los cambios
Extensiones:
Descripción de datos:
Datos del emisario a actualizar en la base de datos name, type, level, attack, defense.
Nombre: Teach attacks
Actores: Player
Precondiciones: El jugador debe acceder a un edificio.
Trigger: N/A
Escenario primario:
1.
El jugador seleccione un emisario
2. El jugador reparte gasta experiencia en enseñar un ataque al emisario
3. En caso de poseer cuatro ataques, el usuario selecciona un ataque a borrar
4. El jugador acepta los cambios
Extensiones:
Descripción de datos:
Datos del la planta a actualizar en la base de datos building_type, type, level, poss,
attack_name
Nombre: Consult information
Actores: Player
Precondiciones: El jugador debe acceder a un edificio.
Trigger: N/A
Escenario primario:
1. El jugador pulsa el botón de información
Extensiones: N/A
Descripción de datos:N/A
90
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Nombre: Fight other player
Actores: Player
Precondiciones: El jugador debe tener un jugador cercano
Trigger: N/A
Escenario primario:
1. El jugador pulsa el botón de información
2. El jugador selecciona un jugador cercano
3. El jugador seleccione un emisario
4. El jugador selecciona un ataque del emisario a ejecutar
5. Al finalizar el combate, el juego actualiza el factor de victoria
Extensiones:
1.a. Fin del combate
2. El combate finaliza con la reducción total a cero de la vida de un emisario.
Descripción de datos: Envío de la información total del combate mediante fichero XML
a través del servidor.
91
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
6.3 Diagrama de clases
Diagrama de clases de la aplicación. El objetivo de este apartado es dotar de una visión
completa del la aplicación para posteriormente, poder hacer un acercamiento más en
detalle de los segmentos de código más interesantes sin que se pierda la visión general
o que los desarrollos sean demasiado excesivos y complejos.
6.3.1
Shadow Fire
Clases especificas de la aplicación Shadow Fire para soportar la lógica necesaria del
juego.
Ilustración 33 - Diagrama de clases cliente
TheShadowOfFireActivity
Clase principal de la aplicación. Hereda de SimpleBaseGameActivity.
Métodos
‐
EngineOptions onCreateOptions()
Primer método del ciclo de vida invocado. En él se inicializan las variables
para el motor gráfico.
‐
void onCreateResources()
92
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Segundo evento del ciclo de vida invocado. Activa un hilo para encargado de
la inicialización y volcado en memoria de la base de datos a la estructura de
datos interna invocando el método updateCity().
‐
void updateCity()
Realiza las operaciones de actualización de las estructuras de datos internas
del programa referentes a los datos de la aplicación.
‐
boolean isOnline()
Determina se el terminal está conectado o no a la red.
‐
scene onCreateScene()
Tercer método del ciclo de vida invocado. Crea la primera escena (Scene)
que va a ser mostrada en pantalla. En concreto la pantalla Splash mostrada
junto al progreso de carga mientras se obtiene el volcado de los recursos
mediante un hilo auxiliar.
‐
void setSplashBarProgress (float pProgress)
Actualiza la barra de progreso al valor indicado.
‐
void loadResources()
Realiza la carga de recursos gráficos hacia memoria.
‐
boolean onSceneTouchEvent()
Método encargado de la actualización de la escena ente los toques del
jugador en la pantalla.
‐
booolean onBackPressed()
Método encargado de la navegación hacia atrás tras ser pulsado el botón
retroceso de la aplicación.
‐
void actLocationinformacion(WeatherInformation wi, PlacesInformation pi)
Recibe la información de localización del jugador tanto por clima como por
lugar y actualiza los datos internos de la aplicación.
FireHUD
Hereda de la clase HUD. HUD personificado encargado de mostrar la información del
juego al jugador mostrándose siempre en pantalla.
Métodos
‐
void acrWeather()
93
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Actualiza los valores de climatología mostrados.
‐
Void actResources()
Actualiza los valores de los recursos mostrados.
CombatActivity
Hereda de SimpleBaseGameActivity. Clase del tipo Activity encargada de mostrar el
combate entre dos jugadores.
Engine
SceneFactory
Clase auxiliar para la abstracción de la creación de escenas. Crea las distintas escenas
según se solicitan para ser pintadas por el motor gráfico.
Métodos
‐
void
createColmenaScene(),
void
createEnergyScene(),
void
createHospitalScene(), void createHallScene(), void createMilitaryScene(),
void createBeaconScene(), void createLabScene().
Métodos específicos para la creación de las distintas escenas del interior de
cada edificio.
‐
Scene getMenuScene()
Devuelve la escena específica a la muestra de datos de localización.
‐
void createAllScenes()
Inicializa todas las escenas que formar parte de la aplicación tomando como
referencia la estructura de datos interna extraída de la base de datos.
MyLocationListener
Listener que implementa el interfaz LocationListener encargado de la actualización de
los datos de localización obtenidos por el dispositivo.
ConnectionChangeReceiver
Clase que hereda de BroadcastReceiver. Encargada de actualizar el estado de la
aplicación ante un cambio de la conexión de la red.
94
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
6.3.2
Servidor
Clases especifica de la aplicación servidor para soportar la lógica necesaria
multijugador centralizada.
Ilustración 34 - Diagrama de clases servidor
LocationCityServer
Clase principal del servidor. Inicia el proceso de escucha en tres puertos distintos para
distintas acciones que el jugador puede realizar online.
CombatListener
Clase encargada de escuchar las peticiones de combate de un jugador. En caso de
recibirla comunicará a ambos jugadores y delegará la lógica de combate a un hilo
CombatLogic.
CombatLogic
Clase encargada de la lógica de combate entre dos jugadores. Espera las acciones de
ambos, calcula los resultados y son comunicados a los jugadores para actualizar la
información en pantalla.
95
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
NewLocationListener
Clase encargada de escucharlas las actualizaciones de localización de un jugador.
Renovando la información en caso de realizarse un cambio.
NewUserListener
Clase encargada de las nuevas altas que se produzcan de jugadores.
6.4 Estructura de paquetes
En el diagrama de la arquitectura se representa un diagrama de paquetes mostrando los
subsistemas en que se descompone el sistema y sus dependencias.
Ilustración 35 - Diagrama de paquetes
com.game
Almacena las clases principales que forman el eje de la aplicación. Contienen todo lo
necesario para confeccionar la interfaz de usuario y la lógica del juego.
96
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
dominio
Almacena las clases que forman parte del dominio de la aplicación. Está estrechamente
relacionada con las clases del paquete dao.
dao
Almacena las clases que forman parte de la capa de acceso a datos de la aplicación
junto a los necesarios para la gestión de la base de datos.
location
Almacena las clases necesarias para la correcta localización del usuario, incluyendo
comunicación, filtrado de datos y distribución de la información.
org.andengine
Librería aportada por el proyecto Andengine elaborada por Nicolas Gramlich. Almacena
las clases las clases referentes al motor gráfico Andengine y todas las clases
adicionales que han sido añadidas.
97
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
6.5 Modelo de datos
El modelo de datos debe soportar todo el modelo de dominio aportando una solución
para el almacenamiento seguro de toda la información que se precisa a los largo de la
aplicación. Al tener acceso a una base de datos relacional, SQLite, se procede al diseño
de las tablas que formarán parte del modelo de datos.
Ilustración 36 - Modelo entidad-relación
6.5.1
Tabla TUSER
La tabla TUSER almacena toda la información referente al jugador.
Descripción detallada de los atributos de TUSER.
Atributo
Tipo
Descripción
Name
VARCHAR(45) Clave. Nombre del jugador.
Email
VARCHAR(45) Email de contacto del jugador.
First
LONG
Fecha de alta del jugador.
Last
LONG
Ultima fecha en la que el jugador abandonó el juego.
Level
INT
Nivel actual del jugador.
Points
INT
Puntos totales del jugador acumulados.
Science
INT
Cantidad del recurso ciencia acumulado al abandonar la
98
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
aplicación en el último acceso.
Construction INT
Cantidad del recurso construcción acumulado al
abandonar la aplicación en el último acceso
Energy
INT
Cantidad del recurso energía acumulado al abandonar la
aplicación en el último acceso
Food
INT
Cantidad del recurso comida acumulado al abandonar la
aplicación en el último acceso
Population
INT
Cantidad del recurso población acumulado al abandonar
la aplicación en el último acceso
Tabla 17 - Tabla TUSER
La relación de cardinalidad de la tabla TUSER con la tabla TBUILDING estables que un
único jugador puede disponer de múltiples edificios y como mínimo uno, pero cada
edificio únicamente perene a un jugador.
6.5.2
Tabla TBUILDING
La tabla TBUILDING almacena toda la información referente al jugador.
Descripción detallada de los atributos de TBUILDING.
Atributo
Tipo
Descripción
Username
VARCHAR(45)
Clave. Nombre del jugador.
Type
VARCHAR(45)
Clave. Tipo del edificio.
Pstruct
INT
Puntos de estructura utilizados
Pstructmax
INT
Puntos de estructura máximos disponibles
Tabla 18 - Tabla TBUILDING
La relación de cardinalidad de la tabla TBUILDING con la tabla TFLOOR estables que un
único edificio puede disponer de múltiples plantas a su disposición y como mínimo una,
pero cada planta únicamente puede ser construida en un único edificio.
6.5.3
Tabla TFLOOR
La tabla TFLOOR almacena toda la información referente a las plantas disponibles para
su construcción.
Descripción detallada de los atributos de TFLOOR.
99
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Atributo
Tipo
Descripción
Username
VARCHAR(45) Clave. Nombre del jugador.
Buildingtype VARCHAR(45) Clave. Tipo del edificio.
Type
VARCHAR(45) Clave. Tipo de la planta.
Level
INT
Nivel actual de la planta.
Poss
INT
Posición que ocupa la planta dentro de la estructura del
edificio.
isbuild
INT
Puede ser NULL. Indica si la planta se encuentra en
construcción.
dinit
LONG
Puede ser NULL. Indica la fecha de inicio de la planta en
construcción.
dfish
LONG
Puede ser NULL. Indica la fecha de fin de la planta en
construcción.
Tabla 19 - Tabla TFLOOR
100
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
6
Implementación
101
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
102
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
7 Implementación
Una vez presentada la aplicación en un contexto general, el estudio se va a centrar en
los algoritmos concretos y complejos que forman parte del código. El desarrollo del
sistema requiere la realización de dos entidades distintas.
»
La aplicación móvil que contiene la implementación del juego y la lógica
necesaria para crear la experiencia del usuario en su terminar.
»
La aplicación servidor, encargada de la medición de localización y comunicación
entre jugadores, además de la lógica de los enfrentamientos.
7.1 Shadow Fire
Sin duda la parte cliente de la aplicación es sin duda la más compleja de abordar. Por un
lado tenemos las clases encargadas de la localización, que continuamente filtran la
información recibida y están pendientes de actualizar y modificar los datos de entrada y
por otro lado todas las clases necesarias para la experiencia de juego, incluida la lógica
propiamente dicha y las complejas clases encargadas del tratamiento gráfico.
Para comenzar el análisis de la implementación es interesante primero abordar la clase
más compleja y que sirve como nexo de unión de toda la aplicación,
TheShadowOfFireActivity.
7.1.1
TheShadowOfFireActivity
La primera acción que tiene que realizar la clase es inicializar todas las clases y
variables necesarias para que Andengine [ANDBLG12] pueda abstraer correctamente su
funcionalidad a la aplicación. Esta inicialización se realiza con la llamada al primer
método de su ciclo de vida, veamos su implementación.
Listado 3
public EngineOptions onCreateEngineOptions() { db = new DBHelper(this); locationUser = new LocationThread(this); 103
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
LocalBroadcastManager.getInstance(this).registerReceiver(mLocationRece
iver, new IntentFilter("send‐socket‐event")); mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { mLocationListener = new MyLocationListener(); mLocationManager.requestLocationUpdates (LocationManager.GPS_PROVIDER, 1, 0, mLocationListener); locationUser.updateLoc(mLocationManager .getLastKnownLocation(LocationManager.GPS_PROVIDER)); } WindowManager windowManager = (WindowManager)getSystemService(WINDOW_SERVICE); WIDTH = windowManager.getDefaultDisplay().getWidth(); HEIGHT = windowManager.getDefaultDisplay().getHeight(); camera = new Camera(0, 0, WIDTH, HEIGHT); return new EngineOptions(true, ScreenOrientation.PORTRAIT_FIXED, new RatioResolutionPolicy(WIDTH, HEIGHT), camera); } La terea realizada por onCreateEngineoptions es sencilla, pero vital. El objetivo es
devolver una clase del tipo engineOptions que permita a Andengine, más
concretamente a la clase engine encargada de la abstracción, especificar las
características que se quieren para el juego, además de iniciar todos los procesos
necesarios.
La primera línea permite crea una instancia a la base de datos SQLite, que se explicará
en detalle en los siguientes apartados. A continuación se inicia el hilo encargado de
obtener
y
filtrar
la
información
de
geolocaclización
y
se
inicia
un
LocalBroadcastManager encargado de filtrar los Intent internos send‐socket‐
event, para los mensajes recibidos desde el servidor. Lo último que se necesita antes
de iniciar el motor gráfico es crear un LocationManager para la escucha de eventos de
nueva localización. Los parámetros indican que las actualizaciones de localización se
realizan en espacios muy cortos de tiempo y sin necesidad de variación de la distancia.
104
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Ya podemos inicializar los valores y políticas de resolución del motor gráfico. Se
inicializan las variables de la clase WindowManager con los valores por defecto del
terminal que ejecuta la aplicación, creando la Camera sujeta a estos valores y centrada
en 0.0. Ya sólo queda devolver una instancia de la clase EngineOptions con dichos
valores y especificando que la orientación de la aplicación siempre sea vertical con
ScreenOrientation.PORTRAIT_FIXED. Con este primer método hemos tocado bastantes clases distintas y muchos procesos
ya están preparados para la recepción de datos, como la localización, el servidor o la
base de datos. Al ser estas clases más complejas, veamos únicamente la
implementación de MyLocationListener.
Listado 4
private class MyLocationListener implements LocationListener { public void onLocationChanged(Location loc) { locationUser.updateLoc(loc); } public void onProviderDisabled(String provider) { } public void onProviderEnabled(String provider) { } public void onStatusChanged(String provider, int status, Bundle extras) { } } MyLocationListener funciona como Listener de los eventos de localización y su
cometido es muy simple. En caso de recibir un nuevo valor del GPS, informa al hilo
encargado de los nuevos valores y actualiza los datos.
El siguiente paso del ciclo de vida es onCreateResources.
105
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Listado 5
public void onCreateResources()
{ try { this.mTextureSplash = new BitmapTexture(this.getTextureManager(), new IInputStreamOpener() { public InputStream open() throws IOException { return getAssets().open("splash/splash.png"); } }); this.mTextureSplash.load(); this.mSlashTextureRegion = TextureRegionFactory.extractFromTexture(this.mTextureSplash); } catch (IOException e) { Debug.e(e); } this.updateCity(); if(isOnline()) { locationUser.start(); } }
En esta clase simplemente se preparan los recursos necesarios para posteriormente
dibujar la primera Scene que se va a mostrar. Siguiendo la navegación de la aplicación,
lo primero es cargar la pantalla de Splash que se mostrará al jugador mientras se
cargan en segundo plano todos los recursos necesarios. La carga de este recurso es
muy simple y sólo es necesario incluir en memoria una única imagen, por lo que la
espera será mínima.
Los pasos para la carga de recursos son comunes en todos los recursos posteriores. La
clase TextureRegion que servirá de contenedor para la clase BitmaTexture que
contiene la imagen. El primer paso es abrir un InputStream sobre la imagen a cargar
desde disco a memoria y realizar la carga invocando el método load. Una vez la textura
está lista, la añadimos a la clase TextureRegion para poder ser usada por el motor
gráfico en forma de Sprite.
106
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Por último, se actualiza la información de la ciudad para persistir toda la estructura de
datos necesaria y por último, si la conexión está habilitada, se permite al hilo de
localización, comenzar la tarea de filtrar la información de tiempo y lugar.
El método isOnline.
Listado 6
public boolean isOnline() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); if (netInfo != null && netInfo.isConnected()) { return true; } return false; }
Se pide al sistema Android a través de una clase ConnectivityManager que nos de
toda la información sobre la red en ese instante. Devolviendo true únicamente si se ha
sido capaz de determinar si la conexión del sistema está establecida.
Siguiente y último paso del ciclo de vida, el método onCreateScene.
Listado 7
public Scene onCreateScene() { VertexBuffer = this.getVertexBufferObjectManager(); engine = this.getEngine(); Line[] FrameLines = new Line[4]; Rectangle BackgroundRectangle; float pHeight = HEIGHT*0.05f; float pWidth = WIDTH*0.90f; float pY = HEIGHT‐pHeight*1.05f; float pX = WIDTH*0.05f; splashScene = new Scene(); splashScene.setBackground(new Background(0f, 0f, 0f)); Sprite splash = new Sprite(0, 0, WIDTH, HEIGHT, mSlashTextureRegion, VertexBuffer); 107
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
BackgroundRectangle = new Rectangle(pX, pY, pWidth, pHeight, VertexBuffer); BackgroundRectangle.setColor(0f,0f,0f); FrameLines[0] = new Line(pX, pY, pX+pWidth, pY, VertexBuffer); FrameLines[1] = new Line(pX + pWidth, pY, pX + pWidth, pY + pHeight, VertexBuffer); FrameLines[2] = new Line(pX + pWidth, pY + pHeight, pX, pY + pHeight, VertexBuffer); FrameLines[3] = new Line(pX, pY + pHeight, pX, pY, VertexBuffer); ProgressRectangle = new Rectangle(pX, pY, 0, pHeight, VertexBuffer); ProgressRectangle.setColor(0.5f, 0, 0); splashScene.attachChild(splash); splashScene.attachChild(BackgroundRectangle); splashScene.attachChild(ProgressRectangle); for(int i = 0; i < FrameLines.length; i++) splashScene.attachChild(FrameLines[i]); this.mPixelsPerPercentRatio = pWidth / 100; LoadThread loadThread = new LoadThread(); loadThread.start(); return splashScene; }
Finalmente, se muestra la escena Splash al usuario mientras los datos son cargados en
paralelo. En concreto, esta escena muestra un fondo negro, una imagen con el logo del
juego mostrada en una clase Sprite que toma textura los recursos antes asociados a
una TextureRegion (en concreto mSlashTextureRegion antes cargada en memoria) y
un rectángulo en la parte inferior de la pantalla a modo de barra de progreso.
La clase configurada se devuelve al motor gráfico para que pueda ser pintada en
pantalla.
Ya se ha visto que la persistencia de los datos de la ciudad en memoria se volcaba en
su estructura de datos antes de comenzar con la carga gráfica. A continuación se
muestra su implementación y las estructuras de datos soportan la lógica de los datos.
108
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Estructuras de datos
Teniendo el motor gráfico iniciado y los recursos cargados en memoria, el siguiente
paso es inicializar correctamente las variables necesarias para soportar la lógica de
recursos y de la ciudad. El código es el siguiente.
Listado 8
private void updateCity() { resources = new HashMap(); resources = db.getResources(); resources.put("Science", Float.valueOf(200)); resources.put("Energy", Float.valueOf(100)); resources.put("Construction", Float.valueOf(150)); resources.put("Food", Float.valueOf(200)); resources.put("Population", Float.valueOf(100)); resources.put("mScience", Float.valueOf(1)); resources.put("sScience", Float.valueOf(0)); resources.put("maxScience", Float.valueOf(0)); resources.put("mConstruction", Float.valueOf(1)); resources.put("sConstruction", Float.valueOf(0)); resources.put("maxConstruction", Float.valueOf(0)); resources.put("mEnergy", Float.valueOf(1)); resources.put("sEnergy", Float.valueOf(0)); resources.put("maxEnergy", Float.valueOf(0)); resources.put("mFood", Float.valueOf(1)); resources.put("sFood", Float.valueOf(0)); resources.put("maxFood", Float.valueOf(0)); resources.put("mPopulation", Float.valueOf(1)); resources.put("sPopulation", Float.valueOf(0)); resources.put("maxPopulation", Float.valueOf(0)); resources.put("wind", Float.valueOf(0)); resources.put("temp", Float.valueOf(0)); city = db.getAllBuilding(); Iterator buildingIt = city.iterator(); while(buildingIt.hasNext()) { Building curretBuilding = (Building)buildingIt.next(); ArrayList allBFloor = new ArrayList(); allBFloor = db.getAllFloorbyBuildingType (curretBuilding.getType()); Iterator FloorIt = allBFloor.iterator(); 109
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
while(FloorIt.hasNext()) { Floor currentFloor = (Floor)FloorIt.next(); if(currentFloor.getPoss()>0) { if(currentFloor.getBuild() == CURRENT_IN_CONSTRUCTION && currentFloor.getDfinish().getTimeInMillis() <Calendar.getInstance().getTimeInMillis()) { currentFloor.setBuild(0); currentFloor.setDfinish (Calendar.getInstance()); currentFloor.setDinit (Calendar.getInstance()); db.updateFloor(curretBuilding .getType(), currentFloor); } curretBuilding.addFloor(currentFloor); } curretBuilding.appplyImprovent(resources); } } }
La variable resources contiene las variables necesarias para el control de todos los
recursos. Inicialmente sólo se crea con los valores por defecto, que posteriormente
serán actualizados al ser tratada la estructura por cada edificio. Las variables
sVariable con tienen la suma adicional a aplicar, las variables mVariable contienen el multiplicador a aplicar y maxVariable contiene el valor máximo que esa
variable puede alcanzar.
El siguiente bucle anidado toma los datos obtenidos de la base de datos con la
información de todas las plantas construidas y su estado, encargándose de actualizar
cualquier evento que hubiese surgido desde la anterior actualización, como una
finalización en una construcción.
Esta forma de actuar es muy similar al modelo vista-controlador usado para el
desarrollo de aplicaciones web. Se toma como partida esta estructura que es analizada
por la aplicación para generar las escenas a ser mostradas. Pero la lógica de
110
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
actualización de los datos es independiente de esta, siendo sólo requerida por la clase
SceneFactory la estructura para su correcto dibujado [Zechner11].
Por último con el método curretBuilding.appplyImprovent(resources) para
invocado por cada planta de cada edificio para que apliquen sus modificaciones a las
variables.
Navegación
La navegación entre los distintos estados de la aplicación debe ser hecha a mano pues
Android sólo permite de forma nativa volver a la anterior Activity ejecutada (cerrando la
aplicación en caso de no existir una última).
Pero gracias al método onBackPressed(), invocado al pulsar el usuario el botón
retroceso, se puede modificar dicho comportamiento a medida. La lógica de la
navegación se ha realizado tomando como base los estados como se muestra en el
apartado 4.2.2 del capítulo 4, cuaderno de desarrollo.
Listado 9
public void onBackPressed() { if(actualScene == SCENE_MAIN) { this.finish(); } else if(actualScene == SCENE_INSIDE_COLMENA || actualScene == SCENE_INSIDE_BALIZA || actualScene == SCENE_INSIDE_CENTRO_MANDO || actualScene == SCENE_INSIDE_LABORATORIO || actualScene == SCENE_INSIDE_HOSPITAL || actualScene == SCENE_INSIDE_PLANTA_ENERGIA || actualScene == SCENE_INSIDE_BASE_MILITAR) { engine.setScene(scenefactory.getCityScene()); actualScene = SCENE_MAIN; } else if(actualScene == SCENE_CHOSSE_NEW) { switch(lastScene) { case SCENE_INSIDE_COLMENA: actualScene = SCENE_INSIDE_COLMENA; engine.setScene(scenefactory.getHouseScene()); break; case SCENE_INSIDE_BALIZA: actualScene = SCENE_INSIDE_BALIZA; 111
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
engine.setScene(scenefactory.getBeaconScene()); break; case SCENE_INSIDE_BASE_MILITAR: actualScene = SCENE_INSIDE_BASE_MILITAR; .setScene(scenefactory.getMilitaryScene()); break; case SCENE_INSIDE_CENTRO_MANDO: actualScene = SCENE_INSIDE_CENTRO_MANDO; engine.setScene(scenefactory.getHallScene()); break; case SCENE_INSIDE_HOSPITAL: actualScene = SCENE_INSIDE_HOSPITAL; engine.setScene(scenefactory.getHospitalScene()); break; case SCENE_INSIDE_LABORATORIO: actualScene = SCENE_INSIDE_LABORATORIO; engine.setScene(scenefactory.getLabScene()); break; case SCENE_INSIDE_PLANTA_ENERGIA: actualScene = SCENE_INSIDE_PLANTA_ENERGIA; engine.setScene(scenefactory.getEnergyScene()); break; case SCENE_CHOSSE_NEW: engine.setScene(scenefactory.getCityScene()); actualScene = SCENE_MAIN; lastScene = SCENE_MAIN; break; } lastScene = SCENE_CHOSSE_NEW; camera.setCenter(lastX, lastY); } else if(actualScene == SCENE_MENU) { actualScene = SCENE_MAIN; engine.setScene(scenefactory.getCityScene()); } else { this.finish(); } }
Se distinguen los siguientes estados y la acción a llevar a cabo tras pulsar atrás. Si la
aplicación se encuentra mostrando la escena principal con la panorámica de la ciudad,
se cierra la aplicación. En caso de encontrarse en el interior de uno de los edificios,
112
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
volvemos a la panorámica de la ciudad. En caso de encontrarse en uno de los menús de
construcción o mejora, se vuelve al interior del edificio en el que se estaba.
Fondo parallax y scroll
La pantalla principal con la panorámica de la ciudad así como el menú de construcción
de una nueva planta son demasiado extensos para poder ser mostrados en su totalidad.
Es necesaria la creación de un método que actualice correctamente la pantalla y los
gráficos ante los movimientos del dedo sobre la pantalla.
Para el caso de la panorámica, el scroll será horizontal, pero para la pantalla de
selección el scroll es vertical, teniendo que diferenciar estos estados dentro del método
para calcular correctamente la nueva posición de la cámara.
Listado 10
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pTouchEvent) { if (pTouchEvent.getAction() == MotionEvent.ACTION_DOWN) { mTouchX = pTouchEvent.getMotionEvent().getX(); mTouchY = pTouchEvent.getMotionEvent().getY(); } else if (pTouchEvent.getAction() == MotionEvent.ACTION_MOVE) { float newX = pTouchEvent.getMotionEvent().getX(); float newY = pTouchEvent.getMotionEvent().getY(); mTouchOffsetX = (newX ‐ mTouchX); mTouchOffsetY = (newY ‐ mTouchY); backgroundParallax.updateScrollEvents(); float newScrollX = this.camera.getCenterX() ‐ mTouchOffsetX; float newScrollY = this.camera.getCenterY() ‐ mTouchOffsetY; if(this.actualScene == SCENE_CHOSSE_NEW) this.camera.setCenter(camera.getCenterX() , newScrollY); if(this.actualScene == SCENE_MAIN) this.camera.setCenter(newScrollX , camera.getCenterY()); mTouchX = newX; mTouchY = newY; } return true;} 113
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Cuando el usuario coloque el dedo sobre la pantalla, se registra la posición como inicial.
Al moverse, se utiliza este punto inicial para calcular la cantidad total de movimiento y
actualizar la nueva posición de la cámara con estos datos en el eje que interese.
La pantalla de la panorámica incluye un fondo de que simula profundidad con varias
capas
que
se
actualizan
a
distintas
velocidades.
Esta
clase
ScrollableParallaxBackground no existía en la API original de Andengine, por lo que se
ha incluido al proyecto. Su implementación es la siguiente y se ha añadido al conjunto
de aplicaciones que forman la API de Andengine en el proyecto.
Listado 11
public class ScrollableParallaxBackground extends ParallaxBackground { private float cameraPreviousX; private float cameraOffsetX; private Camera camera; public ScrollableParallaxBackground(final float pRed, final float pGreen, final float pBlue, Camera camera) { super(pRed, pGreen, pBlue); this.camera = camera; cameraPreviousX = camera.getCenterX(); } public void updateScrollEvents() { if (cameraPreviousX != this.camera.getCenterX()) { cameraOffsetX = cameraPreviousX ‐ this.camera.getCenterX(); cameraPreviousX = this.camera.getCenterX(); } } @Override public void onUpdate(float pSecondsElapsed) { super.onUpdate(pSecondsElapsed); this.mParallaxValue ‐= (cameraOffsetX * 2) * pSecondsElapsed; cameraOffsetX = 0; } }
114
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
HUD
El último elemento a de ser dibujado es el HUD de la aplicación. Como se dispone de la
estructura de datos con las variables actualizadas, únicamente es necesario tratar esta
estructura para leer de ella los datos que se van a mostrar y actualizarlos en caso de
realizarse un cambio.
Listado 12
private class FireHUD extends HUD { private Text windText; private Text temperatureText; private Sprite clima; public FireHUD() { super(); float size = HEIGHT*0.07f; Sprite backgroundHUD = new Sprite(0, 0, mHUDTextureRegion, VertexBuffer); Sprite alert = new Sprite(WIDTH*0.83f, HEIGHT*0.37f, size*1.3f, size*1.3f, mIconsAlertTextureRegion, VertexBuffer) { @Override public boolean onAreaTouched(final TouchEvent pTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { actualScene = SCENE_MENU; Scene s = scenefactory.getMenuScene(); engine.setScene(s); return true; }; Float s = Float.valueOf(resources.get("Science").toString()) + Float.valueOf(resources.get("sScience").toString()); Float c = Float.valueOf(resources.get("Construction").toString()) + Float.valueOf(resources.get("sConstruction").toString()); Float e = Float.valueOf(resources.get("Energy").toString()) + Float.valueOf(resources.get("sEnergy").toString()); Float f = Float.valueOf(resources.get("Food").toString()) + Float.valueOf(resources.get("sFood").toString()); Float p = Float.valueOf(resources.get("Population").toString()) + Float.valueOf(resources.get("sPopulation").toString()); Sprite wind = new Sprite(WIDTH*0.89f, HEIGHT*0.19f, size*0.9f, size*0.9f, mIconsWindTextureRegion, VertexBuffer); 115
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Sprite temperature = new Sprite(WIDTH*0.89f, HEIGHT*0.28f, size*0.9f, size*0.9f, mIconsTemperatureTextureRegion, VertexBuffer); windText = new Text(wind.getX()+wind.getWidth()/3, (wind.getY()+wind.getHeight()), mFont, resources.get("wind").toString(), new TextOptions(HorizontalAlign.LEFT), VertexBuffer); temperatureText = new Text(temperature.getX()+temperature.getWidth()/3, (temperature.getY()+temperature.getHeight()), mFont, resources.get("temp").toString(), new TextOptions(HorizontalAlign.LEFT), VertexBuffer); Sprite science = new Sprite(WIDTH*0.05f, HEIGHT*0.01f, size, size, mIconsScienceTextureRegion, VertexBuffer); Sprite construction = new Sprite(WIDTH*0.25f, HEIGHT*0.01f, size, size, mIconsConstructionTextureRegion, VertexBuffer); Sprite energy = new Sprite(WIDTH*0.45f, HEIGHT*0.01f, size, size, mIconsEnergyTextureRegion, VertexBuffer); Sprite food = new Sprite(WIDTH*0.65f, HEIGHT*0.01f,size, size, mIconsFoodTextureRegion, VertexBuffer); Sprite human = new Sprite(WIDTH*0.85f, HEIGHT*0.01f, size, size, mIconsHumanTextureRegion, VertexBuffer); final Text scienceText = new Text(science.getX()+science.getWidth()/3, (science.getY()+science.getHeight()), mFont, s.toString(), new TextOptions(HorizontalAlign.LEFT), VertexBuffer); final Text constructionText = new Text(construction.getX()+construction.getWidth()/3, (construction.getY()+construction.getHeight()), mFont, c.toString(), new TextOptions(HorizontalAlign.LEFT), VertexBuffer); final Text energyText = new Text(energy.getX()+energy.getWidth()/3, (energy.getY()+energy.getHeight()), mFont, e.toString(), new TextOptions(HorizontalAlign.LEFT), VertexBuffer); final Text foodText = new Text(food.getX()+food.getWidth()/3, (food.getY()+food.getHeight()), mFont, f.toString(), new TextOptions(HorizontalAlign.LEFT), VertexBuffer); final Text humanText = new Text(human.getX()+human.getWidth()/3, (human.getY()+human.getHeight()), mFont, p.toString(), new TextOptions(HorizontalAlign.LEFT), VertexBuffer); backgroundHUD.setWidth(WIDTH); backgroundHUD.setHeight(HEIGHT*0.5f); super.attachChild(backgroundHUD); super.attachChild(science); super.attachChild(construction); super.attachChild(energy); super.attachChild(food); super.attachChild(human); super.attachChild(alert); super.registerTouchArea(alert); super.attachChild(wind); 116
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
}
super.attachChild(temperature);
super.attachChild(scienceText); super.attachChild(constructionText); super.attachChild(energyText); super.attachChild(foodText); super.attachChild(humanText); super.attachChild(windText); super.attachChild(temperatureText); super.setTouchAreaBindingOnActionDownEnabled(true); } El HUD dispone de dos grupos de iconos y variables distintos. Los iconos y texto siguen
la misma estructura en su especificación mostrado anteriormente para la escena
splash y el código carece de un interés especial.
Por un lado la parte superior muestra el total de los cinco recursos y sus valores. Y una
barra lateral con los iconos de localización y tiempo, junto con el botón de información.
La carga y configuración del HUD es igual a la configuración de una escena, ya
mostrada anteriormente con la pantalla Splash. Se crean los Sprites recuperando las
imágenes almacenas en las TextureRegion, añadiendo en este caso además unas
clases Text para mostrar los valores numéricos, vinculando todos los recursos a la
escena con el método attachChild.
SceneFactory y escenas restantes
La clase SceneFactory realiza bajo invocación de sus métodos diferentes escenas
usadas por el motor gráfico. En este apartado se van a mostrar los códigos de la
configuración de las escenas que faltan por mostrar.
Las escenas restantes son: Visión general de la ciudad, interior de los edificios, menú de
mejoras y menú de nueva planta.
Fragmento de código necesario para la visión general de la ciudad.
Listado 13
backgroundParallax = new ScrollableParallaxBackground(0, 0, 0, camera); final float centerX = (WIDTH ‐ mCityHallTextureRegion.getWidth()) / 2; final float centerY = HEIGHT/2; 117
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
cityhospital = new Sprite(centerX+400, centerY‐mCityHospitalTextureRegion.getWidth(), mCityHospitalTextureRegion, VertexBuffer){ @Override public boolean onAreaTouched(final TouchEvent pTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { float newX = pTouchEvent.getMotionEvent().getX(); mTouchOffsetX = (newX ‐ mTouchX); scroll += Math.abs(mTouchOffsetX); if(pTouchEvent.getAction() == MotionEvent.ACTION_MOVE) { backgroundParallax.updateScrollEvents(); float newScrollX = camera.getCenterX() ‐ mTouchOffsetX; camera.setCenter(newScrollX, camera.getCenterY()); mTouchX = newX; } else if(pTouchEvent.getAction() == MotionEvent.ACTION_UP) { if(scroll<MAX_SCROLL) { TheShadowOfFireActivity.this.getEngine() .setScene(scenefactory.getHospitalScene()); actualScene = SCENE_INSIDE_HOSPITAL; camera.setCenter(WIDTH/2, HEIGHT/2); } scroll=0; } else if (pTouchEvent.getAction() == MotionEvent.ACTION_DOWN) { mTouchX = pTouchEvent.getMotionEvent().getX(); } return true; } }; //Se omiten resto de Sprites
El código muestra la creación del Sprite de un único edificio. Cada Sprite necesita ser
capaz de diferenciar los distintos toques que el usuario puede realizar sobre él. Por un
lado, si el usuario únicamente da un toque al edificio sin arrastrar el dedo, se entiende
que desea acceder a él. Si el movimiento realizado por el dedo es superior a un umbral,
se asume que el dedo se arrastra por la pantalla, moviendo la escena haciendo scroll
horizontal.
Fragmento de código necesario para la visión interna de un edificio.
118
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Listado 14
public void createColmenaScene()
{ houseScene = new Scene(); houseScene.setBackground(new Background(0f, 0f, 0f)); Building house = city.get(city.indexOf(new Building("Colmena"))); Iterator it = house.getAllFloor().iterator(); housefloor1 = (Sprite)((Floor) it.next()).getSprite(); housefloor2 = (Sprite)((Floor) it.next()).getSprite(); housefloor3 = (Sprite)((Floor) it.next()).getSprite(); housefloor4 = (Sprite)((Floor) it.next()).getSprite(); housefloor5 = (Sprite)((Floor) it.next()).getSprite(); houseScene.attachChild(housefloor1); houseScene.registerTouchArea(housefloor1); houseScene.attachChild(housefloor2); houseScene.registerTouchArea(housefloor2); houseScene.attachChild(housefloor3); houseScene.registerTouchArea(housefloor3); houseScene.attachChild(housefloor4); houseScene.registerTouchArea(housefloor4); houseScene.attachChild(housefloor5); houseScene.registerTouchArea(housefloor5); }
Al recorrer la estructura de datos se puede precisar que planta corresponde a cada
sección del edificio, obteniendo directamente la información sin necesidad de ninguna
operación más.
Fragmento de código necesario para el menú de mejoras.
Listado 15
currentFloor.setSprite(new Sprite(WIDTH*0.03f, HEIGHT*(0.80f‐offset), WIDTH*0.75f, HEIGHT*0.14f, mFloorResidenciaTextureRegion, VertexBuffer) { @Override public boolean onAreaTouched(final TouchEvent pTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { FloorResidencia residencia = (FloorResidencia)currentFloor; lastScene = actualScene; actualScene = SCENE_LEVEL_CHANGED; lastX = camera.getCenterX(); lastY = camera.getCenterY(); Scene selectScene = new Scene(); 119
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
selectScene.setBackground(new Background(0f, 0f, 0f)); Text textup = new Text(WIDTH*0.03f,HEIGHT*0.25f, mWFont, "SUBIDA A NIVEL + residencia.getDescription(), new TextOptions(HorizontalAlign.LEFT), VertexBuffer); Text textdown = new Text(WIDTH*0.03f,HEIGHT*0.50f, mWFont, "BAJADA NIVEL A NIVEL " +residencia.getDescription() , new TextOptions(HorizontalAlign.LEFT), VertexBuffer); selectScene.attachChild(textup); selectScene.attachChild(textdown); engine.setScene(selectScene); return true; } });
La creación de esta escena se encuentra implícita dentro de la creación del propio Sprite
de la planta y se activa al tocar el usuario la planta. Se trata de una configuración como
las que se han realizado con anterioridad y el código no contiene ningún elemento
nuevo no mostrado ya.
Fragmento de código necesario para el de nueva construcción.
Listado 16
currentFloor.setSprite(new Sprite(WIDTH*0.03f, HEIGHT*(0.80f‐offset), WIDTH*0.75f, HEIGHT*0.14f, mFloorEmpyTextureRegion, VertexBuffer) { @Override public boolean onAreaTouched(final TouchEvent pTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { if(pTouchEvent.getAction() == MotionEvent.ACTION_UP) { lastScene = actualScene; actualScene = SCENE_CHOSSE_NEW; lastX = camera.getCenterX(); lastY = camera.getCenterY(); ArrayList list = new ArrayList(); switch(lastScene) { case SCENE_INSIDE_COLMENA: list = db.getAllFloorbyBuildingType("Colmena"); break; 120
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
case SCENE_INSIDE_BALIZA:
list = db.getAllFloorbyBuildingType("Baliza"); break; case SCENE_INSIDE_BASE_MILITAR: list = db.getAllFloorbyBuildingType("Base militar"); break; case SCENE_INSIDE_CENTRO_MANDO: list = db.getAllFloorbyBuildingType("Centro de break; case SCENE_INSIDE_HOSPITAL: list = db.getAllFloorbyBuildingType("Hospital"); break; case SCENE_INSIDE_LABORATORIO: list = db.getAllFloorbyBuildingType("Laboratorio"); break; case SCENE_INSIDE_PLANTA_ENERGIA: list = db.getAllFloorbyBuildingType("Planta de break; } Scene selectScene = new Scene(); selectScene.setBackground(new Background(0f, 0f, 0f)); int numFloors = 0; Iterator it = list.iterator(); while(it.hasNext()) { final Floor floor = (Floor)it.next(); if(floor.getLevel()<=0) { floor.setSprite(new Sprite(WIDTH*0.03f, HEIGHT*(0.2f + numFloors*HEIGHT*0.14f), WIDTH*0.75f, HEIGHT*0.14f, mFloorResidenciaTextureRegion, VertexBuffer) { @Override public boolean onAreaTouched(final TouchEvent pTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { float newY = pTouchEvent.getMotionEvent().getY(); mTouchOffsetY = (newY ‐ mTouchY); scroll += Math.abs(mTouchOffsetY); if(pTouchEvent.getAction() == MotionEvent.ACTION_MOVE) { float newScrollY = camera.getCenterY() ‐ mTouchOffsetY; camera.setCenter(camera.getCenterX() ,newScrollY); mTouchY = newY; 121
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
} else if(pTouchEvent.getAction() == MotionEvent.ACTION_UP) { if(scroll<MAX_SCROLLY) { Floor floor = (Floor)floor; floor.setPoss( currentFloor.getPoss()); floor.setLevel(1); floor.setDinit(Calendar. getInstance().getTimeInMillis()); floor.setDfinish(floor. calculateDFinish(floor.getLevel())); floor.setBuild(1); db.deleteFloor(curretBuilding .getType(), currentFloor); { db.updateFloor(curretBuilding .getType(), safloor); updateCity(); createAllScenes(); switch(lastScene) case SCENE_INSIDE_COLMENA: houseScene.clearChildScene(); engine.setScene(getHouseScene()); break; case SCENE_INSIDE_BALIZA: beaconScene.clearChildScene(); engine.setScene(getBeaconScene()); break; case SCENE_INSIDE_BASE_MILITAR: militaryScene.clearChildScene(); engine.setScene(getMilitaryScene()); break; case SCENE_INSIDE_CENTRO_MANDO: hallScene.clearChildScene(); 122
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
});} engine.setScene(getHallScene());
break; case SCENE_INSIDE_HOSPITAL: hospitalScene.clearChildScene(); engine.setScene(getHospitalScene()); break; case SCENE_INSIDE_LABORATORIO: labScene.clearChildScene(); engine.setScene(getLabScene()); break; case SCENE_INSIDE_PLANTA_ENERGIA: energyScene.clearChildScene(); engine.setScene(getEnergyScene()); break; } camera.setCenter(lastX, lastY); } scroll = 0; } else if (pTouchEvent.getAction() == MotionEvent.ACTION_DOWN) { mTouchY = pTouchEvent. getMotionEvent().getY(); } return true; } De nuevo el paso de creación de esta escena se encuentra implícito dentro del propio
Sprite que debe ejecutar el método de invocación al ser tocado.
El primer paso consiste en obtener todas las plantas que aun no han sido construidas y
mostrarlas al usuario recorriendo el Array que nos es devuelto de la clase dbHelper.
Como ya sucedía en la escena que representaba la panorámica de la ciudad, el usuario
puede pulsar o arrastrar con el dedo sobre los Sprites, por lo que es necesario
diferenciar entre estos dos aspectos calculando el movimiento del dedo, esta vez sobre
el eje Y.
En caso de arrastrar, la escena únicamente se desplaza el espacio necesario. En caso
de pulsar, la información pertinente a la nueva planta se actualiza en la base de datos,
restando actualizar la escena pertinente al edificio en curso para mostrar los cambios.
123
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
7.1.2
Localización
Ya tenemos la aplicación mostrado los gráficos y las estructuras de datos preparadas
para soportar todas las variables básicas. Pero si el usuario se encuentra conectado a la
red, la aplicación podrá tomar los datos de su localización y obtener las variaciones que
le son aplicables.
El proceso es sencillo, un hilo paralelo a la aplicación realiza una petición http a los dos
sitios Google Places [GPAP12] y Weather Underground [WUAP12], recibiendo toda la
información en formato XML. Una clase Handler trata los XML y los persiste en dos
clases enviadas a la actividad principal.
La implementación del hilo es el siguiente.
Listado 17
public class LocationThread extends Thread
{ //URL services y APIs private static final String QBASE = "http://api.wunderground.com/auto/wui/geo/WXCurrentObXML/index.xml?query="; private static final String GPLACES = "https://maps.googleapis.com/maps/api/place/search/xml?location="; private TheShadowOfFireActivity tsof; //Google Places Params private static final String GKEY = "xxx"; //Private Key, can’t show it private static final int RADIUS = 10; WeatherInformation wi; PlacesInformation pi; private Location currentLocation; public LocationThread(TheShadowOfFireActivity act) { currentLocation = null; tsof = act; } public void updateLoc(Location loc) { currentLocation = loc; } public void run() { while(true) 124
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
{ if(currentLocation!=null) { wi = new WeatherInformation(); pi = new PlacesInformation(); try { GeoHandler parser = new GeoHandler(); URL urlWeather = new URL(QBASE + currentLocation.getLatitude() + "," + currentLocation.getLongitude()); URL urlPlaces = new URL(GPLACES + currentLocation.getLatitude() + "," + currentLocation.getLongitude() + "&radius=" + RADIUS + "&sensor=true&key=" + GKEY); wi = parser.parseWeather(urlWeather); ArrayList<PlacesInformation> array = parser.parsePlaces(urlPlaces); pi = (PlacesInformation) array.get(0); this.tsof.actLocationInformation(wi,pi); } catch (MalformedURLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } try { this.sleep(1000*15); } catch (InterruptedException e) { e.printStackTrace(); } } } public WeatherInformation getWi() { return wi; } public PlacesInformation getPi() { return pi; } }
El primer paso es preparar las URL con los datos necesarios. En el caso de Weather
Undergraund sólo se precisan los datos de localización en forma de latitud y longitud.
125
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Google Places es un poco más refinado. Además de los datos de latitud y longitud, se
necesita especificar el radio de acción al que aplicar la búsqueda, en este caso fijada en
10 metros y especificar si la petición se realiza a través de un dispositivo móvil, en este
caso sí.
Con estas URL el parser puede abrir un Stream con los XMLs entrantes y devolver el par
de clases WeatherInformation y PlacesInformation con los datos necesario a
enviar a la aplicación. Por último el hilo espera 15 segundos para realizar una nueva
petición.
Handler
La clase GeoHandleres la encargada del parseo de los XMLs obtenidos de las URLs.
Para su desarrollo se ha usado una versión simplificada de SAX para Android. Veamos
su implementación.
Listado 18
public class GeoHandler { private PlacesInformation pi; public WeatherInformation parseWeather(URL urlWeather) { final WeatherInformation wi = new WeatherInformation(); RootElement root = new RootElement("current_observation"); Element dl = root.getChild("display_location"); dl.getChild("state_name").setEndTextElementListener( new EndTextElementListener(){ public void end(String country) { wi.setCountry(country); } }); dl.getChild("city").setEndTextElementListener( new EndTextElementListener(){ public void end(String city) { wi.setCity(city); } }); root.getChild("temp_c").setEndTextElementListener( new EndTextElementListener(){ public void end(String temp_c) { wi.setTemp_c(temp_c); } }); 126
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
root.getChild("weather").setEndTextElementListener( new EndTextElementListener(){ public void end(String weather) { wi.setWeather(weather); } }); root.getChild("wind_dir").setEndTextElementListener( new EndTextElementListener(){ public void end(String wind_dir) { wi.setWind_dir(wind_dir); } }); root.getChild("wind_mph").setEndTextElementListener( new EndTextElementListener(){ public void end(String wind_mph) { wi.setWind_vel(String.valueOf(Double.parseDouble(wind_mph)*1.609344)); } }); try { Xml.parse(urlWeather.openConnection().getInputStream(), Xml.Encoding.UTF_8, root.getContentHandler()); } catch (Exception ex) { throw new RuntimeException(ex); } return wi; } public ArrayList<PlacesInformation> parsePlaces(URL urlPlaces) { final ArrayList<PlacesInformation> ap = new ArrayList<PlacesInformation>(); RootElement root = new RootElement("PlaceSearchResponse"); Element result = root.getChild("result"); result.setStartElementListener(new StartElementListener (){ public void start(Attributes attributes) { pi = new PlacesInformation(); } }); result.setEndElementListener(new EndElementListener(){ public void end() { ap.add(pi); } 127
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
}); result.getChild("name").setEndTextElementListener( new EndTextElementListener(){ public void end(String name) { pi.setName(name); } }); result.getChild("type").setEndTextElementListener( new EndTextElementListener(){ public void end(String type) { pi.addType(type); } }); result.getChild("icon").setEndTextElementListener( new EndTextElementListener(){ public void end(String icon) { pi.setIcon(icon); } }); try { Xml.parse(urlPlaces.openConnection().getInputStream(), Xml.Encoding.UTF_8, root.getContentHandler()); } catch (Exception ex) { throw new RuntimeException(ex); } return ap; } }
Para evitar problemas, Android propone una variante del modelo SAX que permite
asociar directamente las acciones a etiquetas concretas dentro de la estructura del
documento XML, lo que alivia en gran medida los inconvenientes. Este modelo SAX
alternativo simplifica la elaboración del handler necesario y puede ayudar a evitar
posibles errores y disminuir la complejidad del mismo para casos en los que el
documento XML no sea tan sencillo.
La clase Handler establece dos InputStreams con los datos en formato XML recibidos a
partir de las URL configuradas en la clase LocationThread. Una vez abierta la
comunicación, dos datos se analizan y parsean a las clases que soportan los datos.
128
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Las clases PlacesInformation y WeatherInformation se muestran a continuación.
PlacesInformation
Listado 19
public class PlacesInformation implements Parcelable
{ private String name; private ArrayList types; private String icon; public PlacesInformation(Parcel in) { readFromParcel(in); } public PlacesInformation() { types = new ArrayList(); } @Override public String toString() { return "PlacesInformation [name=" + name + ", types=" + types.toString() + ", icon=" + icon + "]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public ArrayList getTypes() { return types; } public void setTypes(ArrayList types) { this.types = types; } public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon; } public int describeContents() { return 0; } public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeList(types); dest.writeString(icon); } 129
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
private void readFromParcel(Parcel in) { name = in.readString(); in.readList(types, null); icon= in.readString(); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public PlacesInformation createFromParcel(Parcel in) { return new PlacesInformation(in); } public PlacesInformation[] newArray(int size) { return new PlacesInformation[size]; } }; public void addType(String type) { this.types.add(type); } }
De todos los datos obtenidos de Google Places interesa únicamente la primera tienda
devuelta más cercana al jugador. Del XML se extraen los datos de nombre, tipo e icono.
El interfaz Parcelable que implementa la clase permite que esta pueda ser transmitida
entre distintas Activitys dentro del sistema Android, haciendo uso el sistema de los
métodos readFromParcel y writeToParcel. Es importante en la implementación de
estos métodos respetar el orden en el que los atributos han sido transformados.
Comparado con el documento XML recibido.
Listado 20
<PlaceSearchResponse>
<status></status>
<result>
<name></name>
<vicinity></vicinity>
<type></type>
<type></type>
…
<geometry>
<location>
<lat></lat>
<lng></lng>
</location>
</geometry>
<icon></icon>
<reference></reference>
<id></id>
130
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
</result>
<result>
…
</result>
…resto del documento no relevante
</PlaceSearchResponse>
Las variables serían parseadas de los siguientes elementos:
<name></name> -> name Nombre del establecimiento desde la que juega el jugador. Empleado en estadísticas sin
aplicación real al juego.
<type></type> -> types Indica el o los tipos de establecimiento en el que se encuentra el jugador. Usado para la
toma de recursos por localización.
<icon></icon> -> icon Icono del establecimiento. Usado como element decorative e informative en la interfaz
de usuario.
WeatherInformation
Listado 21
public class WeatherInformation implements Parcelable
{ private String country; private String city; private String weather; private String temp_c; private String wind_dir; private String wind_vel; public WeatherInformation(Parcel in) { readFromParcel(in); } public WeatherInformation() { } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getCity() { 131
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
return city; } public void setCity(String city) { this.city = city; } public String getWeather() { return weather; } public void setWeather(String weather) { this.weather = weather; } public String getTemp_c() { return temp_c; } public void setTemp_c(String temp_c) { this.temp_c = temp_c; } public String getWind_dir() { return wind_dir; } public void setWind_dir(String wind_dir) { this.wind_dir = wind_dir; } public String getWind_vel() { return wind_vel; } public void setWind_vel(String wind_mph) { this.wind_vel = wind_mph; } public int describeContents() { return 0; } @Override public String toString() { return "WeatherInformation [country=" + country + ", city=" + city + ", weather=" + weather + ", temp_c=" + temp_c + ", wind_dir=" + wind_dir + ", wind_mph=" + wind_vel + "]"; } public void writeToParcel(Parcel dest, int i) { dest.writeString(country); dest.writeString(city); dest.writeString(weather); dest.writeString(temp_c); dest.writeString(wind_dir); dest.writeString(wind_vel); } private void readFromParcel(Parcel in) { country = in.readString(); 132
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
city = in.readString();
weather = in.readString(); temp_c = in.readString(); wind_dir = in.readString(); wind_vel = in.readString(); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public WeatherInformation createFromParcel(Parcel in) { return new WeatherInformation(in); } public WeatherInformation[] newArray(int size) { return new WeatherInformation[size]; } }; } De todos los datos obtenidos de Weather Underground se procesan una mayor cantidad
que el caso anterior. Del XML se extraen los datos de país, ciudad, tiempo, temperatura
en Celsius, velocidad del viento y dirección del viento. El interfaz Parcelable lo
implementa la clase del mismo modo que el caso anterior.
Comparado con el documento XML recibido.
Listado 22
<current_observation>
<credit></credit>
<credit_URL></credit_URL>
<termsofservice ></termsofservice>
<image>
<url></url>
<title> </title>
<link> link>
</image>
<display_location>
<full> </full>
<city> </city>
<state/>
<state_name></state_name>
<country> </country>
<country_iso3166> </country_iso3166>
<zip></zip>
<latitude></latitude>
<longitude></longitude>
<elevation></elevation>
</display_location>
133
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
<observation_location>
<full></full>
<city> </city>
<state/>
<country> </country>
<country_iso3166> </country_iso3166>
<latitude></latitude>
<longitude></longitude>
<elevation></elevation>
</observation_location>
<station_id></station_id>
<observation_time></observation_time>
<observation_time_rfc822></observation_time_rfc822>
<observation_epoch></observation_epoch>
<local_time></local_time>
<local_time_rfc822> </local_time_rfc822>
<local_epoch></local_epoch>
<weather> </weather>
<temperature_string></temperature_string>
<temp_f></temp_f>
<temp_c></temp_c>
<relative_humidity></relative_humidity>
<wind_string></wind_string>
<wind_dir></wind_dir>
<wind_degrees></wind_degrees>
<wind_mph></wind_mph>
<wind_gust_mph/>
<pressure_string></pressure_string>
<pressure_mb></pressure_mb>
<pressure_in></pressure_in>
<dewpoint_string></dewpoint_string>
<dewpoint_f></dewpoint_f>
<dewpoint_c></dewpoint_c>
<heat_index_string> </heat_index_string>
…resto del documento no relevante
</current_observation>
Las variables serían parseadas de los siguientes elementos:
<state_name> </state_name> -> country Al tratarse de una aplicación estadounidense, Weather underground no diferencia entre
estado u país, marcado indicando el país bajo esta etiqueta. Nombre del país desde el
que juega el jugador. Empleado en estadísticas sin aplicación real al juego.
<city> </city> -> city 134
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Nombre de la ciudad desde la que juega el jugador. Empleado en estadísticas sin
aplicación real al juego.
<weather> </weather> -> weather Indica las condiciones climatológicas del lugar donde se encuentra el jugador. Usado
para la toma de recursos por localización.
<temp_c></temp_c> -> temp_c Indica la temperatura del lugar donde se encuentra el jugador. Usado para la toma de
recursos por localización.
<wind_dir></wind_dir>n -> wind_dir Indica la la dirección del viento del lugar donde se encuentra el jugador. Usado para la
toma de recursos por localización.
<wind_mph></wind_mph> -> wind_vel Indica la velocidad del viento del lugar donde se encuentra el jugador. La variable
recibida se recibe en millas por hora que posteriormente es convertida en kilometros por
hora. Usado para la toma de recursos por localización.
Jugadores cercanos
Estos datos necesitan ser tratados si desde el servidor se ha comunicado a la aplicación
que existe uno o más jugadores que compiten con el jugador por los beneficios. Por
cada jugador se establece una relación uno a uno asociada con un valor llamado factor
de victoria o FV. Dicho tiene por defecto el valor 1 y a medida que los jugadores
compiten entre ellos aumenta o decremento.
‐
En caso de ser mayor a 1, el jugador pierde recursos a favor del enemigo.
‐
En caso de ser menor a 1, el enemigo pierde recursos a favor del jugador.
La cantidad que cada recurso debe ser modificado se calcula de forma unificada para
todos los jugadores que los comparten y separadamente para cada recurso
multiplicándolo por un valor conocido como porcentaje de ganancia, calculado
siguiendo la siguiente formula.
135
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
1
1
∑
Siendo PG el porcentaje de ganancia y FV el factor de victoria. A un mayor FV, se obtiene
un menor PG y por lo tanto se obtienen menos recursos.
Este porcentaje únicamente se aplica a los recursos obtenidos en ese momento gracias
a la localización, no a los recursos ya obtenidos y almacenados por el jugador.
SQLite
Únicamente queda la especificación de la clase DBHelper para el acceso a la base de
datos SQLite.
Listado 23
public class DBHelper { private SQLiteDatabase db; private final DBOpenHelper dbOpenHelper; private static final String DATABASE_NAME = "the_shadow_of_fire_database"; private static String tuser = "tuser"; private static String tbuilding = "tbuilding"; private static String tfloor = "tfloor"; private static String[] USER_COLS = new String[] {"name", "email", "first", "last","level", "points", "Science","Construction","Energy","Food","Population"}; private static String[] BUILDING_COLS = new String[] {"type", "pstruct", "pstructmax"}; private static String[] FLOOR_COLS = new String[] {"type", "building_type", "level", "poss", "isbuild", "dinit","dfinish"}; private static String[] TECHTREE_COLS = new String[] {"type", "level", "type_necessary", "level_necessary"}; private static final int DATABASE_VERSION = 39; private static String CREATE_TUSER = "CREATE TABLE tuser (name VARCHAR(45) NOT NULL UNIQUE, email VARCHAR(45) NOT NULL, first LONG NOT NULL, last LONG NOT NULL, level INT NOT NULL, points INT NOT NULL, Science FLOAT NOT NULL, Construction FLOAT NOT NULL, Energy FLOAT NOT NULL, Food FLOAT NOT NULL, Population FLOAT NOT NULL, PRIMARY KEY (name));"; private static String CREATE_TBUILDINDG = "CREATE TABLE tbuilding (type VARCHAR(45) NOT NULL UNIQUE, pstruct INT NOT NULL, pstructmax INT NOT NULL, PRIMARY KEY (type));"; private static String CREATE_TFLOOR = "CREATE TABLE tfloor (type 136
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
VARCHAR(45) NOT NULL, building_type VARCHAR(45) NOT NULL, level INT NOT NULL , poss INT NOT NULL, isbuild INT NOT NULL, dinit LONG NOT NULL, dfinish LONG NOT NULL, PRIMARY KEY (type, building_type, poss), FOREIGN KEY (building_type ) REFERENCES tbuilding (type));"; private static String CREATE_TECHTREE = "CREATE TABLE techtree (type VARCHAR(45) NOT NULL, level int NOT NULL, type_necessary VARCHAR(45) NOT NULL, level_necessary INT NOT NULL, PRIMARY KEY (type, type_necessary), FOREIGN KEY (type ) REFERENCES tfloor (type), FOREIGN KEY (type_necessary ) REFERENCES tfloor (type) ON DELETE NO ACTION ON UPDATE NO ACTION);"; public DBHelper(Context context) { dbOpenHelper = new DBOpenHelper(context, DATABASE_NAME, DATABASE_VERSION); establish(); } // =========================================================== // Inner class // =========================================================== public class DBOpenHelper extends SQLiteOpenHelper { public DBOpenHelper(Context context, String name, int version) { super(context, name, null , version); } @Override public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) { Log.w(DBHelper.class.getName(),"Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); database.execSQL("DROP TABLE IF EXISTS tuser"); database.execSQL("DROP TABLE IF EXISTS tbuilding"); database.execSQL("DROP TABLE IF EXISTS tfloor"); database.execSQL("DROP TABLE IF EXISTS techtree"); onCreate(database); } @Override public void onCreate(SQLiteDatabase database) { database.execSQL(CREATE_TUSER); database.execSQL(CREATE_TBUILDINDG); database.execSQL(CREATE_TFLOOR); database.execSQL(CREATE_TECHTREE); // ==================================== // DBBuildings // ==================================== database.execSQL("INSERT INTO tbuilding (type, 137
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
pstruct, pstructmax) VALUES ('Colmena',0, 35)");
database.execSQL("INSERT INTO tbuilding (type, pstruct, pstructmax) VALUES ('Baliza',0, 35)"); // Se omiten el resto de operaciones } @Override public void onOpen(SQLiteDatabase db) { super.onOpen(db); } } private void establish() { if(db==null) { db = dbOpenHelper.getWritableDatabase(); } } public void cleanup() { if(db!=null) { db.close(); db = null; } } // =========================================================== // Building dbActions // =========================================================== public void insertBuilding(Building building) { ContentValues values = new ContentValues(); values.put("type", building.getType()); values.put("pstruct", building.getStructuralPoints()); values.put("pstructmax", building.getMaxStructuralPoints()); db.insert(tbuilding, null, values); } // Se omiten el resto de operaciones
Tenemos varias constantes que definen los valores estáticos relacionados con la base
de datos como le nombre, la versión y los nombres de las tablas, además de especificar
las columnas de todas las tablas y las diferentes querys estáticas que podrán realizarse.
La clase interna BBOpenHelper amplia SQLiteOpenHelper, una clase proporcionada por
Android para ayudar a la creación, actualización y apertura de la base de datos
[DBOAPI12]. En esta clase se incluyen los métodos de retro llamada SQLiteOpenHelper,
138
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
en especial, onCreate y onUpgrade. Tras crear una instancia interna de BBOpenHelper
en el constructor si se detecta que la versión de la base de datos es superior a la que se
tiene, se invocan estos dos métodos que actualizan la información. Por último se
establece la conexión.
Ya sólo queda realizar las peticiones necesarias a través de los métodos necesarios,
como insertBuilding. Se omite la implementación del resto por redundancia.
7.2 CombatActivity
La creación de la Activity carece de un interés especial, pues al igual que la Activity
anterior hereda de SimpleGameBase, Activity y sigue las mismas pautas y código para
ejecutarse, con una excepción, la orientación de la pantalla a apaisado, estableciendo la
opción en la clase EngineOptions.
EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, new RatioResolutionPolicy(WIDTH, HEIGHT), camera); La clase dispone a su vez de dos Stream de entrada y de salida para recibir y enviar
información al servidor. Una vez establecida la Activity y la conexión, sólo queda
determinar el código para la clase Emisary.
Listado 24
public class Emisary { private String name; private int tipElem; private int level; private int exp; private HashMap attrib; private ArrayList attack; public Emisary(String name, int tipElem, int level, int exp, HashMap attrib, ArrayList attack) { this.name = name; this.tipElem = tipElem; this.level = level; this.exp = exp; this.attrib = attrib; this.attack = attack; } public String getName() { 139
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
} return name; } public void setName(String name) { this.name = name; } public int getLevel() { return level; } public void setLevel(int level) { this.level = level; } public int getExp() { return exp; } public void setExp(int exp) { this.exp = exp; } public HashMap getAttrib() { return attrib; } public void setAttrib(HashMap attrib) { this.attrib = attrib; } public ArrayList getAttack() { return attack; } public Object getAttack(int index) { return attack.get(index); } public void setAttack(ArrayList attack) { this.attack = attack; } public int getTipElem() { return tipElem; } public void setTipElem(int tipElem) { this.tipElem = tipElem; } Los detalles sobre cada elemento han sido especificados en el apartado de diseño. En la
estructura HashMap attrib es donde se almacena la información especificada en
forma de atributos fuerza, defensa y velocidad. Cada emisario dispone de un array de
cuatro posiciones con cuatro ataques distintos, su implementación es.
Listado 25
public class Attack { private String name; 140
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
}
private int tipElem; private HashMap effects; public Attack(String name, int tipElem, HashMap effects) { this.name = name; this.tipElem = tipElem; this.effects = effects; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getTipElem() { return tipElem; } public void setTipElem(int tipElem) { this.tipElem = tipElem; } public HashMap getEffects() { return effects; } public void setEffects(HashMap effects) { this.effects = effects; } Al igual que la clase emisario, la estructura HashMap effects dispone de los atributos
que confeccionan el ataque, estos son fuerza, precisión y velocidad.
El servidor dispone de esta información para calcular los resultados de los turnos del
combate.
141
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
7.3 Servidor
El servidor posee dos algoritmos críticos para la experiencia de juego. Por un lado
realiza el control periódico de la posición de todos los jugadores, actualizando y
comunicación de la información en tiempo real, por lo que el algoritmo debe ser muy
eficiente y optimizado. Y por otro lado comunica dos jugadores que se estén
enfrentando y ejecuta la lógica del combate.
7.3.1
Algoritmo de localización
El algoritmo de localización basa al cálculo de las distancias calculando la separación
como el módulo o longitud del vector que separa los puntos en los que se encuentran
los jugadores.
Para el caculo de esta distancia se emplea la fórmula clásica.
,
Siendo JxLat la latitud del jugador X, JyLat la latitud del jugador Y, LxLon la longitud del
jugador X y JyLon la longitud del jugador Y.
El empleo de está fórmula concreta calcula la distancia a través de la tierra, no teniendo
en cuenta el hecho de que la tierra es redonda por la complejidad extra que añadiría a
los cálculos [GLDI07]. El uso de esta fórmula tiene otra ventaja y es disminuir
drásticamente el tiempo de cálculo a favor de la rapidez del algoritmo, que va a tener
que ser recalculado cada pocos segundos.
. Pero esto no supone ningún problema. A escalas tan pequeñas, sólo de unos pocos
metros, el error que se comete es ínfimo en comparación. Y jugadores muy alejados
como para que la curvatura sea suficiente nunca van a ser considerados como
cercanos.
Una vez se dispone de la información de localización con la latitud y la longitud de los
jugadores, se calculan las distancias teniendo en cuenta la simetría de la matriz,
realizando solamente las operaciones de la diagonal superior, ahorrando todavía más
tiempo al proceso de cálculo.
142
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Una vez se depone de la información calculada, es determinan las distancias que son
inferiores al umbral de los 25 metros, considerando que esos jugadores se encuentra
cercanos entre sí, como se muestra a continuación en una simulación de ejemplo.
Ilustración 37 - Localización de jugadores
Después de calcular las distancias, se han determinado los jugadores cercanos
(marcados en rojo), el servidos procede entonces a mandar la lista de jugadores a cada
terminal.
143
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
7.3.2
Combate entre jugadores
La lógica de combate es responsabilidad del servidor, encargado de centralizar el
combate y aplicar la lógica del enfrentamiento. A continuación se muestra el código
referente al combate.
Listado 26
public class CombatThread extends Thread
{ private int turn; private Socket userS1; private Socket userS2; private User user1; private User user2; private Emisary emisary1; private Emisary emisary2; private ObjectInputStream oisS1; private ObjectInputStream oisS2; private ObjectOutputStream oosS1; private ObjectOutputStream oosS2; public CombatThread(Socket userS1, Socket userS2, User user1, User user2, Emisary emisary1, Emisary emisary2, ObjectInputStream oisS1, ObjectInputStream oisS2, ObjectOutputStream oosS1, ObjectOutputStream oosS2) { this.userS1 = userS1; this.userS2 = userS2; this.user1 = user1; this.user2 = user2; this.emisary1 = emisary1; this.emisary2 = emisary2; this.oisS1 = oisS1; this.oisS2 = oisS2; this.oosS1 = oosS1; this.oosS2 = oosS2; } public void run() { Random rnd = new Random(); while(Integer.parseInt(emisary1.getAttrib().get("vida").toString()) > 0 || Integer.parseInt(emisary1.getAttrib().get("vida").toString()) > 0) { try { int a1 = oisS1.readInt(); 144
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
int a2 = oisS2.readInt();
Attack attack1 = (Attack) emisary1.getAttack(a1); Attack attack2 = (Attack) emisary2.getAttack(a2); //Determinar el turno float prob = Float.parseFloat(emisary1.getAttrib().get("velocidad").toString()) * Float.parseFloat(attack1.getEffects().get("velocidad").toString()) /( Float.parseFloat(emisary1.getAttrib().get("velocidad").toString()) * Float.parseFloat(attack1.getEffects().get("velocidad").toString()) + Float.parseFloat(emisary2.getAttrib().get("velocidad").toString()) * Float.parseFloat(attack2.getEffects().get("velocidad").toString())); if(rnd.nextFloat()%100 < prob) turn = 1; else turn = 2; //Calculo del daño float str1 = Integer.parseInt(emisary1.getAttrib().get("fuerza").toString()) + Integer.parseInt(emisary1.getAttrib().get("loc_elem").toString()) + Integer.parseInt(attack1.getEffects().get("fuerza").toString()); if(emisary1.getTipElem() == attack1.getTipElem()) str1 *= 1.5; float str2 = Integer.parseInt(emisary2.getAttrib().get("fuerza").toString()) + Integer.parseInt(emisary2.getAttrib().get("loc_elem").toString()) + Integer.parseInt(attack2.getEffects().get("fuerza").toString()); if(emisary2.getTipElem() == attack2.getTipElem()) str2 *= 1.5; //Calculo de la defensa float def1 = (float) (Integer.parseInt(emisary1.getAttrib().get("defensa").toString()) + Integer.parseInt(emisary1.getAttrib().get("loc_elem").toString()) * 0.4); float def2 = (float) (Integer.parseInt(emisary2.getAttrib().get("defensa").toString()) + Integer.parseInt(emisary2.getAttrib().get("loc_elem").toString()) 145
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
* 0.4);
float dam1 = str1 ‐ def2; if(dam1<0) dam1 = 0; float dam2 = str2 ‐ def1; if(dam2<0) dam2 = 0; if(turn == 1) { emisary2.getAttrib().put("vida", Integer.parseInt(emisary2.getAttrib().get("vida").toString()) ‐ dam1); if(Integer.parseInt(emisary2.getAttrib().get("vida").toString()) > 0) { //Jugador 2 NO derrotado emisary1.getAttrib().put("vida", Integer.parseInt(emisary1.getAttrib().get("vida").toString()) ‐ dam2); } } else { emisary1.getAttrib().put("vida", Integer.parseInt(emisary1.getAttrib().get("vida").toString()) ‐ dam2); if(Integer.parseInt(emisary1.getAttrib().get("vida").toString()) > 0) { //Jugador 2 NO derrotado emisary2.getAttrib().put("vida", Integer.parseInt(emisary2.getAttrib().get("vida").toString()) ‐ dam1); } } //Comprobar victoria if(Integer.parseInt(emisary1.getAttrib().get("vida").toString()) < 0) { //Victoria jugador 2 oosS2.writeObject(CombatResults.WINNER); oosS1.writeObject(CombatResults.LOSER); } else if(Integer.parseInt(emisary2.getAttrib().get("vida").toString()) < 0) { //Victoria jugador 1 oosS1.writeObject(CombatResults.WINNER); oosS2.writeObject(CombatResults.LOSER); } 146
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
} } } } catch (IOException e) { e.printStackTrace(); } El bucle principal del combate valora si alguno de los emisarios dispone de una vida
inferior a cero a causa de los ataques, en caso contrario, el combate continúa.
El primer paso es recibir los ataques que han elegido los jugadores desde la aplicación
móvil. Esta sólo enviará un índice entre 1 y 4 que indica el número de ataque realizado
de los 4 disponibles en cada emisario.
El primer cálculo es realizar el orden del turno en que los emisarios actuaran. Disponer
del turno implica tacar antes que el oponente, brindándose la oportunidad de acabar con
el oponente sin darle opciones de responder.
El cálculo se realiza en relación a las velocidades de ambos, según la fórmula:
1
1
2
Si prov. es menor que un número aleatorio entre 0 y 100, el turno lo obtendrá el
jugador1, el turno lo obtendrá el jugador2 en caso contrario.
Una vez determinados los turnos, es necesario calcular la cantidad de daño bruto que
producen ambos emisarios con sus ataques, siendo el daño el que se va a restar
directamente a la vida de su oponente. Para el cálculo del daño se toma como base la
fuerza del emisario, sumando el beneficio por clima y la fuerza del ataque elegido. Para
el cálculo de la defensa se suma el atributo de defensa del emisario más el bonificador
por localización, multiplicando la cantidad por 0.4.
El daño total que va a realizarse se calcula restando la fuerza del ataque con la defensa
de su oponente. En caso de que la defensa sea mayor que el ataque, el daño se anula.
El último paso es restar los daños causados en los emisarios con los datos calculados,
controlando si la vida de alguno de los emisarios desciende por debajo de cero. En ese
147
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
caso se determina como vencedor el jugador cuyo emisario aún disponga de un valor
de vida superior a cero, comunicando el resultado a los jugadores y acabando el
combate.
Si ninguno de los dos ha sido aún derrotado, ambos son informados de la vida que les
resta y el combate continúa hasta que alguno de los dos sea derrotado al fin.
148
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
8
Trabajos futuros y
conclusiones
149
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
150
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
8 Trabajos futuros y conclusiones
8.1 Trabajos futuros
La posibilidad de hacer crecer un juego, especialmente un MMROPG, puede ser
prácticamente infinito. La cuestión de diseño permite tanto pequeñas modificaciones
como grandes cambios estructurales que amplíen la experiencia y complejidad.
Desde el punto de vista de jugabilidad, siempre es sencilla la incorporación de nuevos
edificios y plantas ampliando las posibles estrategias, además de añadir nuevos
emisarios y ataques disponibles. Un gran cambio sería modificar el combate para poder
manejar dos emisarios por jugador en lugar de uno, ampliando aún más si cabe la
importancia de una buena estrategia de cara a un enfrentamiento. Además de introducir
nuevos atributos tanto en los emisarios como en los ataques que aumenten la
complejidad del mismo.
Desde el punto de vista social, la aplicación dispone de un gran potencial. Es posible
permitir a los jugadores a los jugadores la libre asociación a través de alianzas y
comercio, abriendo una vía para las interrelaciones más complejas y profundas más allá
de las planteadas inicialmente por el juego.
Otro gran cambio social es añadir la posibilidad de comunicación online sin importar la
distancia. Es interesante primero discutir las implicaciones reales a la localización que
esta aportación significaría, pero manejada con cierto cuidado puede generar un gran
incentivo.
Desde el punto de vista gráfico, la aplicación no ha contado con verdaderos expertos en
la materia. Por lo que incluir un gran dibujante daría un salto cualitativo visual
importante.
151
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
8.2 Conclusiones
No cabe duda que el desarrollo de un videojuego es altamente gratificante para un
programador por dos claros motivos. Primero, es un autentico reto tecnológico que
necesita de gran dedicación para llevarse a cabo muy por encima de muchos
desarrollos, especialmente si la aplicación cuenta con una cantidad de gráficos
complejos muy elevada. Segundo, es emocionante saber desde el primer momento en
que se piensa en cómo abordar la aplicación, que el objetivo principal es divertir. Todo
esfuerzo, dedicación e idea que se quiera plasmar no sirve si no aporta una mejora en la
diversión del jugador.
El crecimiento de los smartphones en general y de los sistema Android en particular
están experimentando un crecimiento masivo en los últimos años, ostentando el
merecido reconocimiento de ser, junto a IOS de la empresa Apple, la tecnología que más
rápidamente ha sido adaptada en la sociedad [PTIC12], especialmente con la entrada de
los mercados asiáticos al mercado global.
Ilustración 38 – Top de países con mayor número de Smartphones
Otro aspecto importante del sistema Android es que su aplicación no está limitada
únicamente a sistemas de telefonía. Recientemente se ha presentado a la sociedad la
primera consola de sobremesa con núcleo Android, conocida como OUYA, que ha
recibido un apoyo inesperado por parte del público, hasta el punto de obtener mediante
152
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
su campaña de financiación kickstarter 8.500.000$ de los 950.000$ originalmente
solicitados.
Ilustración 39 – Consola OUYA y mando de control OUYA
Esta consola abre un mundo de posibilidades inmenso a los desarrolladores al poder
ofrecer desarrollos paralelos entre dispositivos táctiles y una consola que hace uso de
un mando de control tradicional, muy demandado por la mayoría de consumidores de
videojuegos por su comodidad en contrapartida con la versión táctil. Además pone a
disposición tanto de consumidores como de desarrolladores de un sistema con un
hardware a la vanguardia de la tecnología actual.
Andengine se presenta como un framework complejo cuya API sólo se ha rozado en el
desarrollo. Sin duda el estudio y aplicación de sus capacidades y extensiones van a ser
muy tenidas en cuenta en futuros desarrollos para juegos en Android.
Tecnológicamente, trabajar con Android realmente permite hacerse a la idea del
potencial que tiene como plataforma. Un número cada vez mayor de personas disponen
hoy día de un smartphones que llevan a diario con ellos, abriendo un abanico de
posibilidades abrumadoras. Sin olvidar todas las periféricos adicionales al puro proceso
de computación del móvil cómo GPS, acelerómetro, WiFi, 3G, cámara, etc. Sin lugar a
dudas, la informática y la programación tienen un brillante futuro en esta rama de
investigación y desarrollo.
153
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
154
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
9
Estudio
económico
155
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
156
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
9 Estudio económico
9.1 Personal
Una vez se han definido el conjunto de perfiles necesarios detallados en el plan de
gestión de proyecto (ver Anexo A, apartado 2), se va a estimar los costes de personal del
proyecto. Cada perfil tendrá una tarifa asociada necesario para calcular el gasto total a
computar.
Nº de horas(h) Tarifa hombre/hora (€/h)
Total(€)
Coordinador
5
70
350 €
Director
18
60
1.080 €
Jefe proyecto
45
50
2.250 €
Analista
55
45
2.475 €
Diseñador
35
40
1.400 €
Diseñador gráfico
30
20
600€
Programador
155
30
4.650 €
Total Personal
343
12.805 €
Tabla 20 - Horas/Personal
Para poder desarrollar este proyecto hace falta que exista un coordinador de proyectos
que cobre una tarifa de 70 € la hora, luego hay falta un director de proyecto que
certifiquen y validen el trabajo realizado, cada uno cobre una tarifa de 60€,
posteriormente hace falta la presencia de un Jefe de proyecto que debe planificar las
reuniones con los directores y supervise el trabajo de los demás integrantes del grupo
de trabajo, su tarifa es de 50 €, el siguiente será una Analista que está a cargo de
análisis del problema y de la supervisiones del trabajo de los programadores, su tarifa
es de 45 €, el siguiente será un diseñador encargado de realizar todos los aspectos
técnicos y de jugabilidad que forman parte del juego, su tarifa es de 40 € y por último el
equipo de trabajo estará formado por un diseñador gráfico que realice todos los gráficos
del juego con una tarifa de 20 y programador que codifique toda la plataforma en el
lenguaje seleccionado, su tarifa es de 30 €. Estas tarifas multiplicadas por las horas que
realiza cada uno, da un total de 12.805 € en gasto de personal.
157
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
9.2 Hardware
Para poder implementar la plataforma es necesario adquirir un conjunto de máquinas u
ordenadores. Al tratarse de una aplicación cliente servidor, será necesaria la aportación
de de un servidor con una disponibilidad de 24x7.
Servidor
Se detallan las especificaciones del modelo elegido como servidor para la aplicación.
HP ProLiant ML110 G6 X3430/1GB/250GB
Ilustración 40 - Servidor de aplicaciones
Procesador
Intel Xeon 3430, 2.40GHz, 8MB Cache
Memoria
1GB Memory DDR3 PC3-10600E
Sistema Operativo
Linux Ubuntu Server Edition.
Disco Duro
1 x SATA 3.5 NHP 7.200rpm 250GB
Tarjeta de Red
NC107i PCI-Express Gigabit Ethernet Integrated
Tabla 21 - Especificaciones del servidor
Se ha escogido este modelo por proporcionar una solución asequible y funcional,
facilitando una solución inicial ideal sin limitar la capacidad de crecimiento futuro con
las ranuras de expansión que el propio servidor pone a disposición del equipo,
especialmente en requerimientos de memoria principal que necesitan soportar el
algoritmo de localización. Es necesaria la aportación de un segundo servidor, ambos
conectados a la misma red para la redundancia del servidor con objetivo de mitigar
fallos en caso de caída de uno de los servidores y garantizar un servicio 24x7.
158
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Switch
Se detallan las especificaciones del modelo elegido para interconectar los múltiples
servidores que soportan el servicio.
Netgear Mini Switch Ethernet Gigabit 8 puertos 10/100/1000 Mb GS108
Ilustración 41 - Switch
Cantidad de puertos
8 x Ethernet 10Base-T
Ethernet 100Base-TX
Ethernet 1000Base-T
Velocidad de transferencia
1.06 Gbps
Protocolo de interconexión
Ethernet, Fast Ethernet, Gigabit Ethernet
Tabla 22 - especificaciones del switch
La velocidad soportada por el switch permite la duplicación a gran velocidad de los
datos de un servidor a otro en tiempo real sin comprometer las necesidades de ancho
de banda para las conexiones que provengan del exterior. Además el dispositivo aporta
suficientes puertos para garantizar una futura incorporación de nuevos servidores de
aplicación o la inclusión de servidores dedicados a la base de datos.
159
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Router
Se detallan las especificaciones del modelo elegido para la conexión de la red interna
con el exterior.
Linksys WRT54GL Wireless Router Neutro 54Mbps Linux
Ilustración 42 - Router de salida
Velocidad
54 Mbps
Seguridad
PSK, WEP - 128-bit, WEP - 64-bit, WPA,
WPA2
Protocolo de trasmisión
IEEE 802,3, IEEE 802.CÚ, IEEE 802.11B,
IEEE 802.11G
Tabla 23 - Especificaciones del router
El último dispositivo necesario para la configuración de la red de servidores. Este router
permite la interconexión de la red interna con el exterior, comunicando los servidores
con los clientes. Además tiene el segundo propósito de permitir a un pequeño equipo de
desarrollo o de mantenimiento compartir la red para el trabajo y acceso a Internet,
garantizando el ancho de banda necesario.
160
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Inventario
Unidad
Precio (€)
HP ProLiant ML110 G6 X3430/1GB/250GB
315,00 €
HP ProLiant ML110 G6 X3430/1GB/250GB
315,00 €
Linksys WRT54GL Wireless Router Neutro 54Mbps Linux
44,95 €
Netgear Mini Switch Ethernet Gigabit 8 puertos 10/100/1000 Mb GS108
50,81 €
Total
725,76 €
Tabla 24 - Inventario
9.3 Coste del proyecto
En la siguiente tabla se muestra una tabla resumen con todos los costes asociados al
desarrollo de este proyecto, se ha realizado un análisis de los costes de recursos
humanos, diferenciando que tipos de perfiles son necesarios, también se ha realizado
un análisis de las maquinas en las que se implementará la aplicación.
Tipo
Coste (€)
Personal
12.805,00 €
Hardware
725,76 €
Total
13.530,00 €
Tabla 25 - Coste del proyecto
Por lo tanto el coste final del proyecto asciende 13.530,00 €.
161
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
162
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Anexo A
Plan de gestión
del proyecto
163
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
164
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Anexo A.
Plan de gestión del
proyecto
Realizar un plan de gestión de proyecto permitirá de manera fiable estimar cubre todos
los aspectos relacionados con la gestión del proyecto.
1 Resumen del proyecto
El objetivo de este proyecto es la programación de un MMORPG basado en localización
para el sistema móvil Android de Google.
9.4 Estructura de división del trabajo
A continuación se muestra la estructura de división del trabajo completa que forma
parte de la aplicación.
165
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Ilustración 43 - estructura de división del trabajo
9.5 Descripción de paquetes de trabajo
Descripción de cada uno de los paquetes de trabajo aparecidos en la estructura de
división del trabajo.
Nombre del paquete
Cliente/servidor
Índice de la actividad
A1.1.1
Responsable/s
Antonio Rodríguez López
Horas asignadas
50
Entradas
Cuaderno de desarrollo
Procesos
Elaborar Clases Cliente Android
Elaborar Clases Servidor
Clases comunicación Cliente/Servidor
Clases tratamiento XML
Incluir AndEngine proyecto Cliente
Salidas
Proyecto AndEngine incluido
166
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Clases Cliente
Clases servidor
Herramientas
Servidor lenguaje Java
Cliente Lenguaje Java Android
Android API
AndEngine API
Nombre del paquete
Geolocalización
Índice de la actividad
A1.1.2
Responsable/s
Antonio Rodríguez López
Horas asignadas
55
Entradas
Cuaderno de desarrollo
Android API
Procesos
Geolocalizar maquina cliente
Realizar clases para la geolocalización
Integrar la geolocalización con AndEngine
Comunicación con Google Places y Weather Underground
Salidas
Clases para la geolocalización
Herramientas
Cliente Lenguaje Java Android
Android API
AndEngine API
Nombre del paquete
Lógica de la base
Índice de la actividad
A1.1.3
Responsable/s
Antonio Rodríguez López
Horas asignadas
65
Entradas
Cuaderno de desarrollo
Documento de diseño
Android API
Procesos
Elaborar las clases de localización
Elaborar las clases de tratamiento de la información e
167
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
localización
Salidas
Clases necesarias para la localización incluida en el paquete
localition
Herramientas
Android API
GPS Android
Nombre del paquete
Lógica combate jugador-jugador
Índice de la actividad
A1.1.4
Responsable/s
Antonio Rodríguez López
Horas asignadas
35
Entradas
Cuaderno de desarrollo
Documento de diseño
Android API
Procesos
Elaborar las clases con la lógica de combate jugadorjugador
Salidas
Clases necesarias para el combate jugador-jugador
Herramientas
Android API
Andengine API
Nombre del paquete
Fondos
Índice de la actividad
A1.2.1
Responsable/s
Antonio Rodríguez López
Horas asignadas
20
Entradas
Documento de diseño
Procesos
Elaborar las imágenes de los fondos de la aplicación.
Salidas
Imágenes de los fondos de la aplicación
Herramientas
Inkscape
GIMP 2
168
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Nombre del paquete
Personajes
Índice de la actividad
A1.2.2
Responsable/s
Antonio Rodríguez López
Horas asignadas
10
Entradas
Documento de diseño
Procesos
Elaborar las imágenes de los personajes de la aplicación.
Salidas
Imágenes de los personajes de la aplicación
Herramientas
Inkscape
GIMP 2
Nombre del paquete
Sistema de juego
Índice de la actividad
A1.3.1
Responsable/s
Antonio Rodríguez López
Horas asignadas
15
Entradas
Lista de requisitos
Procesos
Elaborar la sección del documento de diseño referente al
sistema de juego
Salidas
Sección de sistema de juego del documento de diseño
Herramientas
N/A
Nombre del paquete
Diseño de la base
Índice de la actividad
A1.3.2
Responsable/s
Antonio Rodríguez López
Horas asignadas
10
Entradas
Lista de requisitos
Procesos
Elaborar la sección del documento de diseño referente al
diseño de la base
Salidas
Sección del diseño de la base del documento de diseño
Herramientas
N/A
169
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Nombre del paquete
Diseño de personajes
Índice de la actividad
A1.3.3
Responsable/s
Antonio Rodríguez López
Horas asignadas
5
Entradas
Lista de requisitos
Procesos
Elaborar la sección del documento de diseño referente al
diseño de personajes
Salidas
Sección del diseño de personajes del documento de diseño
Herramientas
N/A
Nombre del paquete
Sistema de combate
Índice de la actividad
A1.3.4
Responsable/s
Antonio Rodríguez López
Horas asignadas
5
Entradas
Lista de requisitos
Procesos
Elaborar la sección del documento de diseño referente al
sistema de combate
Salidas
Sección del sistema de combate del documento de diseño
Herramientas
N/A
Nombre del paquete
Documentación
Índice de la actividad
A3
Responsable/s
Antonio Rodríguez López
Horas asignadas
35
Entradas
Clases codificadas
Ejecutable del juego desarrollado
Anexo B
Lista de requisitos
Procesos
Elaborar la documentación del proyecto
Salidas
Documentación del proyecto
Herramientas
N/A
170
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
10 Equipo de trabajo
Detalle de la estructura organizativa del personal asignado para el proyecto.
10.1
Organigrama del equipo de trabajo
En este árbol se detallan los puestos que serán necesarios para completar el proyecto,
descendiendo en su nivel jerárquico. Un nivel inferior indica que el puesto superior será
responsable del inferior, y una línea horizontal indica que el puesto sirve como ayuda o
“staff” del superior, sin tener que ser responsable jerárquico del mismo.
Alfonso Villar Chicharro
Director de Proyecto
David Contreras Bárcenas
Coordinador de proyecto
Antonio Rodríguez López
Jefe de proyecto
Antonio Rodríguez López
Diseño
Antonio Rodríguez López
Diseño Gráfico
Antonio Rodríguez López
Analista
Antonio Rodríguez López
Programador
Ilustración 44 - Equipo de trabajo
171
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
10.2
Descripción de puestos de trabajo
En este apartado se describirá de manera detallada cada uno de los perfiles mostrados
en el organigrama. La descripción está dividida en el código usado para las
responsabilidades a nivel general que ostenta, las horas asignadas, una descripción
detallada y las habilidades requeridas para desempeñar el puesto.
Nombre del puesto
Director de proyecto
Responsabilidades
Correcta asignación de recursos y supervisión general
Descripción
Es el último responsable del proyecto. Será el encargado de aprobar el plan de proyecto
y controlar el seguimiento de los hitos.
Sus tareas principales serán:
Coordinación de las unidades organizativas y supervisión del trabajo realizado
Apoyo al Jefe de Proyecto.
Comprobación del cumplimiento de plazos.
Su labor principal consistirá en el aseguramiento de que los recursos del proyecto son
asignados de forma razonable y eficaz, garantizando el cumplimiento correcto de los
objetivos marcados como hitos para el desarrollo del proyecto. Debe tener
conocimientos probados de gestión y amplia experiencia en el sector del proyecto.
172
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Nombre del puesto
Responsabilidades
Jefe de proyecto
Elaboración del plan del proyecto y coordinar efectivamente la
totalidad del proyecto
Descripción
Es el responsable principal de la correcta ejecución del proyecto. Tendrá a su cargo al
personal necesario para poder construir el proyecto pedido, y la mayoría de los
entregables finales serán responsabilidad suya. Su primera labor será elaborar el plan
general de proyecto y entregárselo al cliente, y una vez aceptado, vigilará que todo
marche correctamente elaborando informes de situación periódicos.
Aparte de las labores mencionadas, será responsabilidad suya:
Controlar el nivel de cumplimiento de los objetivos del proyecto
Cumplimiento de la metodología establecida en el plan de proyecto
Se encargará asimismo de coordinar al analista y al asesor legal de manera directa, ya
que los programadores están bajo la responsabilidad de los analistas. Su labor consiste
en ajustar todo lo posible el desarrollo del proyecto al planificado en el PGP, y justificar
las posibles desviaciones que aparezcan.
Es necesario que tenga elevada experiencia en la gestión de proyectos y de equipos, ya
que deberá ser capaz de resolver conflictos interpersonales y reconocer riesgos que
puedan afectar al éxito del proyecto.
Asimismo, debe ser capaz de tener una política de comunicación abierta, para que cada
participante pueda expresar su opinión; pero a la vez imponer la autoridad que ostenta
dentro del proyecto citado. La reducida duración del proyecto hace que sea necesario
un estricto control del cumplimiento de objetivos, y una medición exhaustiva de las
desviaciones.
173
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Nombre del puesto
Analista
Responsabilidades
Diseño del sistema, módulos y sub-módulos de la aplicación
Descripción
Los analistas serán los encargados de pasar a diagramas, pseudocódigo, etc.
adecuados a los requerimientos del proyecto. Diseñarán una solución que cumpla con
los requisitos y la plasmarán en un lenguaje más cercano al puro código. Asimismo,
evaluarán las distintas opciones para implementar la solución diseñada.
Sus tareas principales, de manera forma, serán:
Diseño del sistema, dividido en dos subtareas:
Modelo Conceptual del sistema
Modelo funcional del sistema
Coordinación del trabajo realizado por cada uno de los programadores asignados
Nombre del puesto
Programador
Responsabilidades
Construcción de la solución diseñada por los analistas
Descripción
Será el encargado de construir el código necesario para que la aplicación se ponga en
marcha. Una vez diseñado el sistema por parte de los analistas, ellos serán los que
pasarán las especificaciones al código fuente final, y se asegurarán de que el sistema
cumple los requisitos para los que fue diseñado.
Formalmente, su labor consiste en:
Creación del código fuente final
Probar el código
Crear un manual de usuario
En la aplicación a desarrollar, los perfiles se especializan: cada programador será
174
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
responsable del desarrollo de una de las secciones de la aplicación, tanto servidor como
aplicación móvil. Deberán conocer a fondo el lenguaje en el que se determine el
desarrollo de la plataforma. Asimismo es conveniente (aunque no necesario) haber
realizado algún proyecto previo que implicara el desarrollo de un área como la que va a
estar encargado cada uno de ellos.
Nombre del puesto
Diseñador gráfico
Responsabilidades
Construcción de los gráficos y arte del juego
Descripción
La labor de los artistas es crear los gráficos que tiene el juego, los elementos visuales y
sonoros que el usuario percibe. El diseño artístico deberá atenerse a los requisitos de
arte definidos, siendo labor de los programadores la integración final de los diseños en
la aplicación.
Este perfil es el más creativo al crear tanto los gráficos como la música y los efectos de
sonido que acompañan el juego. Es necesario tener una formación artística y un gran
talento para poder desarrollar bien estos elementos siendo necesarios conocimientos
avanzados de diseño asistido por ordenador y de dibujo vectorial.
Nombre del puesto
Diseñador
Responsabilidades
Construcción de los gráficos y arte del juego
Descripción
La labor del diseñador es definir los aspectos que relacionan al usuario con el juego, que
posteriormente necesitan hacerse realidad a manos de los artistas y los
programadores.
Es el encargado de definir cómo van a ser todos los aspectos y trasfondo, junto con la
manera en la que se juega. Define el estilo de juego y el sistema de juego, la curva de
dificultad, los personajes, la historia, escenarios y los niveles, etc. Aspectos que tienen
un impacto directo en la valoración del juego por parte del usuario.
175
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
11 Planificación
Reparto de horas asignadas para la realización de cada paquete de actividades.
Diseñador
Diseñador Gráfico
Programador
Total
Analista
horas/actividad
Jefe proyecto
[A1.1.1]
0
20
0
0
35
55
[A1.1.2]
0
15
0
0
40
55
[A1.1.3]
0
10
0
0
55
65
[A1.1.4]
0
10
0
0
25
35
[A1.2.1]
0
0
0
20
0
20
[A1.2.2]
0
0
0
10
0
10
[A1.3.1]
0
0
15
0
0
15
[A1.3.2]
0
0
10
0
0
10
[A1.3.3]
0
0
5
0
0
5
[A1.3.4]
0
0
5
0
0
5
[A3]
45
0
0
0
0
35
Horas/persona
45
55
35
30
155
320
Tabla 26 - Planificación
Se ha tomado la decisión de que se utilizase la metodología ágil Scrum para el control
de la planificación del proyecto. La propia metodología Scrumm otorga el diagrama de
burndown o quemado que indica de una forma global el progreso total de proyecto
como una suma del porcentaje finalizado de cada una de las pequeñas tareas que se
han proyectado he indicado el los paquetes de trabajo. Midiendo el proceso de
desarrollo en Sprints de una semana de duración Al comenzar cada Sprint, se determina
el índice de avance de cada paquete y se realiza un estudio determinado para qué
aspectos concretos pueden mejorarse o ya cuentan con una complejidad e índice de
desarrollo adecuada.
176
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Ilustración 45 - Ejemplo diagrama de quemado de Pivotal Tracker
La herramienta usada para este fin es Pivotal Tracker. Esta aplicación web otorga una
potente herramienta que permite una gestión ágil fácil y rápida, siendo su mayor virtud
poder ser accedida desde cualquier lugar con conexión a Internet y que aporta todas las
herramientas necesarias para la gestión de los paquetes de trabajo, incluyendo
diagramas de quemado y posibilidad de trabajo en equipo.
177
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
178
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Bibliografía
[UPC12]
Facultat d'Informàtica de Barcelona, Historia de los videojuegos.
http://www.fib.upc.edu/retro-informatica/historia/videojocs.html
Ultimo acceso 26/08/2012
[CLA12]
Clarín-Revista de divulgación
http://www.clarin.com/internet/juegos-smartphones-mueven-dineroconsola_0_593340865.html-Último acceso 26/08/2012 - Ultimo acceso
26/08/2012
[Rapsoso12]
Raposo , Martín, Graduate School of Business-Centro de Investigación en
Entretenimiento y Medios-Universidad de Palermo
[TEVV11]
Tu experto en juegos, blog especializado
http://www.tuexpertojuegos.com/2010/03/24/los-videojuegos-venden-enespana-mas-que-el-cine-y-la-musica-juntos/-Ultimos acceso 26/08/2012
[WIKIMM12]
Wikipedia-
Videojuego
de
rol
multijugador
masivo
en
línea-
http://es.wikipedia.org/wiki/Videojuego_de_rol_multijugador_masivo_en_l%C3%
ADnea-Ultimo acceso 15/07/2012
[NEOT09]
N+ Neoteo ABC-Revista especializada.
http://www.neoteo.com/la-historia-de-juegos-de-rol-online-mmorpg-Último
acceso 20/08/2012
[SIONO10]
Sion
Dream.
Saltares,
David.
“Games
desing
and
programming”
http://siondream.com/blog/games/game-design-document/-Ultimo
acceso
26/08/2012
[Ableson11]
Ableson, Fran W., Sen, Rubi, King, Chris (2011) “Android Guia para
desarrolladores” Anaya
[GOAAPI12]
Android API, Google.Application fundamentals
http://developer.android.com/guide/components/fundamentals.html-Ultimo
179
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
Acceso 26/08/20112 Ultimo acceso 26/08/2012
[ANDAPI12]
Andengine GLES2 API, Nicholas Gramlich
https://github.com/nicolasgramlich/AndEngine
Ultimo acceso 26/08/20112
[IPCCVA12]
Institut Puig Castelar, “Android: Ciclo de vida de las actividades y otros detalles”
http://elpuig.xeill.net/Members/vcarceler/misc/android/ciclo-de-vida-de-lasactividades-y-otros-detalles-de-la-plataforma-Ultimo acceso 26/08/2012 Ultimo acceso 26/08/2012
[SQLIT12]
About SQLite, SQLite
http://www.sqlite.org/about.html - Ultimo acceso 26/08/2012
[ANDFO10]
Andengine Forum, Andengine comunity
http://www.andengine.org/forums/announces/andengine-gles2-pre-releaseon-december-23rd-t6097.html - Ulitmo acceso 26/08/2012
[GLES12]
Matim Development 2012.
https://sites.google.com/site/matimdevelopment/gles1-versus-gles2--comparison
[Zechner11]
Zechner, Mario (2011). “Desarrollo de juegos Android”, Anaya
[GPAP12]
Google Places API.
https://developers.google.com/maps/documentation/places/?hl=es – Ultimo
acceso 26/08/2012
[ANDBLG12]
Andengine Blog, Nicholas Gramlich
http://www.andengine.org/blog/ - Ultimo acceso 26/08/2012
[WUAP12]
Weather underground API.
http://www.wunderground.com/weather/api/d/docs
Último acceso 26/08/2012
[DBOAPI12].
DBOpenHelper, Android API
180
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI)
INGENIERO EN INFORMÁTICA
http://developer.android.com/reference/android/database/sqlite/SQLiteOpenH
elper.html
Ultimo acceso 26/08/2012
[GLDI07]
Franchu's Lair, GIS: Cálculo de distancias sobre la Tierra
http://blog.franchu.net/2007/11/16/gis-calculo-de-distancias-sobre-la-tierra/
- Ultimo acceso 26/08/2012
[PTIC12]
Portal TIC Revista especializada en las TIC
http://www.europapress.es/portaltic/sector/noticia-ios-android-experimentancrecimiento-mas-rapido-historia-tecnologia-20120829111322.html - Ultimo
acceso 30/08/2012
181
Descargar