Documento - Departament d`Enginyeria Informàtica i Matemàtiques
Transcripción
Documento - Departament d`Enginyeria Informàtica i Matemàtiques
Departament d’Enginyeria Informàtica i Matemàtiques Desarrollo de un juego de rol para Iphone TITULACIÓN: Ingeniería Técnica en Informática de Sistemas - ETIS AUTOR: Adnan Bašić Plevljaković DIRECTOR: Carlos Molina Clemente FECHA: Septiembre 2012. 2 Prefacio Actualmente la gran mayoría de personas posee un Smartphone. Estos teléfonos móviles no tienen ni punto de comparación con los que había antes. La gente no los usa solo para llamar o enviar mensajes SMS, sino que se han convertido en casi un ordenador de bolsillo. Disponen de múltiples funciones y aplicaciones. Hoy en día, ¿quién no ha jugado o no tiene algún juego en su Smartphone? Muchas compañías han visto este auge de los Smartphone y han decidido sacar sus aplicaciones para estos dispositivos móviles. Estas aplicaciones son muy variadas, desde videojuegos, redes sociales, aplicaciones fotográficas, compras on-line, y un largo etcétera. Visto el auge que tiene la creación de aplicaciones para Smartphone, decidí de crear una para mi proyecto final de carrera, se trata de una aplicación para iPhone. Esta aplicación en realidad es un videojuego, cuyo género es el rol. Este tipo de videojuegos tratan principalmente de explicar una historia en la cual tú eres el protagonista de ella, y en la que tienes que luchar contra enemigos de todo tipo, superar adversidades, razonar para lograr el objetivo, etc. En este videojuego, controlaremos a un personaje, el cual tendrá que hacer frente a una amenaza que asola al mundo. Tendrá que ir hablando con la gente que se vaya encontrando por el camino para que le guíen y le ayuden. Además en su aventura, nuestro protagonista tendrá que hacer frente a unos enemigos que le irán apareciendo. La misión de nuestro protagonista no será otra, que la de vencer al grupo de enemigos que amenazan al mundo de su destrucción. 3 4 ÍNDICE GENERAL 1 Objetivos del proyecto………………………………………………11 1.1. Los Sistemas Operativos para móviles…………………………………………11 1.1.1. iOS de Apple……………………………………………………………….12 1.1.2. Windows Phone 7………………………………………………………….13 1.1.2.1. Desarrollo de Software para Windows Phone 7:…………………13 1.1.3. Android…………………………………………………………………….14 2 Especificaciones del videojuego………………………………………15 2.1. Género……………………………………………………………………………15 2.2. Objetivo del videojuego…………………………………………………………15 2.3. Sistema de batalla………………………………………………………………..15 3 Diseño de la aplicación………………………………………………17 3.1. Pantalla inicial…………………………………………………………………...17 3.2. Menú principal…………………………………………………………………..17 3.3. El juego…………………………………………………………………………...17 3.4. Escenarios de batalla…………………………………………………………….18 3.5. Pantalla de finalización del juego………………………………………………19 3.6. Pantalla de “Game Over”……………………………………………………….19 3.7. Pantalla de instrucciones………………………………………………………..20 3.8. Pantalla de configuración del sonido…………………………………………...20 3.9. Pantalla de créditos……………………………………………………………...21 4 Desarrollo - Creación del videojuego………………………………...21 4.1. Selección de las imágenes………………………………………………………..21 4.2. Selección de los sonidos y canciones……………………………………………22 4.3. Creación del escenario……………………………………………………..……22 4.3.1. Creación de patrones……………………………………………………...22 4.3.2. Creación del conjunto de patrones y de las capas ……………………….23 5 4.4. Creación del menú principal……………………………………………………24 4.5. Creación del menú de opciones…………………………………………………25 4.6. Creación de la pantalla de instrucciones……………………………………….25 4.7. Creación de la pantalla de créditos……………………………………………..27 4.8. Inserción del escenario a la aplicación…………………………………………27 4.9. Posicionamiento del personaje en el escenario ………………………………..27 4.10. Testeo del movimiento del personaje mediante eventos touch y control de la cámara…………………………………....28 4.11. Testeo del movimiento del personaje mediante acelerómetro………...28 4.12. Inserción el menú del juego……………………………………………...29 4.12.1. Inserción del menú de estado del personaje……………………………...29 4.12.2. Inserción del menú de opciones de sonido y del acelerómetro…………..30 4.12.3. Inserción de las opciones para salir del juego……………………………31 4.13. Testeo del movimiento del personaje mediante joystick……………….32 4.14. Control de colisiones ……………………………………………………..32 4.15. Cambio de localización del personaje…………………………………...33 4.16. Inserción de NPCs en el escenario y preparación de los textos de los NPCs……………………………………………………………….35 4.17. Hablar con los NPCs……………………………………………………...36 4.18. Creación de los atributos de todos los personajes………………………37 4.19. Creación de las animaciones de batalla…………………………………37 4.19.1. Pasos previos ……………………………………………………………...37 4.19.2. Inserción de las imágenes animadas……………………………………...38 4.19.3. Secuencias de batalla……………………………………………………...39 4.19.3.1. Secuencia de ataque físico ……………………………………......39 4.19.3.2. Secuencia de ataque mágico………………………………………39 4.19.3.3. Secuencia de cura del personaje………………………………….40 4.19.3.4. Secuencia de derrota………………………………………………40 4.20. Creación de las batallas…………………………………………………..41 4.20.1. Actualización de la vida y “Psy” de los personajes……………………....41 4.20.2. Formas para salir del combate……………………………………………41 4.21. Creación de la pantalla de Game Over……………………………….…42 4.22. Creación de la pantalla de Fin del juego………………………………..42 6 5 Decisiones de diseño…………………………………………………..43 5.1. Limitaciones para crear el escenario…………………………………………...43 5.2. Menú principal…………………………………………………………………..43 5.3. Juego……………………………………………………………………………..44 6 Planificación temporal. ………………………………………………47 7 Conclusiones y mejoras ………………………………………………49 8 Recursos utilizados……………………………………………………51 8.1. Xcode…………………………………………………………………………......51 8.1.1. Historia………………………………………………………………….…51 8.2. Cocos2d…………………………………………………………………………..52 8.2.1. Implementación de Cocos2D en una aplicación…………………………52 8.3. Tiled Map Editor………………………………………………………………...54 8.3.1. Características……………………………………………………………..54 8.3.2. Mapas ortogonales e isométricos…………………………………………55 8.3.3. Tamaño de los tiles y mapas totalmente personalizable…………………56 8.3.4. Color clave y tilesets……………………………………………………….56 8.3.5. Capas de objetos…………………………………………………………...57 8.3.6. El formato TMX…………………………………………………………...58 8.4. VisualBoy Advance……………………………………………………………...58 8.5. Photoshop………………………………………………………………………...58 8.6. Zwoptex…………………………………………………………………………..59 8.7. Audacity………………………………………………………………………….59 9 Referencias……………………………………………………………61 7 8 ÍNDICE FIGURAS Figura 3.1. Pantalla inicial………………………………………………………………...17 Figura 3.2. Menú principal………………………………………………………………..17 Figura 3.3. Inicio del juego……………………………………………………………….18 Figura 3.4. Escenario de batalla…………………………………………………………..18 Figura 3.5. Fin del juego………………………………………………………………….19 Figura 3.6. Game Over……………………………………………………………………19 Figura 3.7. Instrucciones del juego……………………………………………………….20 Figuro 3.8. Opciones de sonido…………………………………………………………...20 Figura 3.9. Créditos……………………………………………………………………….21 Figura 4.6.a.Instrucciones para mover al personaje………………………………………26 Figura 4.6.b. Instrucciones para hablar con la gente……………………………………...26 Figura 4.6.c. Instrucciones para luchar en batalla………………………………………...26 Figura 4.12. Opciones del menú del juego………………………………………………..29 Figura 4.12.1. Menú estado del personaje………………………………………………..30 Figura 4.12.2 Comparativa de los menús de opciones……………………………………30 Figura 4.12.3.a. Opción para salir del juego sin guardar…………………………………31 Figura 4.12.3.b. Opción para salir del juego guardando es estado de la partida…………31 Figura 4.14. Capa Misc…………………………………………………………………...33 Figura 4.15.a. Vale………………………………………………………………………..33 Figura 4.15.b. Pradera de Ancara…………………………………………………………33 Figura 4.15.c. Kalay………………………………………………………………………34 Figura 4.15.d. Puerto de Tolbi……………………………………………………………34 Figura 4.15.e. Bosque prohibido………………………………………………………….34 Figura 4.15.f. ¿?1………………………………………………………………………….34 Figura 4.15.g. ¿?2…………………………………………………………………………35 Figura 4.15.h. ¿?3…………………………………………………………………………35 Figura 4.17. Ejemplo de diálogo con un NPC…………………………………………….36 9 Figura 6. Planificación temporal - Diagrama de Gantt…………………………………...47 Figura 8.2.1.a. Cocos2d - Nuevo proyecto…………...…………………………………..53 Figura 8.2.1.b. Simulador iOS……………………………………………………………53 Figura 8.3.2. Tiled Map Editor – Vista ortogonal………………………………………..55 Figura 8.3.3. Tiled Map Editor – Nuevo mapa…………………………………………...56 Figura 8.3.4. Tiled Map Editor – Nuevo conjunto de patrones…………………………..56 Figura 8.3.5.a. Tiled Map Editor – Propiedades del objeto………………………………57 Figura 8.3.5.b. Tiled Map Editor – Propiedades del patrón………………………………58 Figura 8.6. Zwoptex……………………………………………………………………....59 Figura 8.7. Audacity………………………………………………………………………60 10 1 Objetivos del proyecto Dado que actualmente el mundo de los Smartphones está en auge, muchas compañías están invirtiendo sus esfuerzos en crear aplicaciones para estos teléfonos móviles. Hasta no hace mucho tiempo, las empresas que se dedican a la creación de videojuegos, lanzaban sus productos para las consolas. En un tiempo reducido de tiempo, los Smartphones se han ido haciendo hueco en este mundo. La creación de este proyecto ha sido bastante fortuita, su creación ha sido posible debido a la idea de crear una aplicación para un Smartphone y que desde siempre me han fascinado los juegos de rol. Uno de mis juegos de rol favoritos fue “Golden Sun”, juego realizado por la compañía Camelot y que fue diseñado para la GameBoy Advance de Nintendo. Este juego tenía muchos componentes que le hacían único e interesante, tenía un enorme mapeado, un sistema de batalla por turnos y con, a veces complicados, rompecabezas. Mi propósito en este proyecto, ha sido realizar una muy humilde continuación de este juego para iPhone. El videojuego lo he realizado mediante Xcode con el soporte las librerías que ofrece cocos2d. Además se han utilizado otros programas para realizar los escenarios del juego, retoque de imágenes, retoque de efectos de sonido, creación de animaciones, etc. 1.1 Los Sistemas Operativos para móviles. Un sistema Operativo para móvil está pensado para controlar un dispositivo portátil (en nuestro caso concreto un “SmartPhone”). Con respecto a su funcionamiento, es muy similar al de cualquier otro sistema operativo de equipos de sobremesa (Windows, Mac OS… etc.). Sin embargo, un sistema operativo para móvil tiene un diseño más sencillo y especialmente pensado para que el usuario interactúe con él mediante pantalla táctil, voz, teclado virtual… etc. Otro aspecto importante es la comunicación. Un S.O. móvil esta específicamente diseñado para conectar los dispositivos a redes inalámbricas, redes móviles (ya sean redes GSM, GPRS, UMTS…ect.) y, por supuesto, conectar dispositivos entre sí utilizando, por ejemplo, la tecnología bluetooth. 11 Otro de los aspectos a tener en cuenta cuando hablamos de sistemas operativos móviles es el hecho de que utilizan formatos específicos para archivos multimedia especialmente optimizados para su uso en dispositivos móviles (principalmente porque los formatos que se usan en equipos de sobremesa suelen consumir demasiados recursos). 1.1.1 iOS de Apple. iOS es un sistema operativo desarrollado por la compañía Apple Inc. Para los dispositivos móviles iPod touch, iPhone e iPad. Está basado en una variante del Mach kernel de Mac OS X. La jerarquía de capas del iOS es la siguiente: 1. Cocoa Touch. 2. Medios de comunicación. 3. Servicios principales 4. Núcleo del sistema operativo. Capa Cocoa Touch: Cocoa Touch es una API (Interfaz de Programación de la Aplicación) para la creación de programas para el iPad, iPhone e iPod Touch. Se basa en el set de herramientas que proporciona el API de Cocoa para crear programas sobre la plataforma Mac OS X. El SDK de iOS nos proporciona herramientas para desarrollar aplicaciones basadas en la capa Cocoa Touch. SDK de iOS: El SDK (Kit de Desarrollo de Software) de iOS fue creado con el objetivo de permitir a terceros programar aplicaciones nativas para dicho sistema operativo. Uno de los puntos a tener en cuenta es el hecho de que necesitamos tener instalado el Mac OS X para poder utilizar dicho SDK. Ya que el iPhone está basado en Mac OS X, el entorno de desarrollo es asimismo el Xcode y el lenguaje de programación principal es el Objective C. Además, el iOS SDK nos proporciona un simulador, que nos permite testear las aplicaciones antes de instalarlas en el 12 móvil. El único inconveniente es el hecho de emular el acelerómetro, por lo tanto si tenemos la intención de utilizar el acelerómetro en nuestra aplicación no tendremos más remedio que testearlo en el móvil. 1.1.2 Windows Phone 7. Es un sistema operativo móvil desarrollado por Microsoft, como sucesor de la plataforma Windows Mobile. Está pensado para el mercado de consumo casual en lugar del mercado empresarial por lo que carece de muchas funcionalidades que proporciona la versión anterior. Microsoft ha decidido no hacer compatible Windows Phone 7 con Windows Mobile por lo que las aplicaciones existentes no funcionan en Windows Phone 7, haciendo necesario desarrollar nuevas aplicaciones. 1.1.2.1 Desarrollo de Software para Windows Phone 7: Tenemos dos implementaciones posibles a la hora de desarrollar aplicaciones para este sistema operativo: - Microsoft Silverlight: Esta implementación permite el desarrollo de aplicaciones basadas en XAML (En Español, Lenguaje Extensible de Formato para Aplicaciones). Incluye el entorno de trabajo Microsoft .NET Compact Framework (basado en la arquitectura del popular entorno .NET Framework). Silverlight también incluye una colección de clases llamada BCL (En Español, Libreria de Clases Base) que soportan lectura y escritura de ficheros, manipulación de XML y manejo de gráficos. - Microsoft XNA (Xbox New Architecture): El XNA Framework es una implementación nativa de .NET Compact Framework que incluye un amplio conjunto de bibliotecas de clases, específicos para el desarrollo de juegos, por ejemplo para el manejo de dispositivos de entrada, tratamiento de sonidos y 13 videos, carga de modelos y texturas, uso de ficheros de forma transparente a la plataforma en la que se ejecute, desarrollo de juegos online, etc… Permite desarrollar juegos para Windows Phone OS 7.0 CTP, Xbox 360, Zune HD y Windows 7. Una de los contras más significativos del Windows Phone 7 es la carencia de Multitarea. Entre el iOS, Android y Windows Phone 7, este último es el único que carece de dicha funcionalidad. Por otra parte, también hay que destacar que esta carencia hace que el sistema operativo sea mucho más rápido que, por ejemplo, Android. 1.1.3 Android. Android es un sistema operativo basado en Linux diseñado originalmente para dispositivos móviles, tales como los comúnmente conocidos “smartphones”, pero que posteriormente se expandió su desarrollo para soportar otros dispositivos tales como tablets, reproductores MP3, netbooks, etc. Este sistema operativo móvil tiene una gran comunidad de desarrolladores programando aplicaciones para extender la funcionalidad de los dispositivos que lo soportan. El lenguaje de programación en el que está basado el SDK de Android es Java, aunque también se pueden utilizar lenguajes como Javascript, C#, Boo o incluso Phyton dentro de otras aplicaciones como, por ejemplo, Unity 3d (ya que a la hora de compilar el propio Unity 3d hace las conversiones pertinentes para crear un archivo con el mismo formato y extensión que si lo hubiéramos compilado directamente como proyecto de Android en Java). La estructura del sistema operativo Android se compone de aplicaciones que se ejecutan en un “framework” Java de aplicaciones orientadas a objetos sobre el núcleo de las bibliotecas de Java en una máquina virtual Dalvik con compilación en tiempo de ejecución. 14 2 Especificaciones del videojuego 2.1 Género Se trata de un videojuego que entraría a la clasificación de videojuego de Rol. Este tipo de videojuegos su mayor importancia recae en que tiene una historia de fondo, con una serie de personajes controlables que recorren el escenario del juego hablando con la gente, luchando contra enemigos. En referente a las luchas, en este género, existen de varios tipos, en tiempo real, por turnos, etc. Cada personaje cuenta con una serie de atributos: vida, magia, fuerza de ataque, fuerza mágica, defensa, etc. 2.2 Objetivo del videojuego En este videojuego, el objetivo que se quiere lograr te lo irán contando las personas con las que nuestro personaje se vaya encontrando por el escenario. Pero para resumirlo, se trata de que nuestro personaje a que primeramente encuentre la localización de una serie de enemigos a los que ha de derrotar haciendo uso de sus poderes y habilidades para salir vencedor de las luchas. En este juego van a existir 3 clases de enemigos: los enemigos ordinarios, los “minijefes”, y el jefe final. La condición para lograr llegar a luchar contra el jefe final, es que previamente nuestro personaje tiene que derrotar a los “minijefes” que hay en el escenario. Una vez haya conseguido eliminar al jefe final, nuestro personaje se deberá de dirigir hacia un barco, a este barco no podrá acceder hasta que no derrote al jefe final, así de lo indicará el capitán del barco. Finalmente cuando lo logre y coloque el personaje delante del timón del barco, el juego habrá finalizado. Haciéndose la suposición que nuestro personaje se dirige rumbo a nuevas aventuras. 2.3 Sistema de batalla Para el sistema de batalla se ha optado por un sistema por turnos de 1 vs 1, tal y como se puede observar en la figura 3.4. 15 Este tipo de sistema de batalla, todos los personajes restarán preparados para atacar hasta que el usuario no pulse el botón de atacar, o bien realice algún tipo de hechizo mágico. Como que se trata de un sistema por turnos se ha optado a que nuestro personaje siempre será el primero en atacar, y finalmente cuando éste haya terminado, dará paso al enemigo. 16 3 Diseño de la aplicación 3.1 Pantalla inicial Será la primera imagen que aparezca al abrir la aplicación. Figura 3.1. Pantalla inicial 3.2 Menú principal Consta de la imagen de fondo y un menú con una serie de botones situados a la parte izquierda en forma de columna. Figura 3.2. Menú principal 3.3 El juego Consta de un escenario con variedad de localizaciones, en las que el personaje podrá hablar con la gente que se encuentre, luchar contra enemigos, etc. Según en qué localización nos encontremos, aparecerá un “pop-up” en la parte superior, tal y como podemos observar en la figura 3.3, asimismo en la misma posición aparecerán otros mensajes cuando el protagonista se acerque a la gente que se vaya encontrando. En la parte 17 inferior también aparecerá un botón de lucha siempre que nos encontremos a un enemigo y el protagonista se le acerque. Hay también un joystick en la parte inferior izquierda para mover el protagonista a cualquier dirección, y un botón desplegable en la parte inferior derecha. Figura 3.3. Inicio del juego 3.4 Escenarios de batalla En la parte superior se encuentran los iconos, el nombre y sus atributos tanto de nuestro personaje, situado a la parte derecha, como del enemigo. En la parte central se encuentra una imagen de fondo y las animaciones de nuestro personaje y del enemigo. Finalmente en la parte inferior se encuentra un botón de atacar, un botón desplegable para realizar hechizos y/o un botón para huir de la batalla. Figura 3.4. Escenario de batalla 18 3.5 Pantalla de finalización del juego Esta pantalla será la que se mostrará al finalizar el juego. Consta de una imagen de fondo y un botón para regresar al menú inicial. Figura 3.5. Fin del juego 3.6 Pantalla de “Game Over” Esta pantalla aparecerá siempre que nuestro personaje sea vencido en batalla, consta de una imagen de fondo y un botón para regresar al menú principal. Figura 3.6. Game Over 19 3.7 Pantalla de instrucciones Consta de una imagen de fondo, un menú desplegable situado a la parte izquierda y un botón para regresar al menú principal. Figura 3.7. Instrucciones del juego 3.8 Pantalla de configuración del sonido Consta de una imagen de fondo, en el centro se encuentran 2 botones y 2 barras reguladoras para controlar tanto el volumen de la música como del sonido al pulsar los botones, y finalmente en la parte inferior izquierda hay un botón para regresar al menú principal. Figuro 3.8. Opciones de sonido 20 3.9 Pantalla de créditos Costra de una imagen de fondo, un texto y un botón en la parte inferior izquierda para regresar al menú principal. Figura 3.9. Créditos 4 Desarrollo - Creación del videojuego A continuación se detallan todas las etapas que se han ideo haciendo para elaborar este videojuego. Se tiene que tener en cuenta que en muchas ocasiones se ha dado el case de volver en una / varias etapas que ya se había hecho, para rehacer y/o ajustar algún detalle. 4.1 Selección de las imágenes Para la creación de un videojuego, primeramente es necesario tener un concepto de cómo va ser el videojuego, que personajes va a tener, los escenarios, etc. En este caso, todos estos pasos los obviamos, ya que gracias a esta página web: http://www.goldensun-syndicate.net/sprites/ , adquirí la gran mayoría de material gráfico. En esta página encontré todo solo iconos necesarios para los diálogos, los personajes del juego, la gran mayoría de objetos para crear los escenarios, etc. A pesar del enorme material que encontré en esta página aún había partes del escenario que me faltaban, partes como, la hierba del escenario, las montañas, el agua, etc. 21 Para ello decidí de utilizar el emulador “VisualBoy Advance”. Se trata de un emulador de la videoconsola GameBoy Advance de Nintendo, con el cual fui extrayendo partes del escenario del videojuego original, mediante ficheros .png. 4.2 Selección de los sonidos y canciones En referente a la música que iba a escoger para el juego, también opté de utilizar la música origina del videojuego, pero esta vez el material ya lo tenía, debido a que tengo la banda sonora en formato CD. En lo referente a los sonidos del juego, es decir, cuando se pulsa un botón para confirmar alguna acción, o bien si se quiere volver a atrás, etc., no los tenía. Para ello utilicé otra vez el emulador anteriormente mencionado, pero esta vez combinado con el programa Audacity, se trata de un programa para la grabación de audio, asimismo como su edición. Con la combinación de estos 2 programas, finalmente conseguí todos los sonidos que creí convenientes para el videojuego. 4.3 Creación del escenario Para la preparación del escenario, fueron necesarios varios pasos previos. El escenario del videojuego está creado mediante el programa Tiled Map Editor, el cual es compatible con la librería cocos2d. Para la creación de escenarios en este programa, se requieren conjuntos de patrones. Estos patrones decidí hacerlos de 32 x 32 píxeles, tal y como consta en las Decisiones de diseño. 4.3.1 Creación de patrones Debido a que no tenía ningún conjunto de patrones, opté de utilizar el programa Photoshop, para crearlos. 22 Primeramente, escogí el material que creí suficiente para realizar el juego. Seguidamente, en un archivo en blanco fui colocando cada una de las imágenes, teniendo siempre en cuenta el tamaño que tenían los patrones. Hubo muchos casos en los que tuve que editar las imágenes, debido al problema mencionado. 4.3.2 Creación del conjunto de patrones y de las capas En Tile Map Editor, para crear los escenarios, es necesaria como mínimos una capa y un patrón. Para crear el escenario fueron necesarios 5 conjuntos de patrones. Para crear el escenario fueron necesarias 6 capas: Background, en esta capa, es la capa base, donde se fue colocando la hierba, el agua, las montañas, etc. Foreground, todo lo referente a casas, puentes, muros, estatuas, se colocó en esta capa. Trees, tal y como lo indica el nombre de la capa, en ésta de colocaron todos los árboles del escenario Character, en esta capa solamente se colocó el punto en el cual, el protagonista del videojuego de colocaría al iniciar una nueva partida. NPCs, es la capa donde se encuentran todos los personajes que aparecen en el escenario. Misc, esta es la capa más especial. Se trata de una capa que se utilizará para controlar las diversas situaciones que ocurrirán cuando la aplicación se ejecute, tales como: o Colisiones o Hablar con los personajes o Luchar contra los enemigos o Cambiar la música en el momento que el personaje cambie de localización 23 o Etc. Cada capa, excepto la capa “Character”, le corresponde un conjunto de patrones con el mismo nombre, más que nada para simplificarlo. 4.4 Creación del menú principal Hasta esta etapa en el proceso de la aplicación no se había tocado nada de código. A partir de aquí, todo el código que se utilizará estará escrito en el lenguaje Objective-C, que es una variante del lenguaje C. Para crear el menú principal, se tendrán que crean 2 nuevos ficheros, un fichero llamado MenuLayer.m y otro fichero MenuLayer.h. E l fichero .h, tiene el mismo comportamiento que en el lenguaje C. El fichero .m, lo más destacable son las funciones scene y init. La función scene será la encargada de implementar la escena o vista del menú principal. La función init, es una función básica, que se llamará siempre al inicio de la ejecución del archivo. En esta función cargaremos la imagen de fondo e incluiremos un menú con botones. Véase figura 3.2. En un principio estos botones no tendrán ninguna función, pero a medida que vayamos creando las nuevas pantallas, éstos nos servirán para cambiar de esa pantalla mediante la llamada a la función correspondiente. Una vez realizado el punto 4.5, en la función init, llamamos la función para que la música del menú arranque. Esta función solo se llamará solamente en el caso de que no haya ninguna canción en marcha. 24 4.5 Creación del menú de opciones Los ficheros que conforman el menú de opciones son los ficheros OptionsLayer.m y OptionsLayer.h. Estos 2 ficheros serán los que crearán el fondo y los botones que se ven en la figura 3.8. Este menú lo pretende es ajusta el volumen de la música y de la pulsación de botones, cosa que aún no está implementada. Por eso se crean 2 nuevos ficheros, MusicLayer.m y MusicLayer.h, que serán los encargados de cargar todas las canciones y sonidos que van a sonar en la aplicación. En el fichero MusicLayer.m se crean para cada una de las canciones y sonidos, una función. Con eso lo que se consigue es que se globaliza en un solo fichero todas las canciones y sonidos, y que cualquier fichero que las/los requiera, no tiene nada más que llamar la función correspondiente a esta/este. En el caso del sonido, este se llamará a todas y cada una de las funciones que se llamen cuando de pulse un botón. Los botones de “Música” y “Sonido”, su función será la de silenciar completamente el tono o devolverlo al tono que estaba anteriormente. Tanto la música como el sonido, disponen de una barra deslizante, mediante la cual se puede regular el tono. La función del botón “Atrás”, es como su nombre indica, volver al menú principal. 4.6 Creación de la pantalla de instrucciones Como se puede comprobar en la figura 3.7, el texto que aparece en la parte izquierda de la pantalla, son en realidad elementos del menú. Cuando se pulse uno de los elemento, pongamos por ejemplo, el elemento “Movimiento”, la pantalla pasará a ser la siguiente: 25 Figura 4.6.a.Instrucciones para mover al personaje En el caso de pulsar “Hablar será esta otra: Figura 4.6.b. Instrucciones para hablar con la gente Y Finalmente si se pulsa “Luchar” será esta: Figura 4.6.c. Instrucciones para luchar en batalla Para regresar de nuevo a la pantalla que corresponde a la figura 3.7, solo se tendrá que pulsar donde pone “ok”, en la parte inferior de la pantalla. Como en el caso del menú de opciones, el botón “Atrás”, te hace volver al menú principal. 26 4.7 Creación de la pantalla de créditos Como se puede comprobar en la figura 3.9, solo consta de una imagen de fonda, un texto y el ya conocido botón “Atrás”. 4.8 Inserción del escenario a la aplicación A partir de esta etapa llega el momento de añadir el escenario creado en el programa Tiled Map Editor a cocos2d. Los ficheros encargados de este escenario serán GameLayer.m y GameLayer.h. Para cargar el escenario, es suficiente de agregar estas líneas dentro de la función init: self.Map = [CCTMXTiledMap tiledMapWithTMXFile:@"FinalMap.tmx"]; self.BgLayer = [_Map layerNamed:@"Background"]; self.FgLayer = [_Map layerNamed:@"Foreground"]; self.TreesLayer = [_Map layerNamed:@"Trees"]; self.NPCsLayer = [_Map layerNamed:@"NPCs"]; self.MiscLayer = [_Map layerNamed:@"Misc"]; _MiscLayer.visible = NO; [self addChild:_Map z:-1]; En la penúltima línea, haremos que cuando el escenario se muestre por pantalla, la capa “Misc” que creamos, esté oculta, ya que no nos interesa que se vea. La última línea de código, sirve para añadir el escenario y hacer que sea la capa más inferior que se muestre por pantalla. Todos los elementos que se vayan añadiendo, siempre estarán por encima del escenario. 4.9 Posicionamiento del personaje en el escenario Para colocar a nuestro personaje en el escenario y posicionarlo, haremos uso de la capa “Character”. Veámoslo en el código: CCTMXObjectGroup *Chars = [_Map objectGroupNamed:@"Character"]; NSMutableDictionary *GameStart = [Chars objectNamed:@"Start"]; int x = [[GameStart valueForKey:@"x"] intValue]; int y = [[GameStart valueForKey:@"y"] intValue]; self.Character = [CCSprite spriteWithFile:@"Isaac_S.png"]; _Character.position = ccp(x,y); [self addChild:_Character z:50]; 27 4.10 Testeo del movimiento del personaje mediante eventos touch y control de la cámara En un principio, el movimiento del personaje se movía por el escenario mediante los eventos touch, es decir, el personaje se movía a la dirección donde se había pulsado en pantalla con el dedo. Este tipo de movimiento tenía un inconveniente, que solo se movía un espacio de un patrón (32 x 32 píxeles) en dirección al lugar de toque de pantalla. A pesar de realizar pruebas para solventar este problema, y haber realizado el movimiento del personaje con animaciones, esta forma de movimiento se descartó. En esta fase de pruebas, se desarrollo el control de la cámara. El control de la cámara permite que mientras el personaje de vaya moviendo por el escenario, esta vaya cambiando en tiempo real. Esta actualización en tiempo real es posible debido a que la función de la cámara es llamada 60 veces por segundo, mediante la función update. 4.11 Testeo del movimiento del personaje mediante acelerómetro 1 Para hacer posible el uso del acelerómetro, es necesario habilitarlo, cosa que se hace mediante esta línea: self.isAccelerometerEnabled = YES; Una vez habilitado, con la función accelerometer, ya se puede configurar todo para que el personaje se mueva según el movimiento del iPhone, en este caso. A continuación se optó para que según la dirección en la que se moviera al personaje, a este se le cambiara la imagen, para hacer más creíble el movimiento. En la última versión de la aplicación se modificó para que el acelerómetro se pudiera desactivar dentro del menú descrito en el punto 4.13.2. 1 Solamente se puede testear esta función mediante el dispositivo físico. 28 4.12 Inserción el menú del juego El menú del juego no se puede poner directamente encima del escenario, sino que se tiene que añadir encima de la vista del escenario. El menú del juego está creado en los ficheros HudLayer.m y .h, más que nada para que todo el código y los ficheros estén organizados y sea posible una mejor y fácil lectura, además que de esta manera todo está más organizado. Cuando en el punto 4.8 se hizo que el escenario siempre quedara por debajo de cualquier otro elemento, fue precisamente para este caso entre otros. De esta manera el menú siempre estará por encima. En referente al menú, solamente comentar que se colocaron todos los botones, preparados para hacer su función. Estos botones en un principio están todos ocultos para no estorbar. Solamente el botón “Menú” es visible, véase figura 3.3. En la figura a continuación se pueden observar los botones que estaban ocultos. Éstos se vuelven visibles siempre y cuando se pulse el botón “Menú”, en cambio el botón “Menú” se oculta, así como el joystick del punto 4.13; y aparece en su lugar el botón “Atrás”. Figura 4.12. Opciones del menú del juego 4.12.1 Inserción del menú de estado del personaje Cuando se pulsa el botón “Estado”, éste llama la función que hace que se vuelva visible toda la información referente a nuestro personaje, con sus atributos para la batalla, juntamente con un icono de éste. Al mismo tiempo que se vuelve visible toda esta información, los botones que forman parte del menú excepto el botón “Estado” se vuelven invisibles. Para más aclaración véase la figura que hay a continuación. 29 Figura 4.12.1. Menú estado del personaje 4.12.2 Inserción del menú de opciones de sonido y del acelerómetro Este menú se compone de los mismos elementos que el menú de opciones al que se accede desde el menú principal, solo con el añadido del botón “Acelerómetro”, que su función es la de activar/desactivar el acelerómetro y así permitir o no el movimiento del personaje mediante este. Figura 4.12.2 Comparativa de los menús de opciones Como en el caso del punto 4.12.1, también desaparecen los botones del menú, exceptuando al botón de “Opciones”. 30 4.12.3 Inserción de las opciones para salir del juego Para salir del juego, se ha optado para tener 2 métodos de salir del juego desde el menú y volver a la pantalla inicial. Pulsando el botón “Inicio”, aparecerá en pantalla en mensaje que se puede observar en la siguiente figura: Figura 4.12.3.a. Opción para salir del juego sin guardar Si se da el caso de que se pulsa el botón “Sí”, se volverá al menú principal de juego habiendo perdido todo es progreso del juego. Pulsando el botón “Guardar”, aparecerá en pantalla en mensaje que se puede observar en la siguiente figura: Figura 4.12.3.b. Opción para salir del juego guardando es estado de la partida Si se da el caso de que se pulsa el botón “Sí”, también se volverá al menú principal de juego como en el caso anterior pero con la peculiaridad de que si en el menú principal se pulsa el botón de “Continuar”, se volverá al punto del juego en el que se guardo. 31 4.13 Testeo del movimiento del personaje mediante joystick Debido a que se descartó la opción de movimiento del punto 4.10, pensé que era mejor tener un joystick para mover al personaje. Para la creación y funcionamiento del joystick, encontré en un video tutorial, como hacían uso de unos ficheros. He utilizado estos ficheros para la gestión del movimiento del joystick. Se trata de los ficheros SneakyJoystick.m y .h, además de los ficheros SeakyJoystickSkinnedBase.m y .h. En lo referente al movimiento del personaje, la manera de realizar su movimiento es muy parecida a la vista con el acelerómetro. El comportamiento es idéntico. Lo referente a la posición del joystick se puede comprobar en la figura 3.3 que éste está situado en la parte inferior izquierda. 4.14 Control de colisiones Con el acelerómetro y el joystick funcionando, todo parece funcionar correctamente, pero surge un problema y es que nuestro personaje es capaz de atravesarlo todo. Para evitar este problema tenemos la función de setCharacterPosition. Esta función comparará si la posición futura del personaje es la misma que el área roja del escenario que se encuentra en la capa “Misc”. Ésta área roja contiene la propiedad de “collidable”, es decir, colisionable. Por lo tanto si al comprobar esa comparativa, el resultado de ella sea cierto, el personaje no será posible de ir más allá. A continuación se puede comprobar cómo es la capa “Misc”, siendo ésta invisible en el momento de ejecutar la aplicación. 32 Figura 4.14. Capa Misc 4.15 Cambio de localización del personaje En el escenario existen varias localizaciones, son las siguientes: Vale Figura 4.15.a. Vale Pradera de Ancara Figura 4.15.b. Pradera de Ancara 33 Kalay Figura 4.15.c. Kalay Puerto de Tolbi Figura 4.15.d. Puerto de Tolbi Bosque prohibido Figura 4.15.e. Bosque prohibido ¿? Figura 4.15.f. ¿?1 34 Figura 4.15.g. ¿?2 Figura 4.15.h. ¿?3 Cuando el personaje pasa de una localización a otra, véase la figura 4.14, donde el verde claro corresponde a la localización de “Tale” y el verde oscuro pertenece a la localización de “pradera de Ancara”; entonces se llama a la función switchLocation. Esta función es llamada desde la función del joystick y desde la función del acelerómetro. Su función es doble, por un lado va a generar en la parte superior de la pantalla un mensaje correspondiente a la localización que se está entrando, y por otro va a cambiar la música. Comentar que las figuras 4.15.f., 4.15.g. y 4.15.h.; solo se va a cambiar la música, no va a aparecer ningún texto. 4.16 Inserción de NPCs en el escenario y preparación de los textos de los NPCs Cuando ya se ha comprobado que todo lo que se ha hecho hasta este momento funciona perfectamente, llega el momento de introducir los NPCs, es decir, los personajes no controlables. Estos personajes se van a colocar directamente al escenario mediante el Tiled Map Editor, y a cada uno de ellos se le va a incluir una propiedad única, esta propiedad única va a ser el nombre del personaje. Los NPCs, se van a colocar en la capa 35 con su propio nombre, y en la capa Misc, se pondrá en la misma posición del NPC el patrón de “collidable”, para que nuestro personaje no le transpase, y alrededor se colocarán los patrones marrones que tienen la propiedad de “talk”, es decir, hablar. Asimismo, se creará un fichero .plist que contendrá todos los nombres de los personajes en una lista. Los nombres de los personajes van a ser la llave del fichero, y como valor que tendrá cada llave, se le asignará el texto que dirá dicho personaje en el juego. 4.17 Hablar con los NPCs Una vez se han preparado todos los ficheros e introducidos todos los NPCs en el escenario procederemos a realizar las funciones de setTalk y displayDialog. La función de setTalk será la encargada de comprobar a que NPC se ha acercado nuestro personaje, y enviarle a la función displayDialog el nombre del NPC. La función displayDialog, como su nombre indica, será la encargada de mostrar en la parte superior de la pantalla, dentro de un cuadro de diálogo, el texto del nombre del NPC que se le ha pasado por parámetro. Este cuadro de diálogo será visible durante un cierto periodo de tiempo, que luego se irá ocultando hasta desaparecer. Figura 4.17. Ejemplo de diálogo con un NPC 36 4.18 Creación de los atributos de todos los personajes Se han creado los ficheros Characters.m y .h, dentro de los cuales se han ido creado todos los personajes que van a participar en batalla. A cada personaje se le han definido una serie de atributos, los cuales están ajustados según a cada uno. En la figura 4.12.1, se pueden comprobar los atributos que tiene nuestro protagonista. Los atributos son los siguientes: Hp, corresponde a la vida actual del personaje MaxHp, corresponde a la vida que puede tener como máxima el personaje. Psy, corresponde a la magia actual del personaje. MaxPsy, corresponde a la magia que puede tener como máximo el personaje. Atk, corresponde al poder de ataque físico que tiene el personaje. PsyAtk, corresponde al poder mágico que tiene el personaje. 4.19 Creación de las animaciones de batalla 4.19.1 Pasos previos Cabe puntualizar que en cocos2d, para la realización de animaciones, se tendrá que seguir una serie de pasos específicos. En el caso que tengamos una imagen .gif, esta si la insertamos directamente en cocos2d, solo será capaz de mostrar la primera imagen de la animación. Debido a la peculiaridad de cocos2d, para cada animación se ha seguido una serie de pasos para lograr la animación de estas imágenes .gif. A continuación se detallan los pasos seguidos: A partir de una imagen .gif animada procedemos a abrirla con el programa Photoshop. Seguidamente procedemos a extraer todas las imágenes que conforman dicha animación, mediante la opción de Exportar Interpretar video. 37 Una vez hemos extraído todas las imágenes, mediante el programa Zwoptex, vamos a coger todas estas imágenes, las trataremos de manera que sea compatible con cocos2d. Con Zwoptex, se van a crear 2 archivos, un archivo .png, y otro .plist . 4.19.2 Inserción de las imágenes animadas Para poder realizar las animaciones en cocos2d, se requerirán 2 archivos. El primer archivo, es un archivo .png que contendrá todas las imágenes que se requieran para la animación, y el otro archivo será un archivo .plist (property list), que contendrá las coordenadas de cada frame (cada imagen que conforma la animación). Ambos archivos deberán de tener el mismo nombre, de lo contrario no sería posible realizar la animación. Una vez tenemos estos archivos, en nuestro código se requerirán 5 objetos. 1. Cache 2. Frame array 3. Animation object 4. Animation action 5. Sprite Ejemplo de código para la animación de nuestro personaje: -(void) initIsaacAnimation { CCSpriteFrameCache *cache=[CCSpriteFrameCache sharedSpriteFrameCache]; [cache addSpriteFramesWithFile:@"Isaac_lBlade_Back.plist"]; NSMutableArray *framesArray=[NSMutableArray array]; for (int i=1; i<5; i++) { NSString *frameName=[NSString stringWithFormat:@"Isaac_lBlade_Back%d.png", i]; id frameObject=[cache spriteFrameByName:frameName]; [framesArray addObject:frameObject]; } id animObject=[CCAnimation animationWithFrames:framesArray delay:0.25]; id animAction=[CCAnimate actionWithAnimation:animObject restoreOriginalFrame:YES]; animAction=[CCRepeatForever actionWithAction:animAction]; _IsaacAnim = [CCSprite spriteWithSpriteFrameName:@"Isaac_lBlade_Back1.png"]; _IsaacAnim.anchorPoint = ccp(0,0); _IsaacAnim.position = ccp (350,75); _IsaacAnim.scale = 2; [self addChild:_IsaacAnim]; 38 [_IsaacAnim runAction:animAction]; } Para más información, mirar la API de cocos2d y los ficheros correspondientes a las batallas. 4.19.3 Secuencias de batalla Una vez hemos insertado las animaciones, llega la hora de crear las secuencias de batalla. En un momento inicial, tanto nuestro personaje, como el enemigo, estarán en una posición fija y con la animación de “preparados” repitiéndose hasta que no se realice ninguna acción. 4.19.3.1Secuencia de ataque físico Nuestro personaje con la animación inicial se va a desplazar hasta donde se encuentra el enemigo. A continuación, se ocultará esa animación para dar lugar a la animación de ataque. Cuando esta termine, va a desaparecer, para volver a la animación inicial. En ese mismo momento, la animación del enemigo también se ocultará y dará paso a la imagen de “enemigo herido”. Unos instantes después, el enemigo va a volver a su animación inicial, y nuestro personaje se desplazará hasta su posición inicial. 4.19.3.2Secuencia de ataque mágico Ésta secuencia sólo va a ser posible, siempre y cuando nuestro personaje y/o el enemigo, tengan suficiente “Psy”. La secuencia será la siguiente: Nuestro personaje cambiará su animación inicial, por la animación de ataque mágico. A continuación, en la posición dónde se encuentra el enemigo, aparecerá la animación del ataque mágico. 39 Cuando esta termine, la animación del enemigo también se ocultará y dará paso a la imagen de “enemigo herido”. Finalmente, unos instantes después, el enemigo va a volver a su animación inicial. 4.19.3.3Secuencia de cura del personaje Nuestro personaje cambiará su animación inicial, por la animación de ataque mágico. 4.19.3.4Secuencia de derrota En el caso de que nuestro personaje se encuentre sin vida, después de que el enemigo le ataque, se va a realizar la siguiente secuencia: Nuestro personaje reemplazará la animación inicial por la imagen de “personaje derrotado”. En referente a los ataques de los enemigos, son casi idénticos a los de nuestro personaje, entendiéndose como casi idénticos, como que en algunos casos los enemigos no tendrán una secuencia animada del ataque, sino que sólo será una única imagen. 40 4.20 Creación de las batallas 4.20.1 Actualización de la vida y “Psy” de los personajes En el principio de cada batalla, tanto nuestro personaje, como el enemigo, inicializaran la vida y la “Psy”, éstas se inicializaran en color verde. Cada vez que uno u otro realice un ataque, sea físico o mágico, al contrario, a éste se le va a reducir la vida. En el caso que nuestro personaje realice “cura”, la vida le va aumentar, según el poder mágico que éste tenga. La actualización se va a realizar, en el momento inmediatamente siguiente a la animación de “enemigo herido”/ ”personaje herido”, o bien si el personaje realiza “cura”, esta actualización se hará cuando acabe la animación de ataque mágico. Se ha tenido en cuenta que, cuando el enemigo o nuestro personaje, su vida o su “Psy” estén entre un 15% y un 50% del su máximo, el color se cambiará a amarillo. Lo mismo sucederá si está debajo del 15%, pero ésta vez en rojo. 4.20.2 Formas para salir del combate Normalmente existirán 3 formas para salir del combate: ganando al enemigo, ser vencido, o bien, huyendo del combate. Cuando nuestro personaje haya dejado sin vida al enemigo, aparecerá un botón de “continuar”, que nos devolverá al mismo punto del mapa del que estábamos antes del combate. En el caso que fuéramos derrotados, la pantalla de nos irá haciendo negra, hasta aparecer una pantalla de “Game over”. En esta pantalla se nos dará la opción de “continuar”, que nos devolverá a la pantalla de inicio. La última opción solo estará disponible en los combates normales, es decir, en los combates contra los jefes, esta opción no existirá. En el caso de que se pulse el botón de “huir”, regresaremos al mismo punto del mapa del que estábamos antes del combate. 41 4.21 Creación de la pantalla de Game Over Como se puede comprobar en la figura 3.6, hay una imagen de fondo y el botón de “Continuar”, situado en la parte inferior derecha, que su función es la de redireccionar hacia el menú principal. 4.22 Creación de la pantalla de Fin del juego Como se puede comprobar en la figura 3.5, hay una imagen de fondo y el botón de “Continuar” ”, situado en la parte superior derecha, que su función es la de redireccionar hacia el menú principal. 42 5 Decisiones de diseño La aplicación está pensada para ejecutarla en iPhone, por ese motivo la resolución de la pantalla se ha restringido a 480 x 320 píxeles. Para la ejecución de la aplicación, se han restringido las vistas. Es decir que sólo están disponibles las vistas apaisadas. 5.1 Limitaciones para crear el escenario Con Tiled Map Editor y la librería cocos2d, existen varias limitaciones. Una de ellas es que según puede comprobar es que cocos2d como máximo acepta escenarios no superiores a 175 x 100 patrones, en los que cada patrón es de 32 x 32 píxeles. Estas son las medidas que utilicé para el escenario, quería aprovechar al máximo estas dimensiones. La otra limitación que existe entre cocos2d y Tiled Map Editor, es que en cada capa sólo admite un conjunto de patrones. Lo que sí es posible hacer es, utilizar un conjunto de patrones en varias capas. 5.2 Menú principal El botón de “Continuar”, va a provocar la finalización de la aplicación en el caso de que no se haya guardado ninguna partida, por ese motivo se ha escrito un mensaje en color rojo, justo debajo del botón. Con relación al punto anterior mencionar que cuando se guarda la partida desde el juego, lo que en realidad se hace es un “pushscene”. Es decir, se coloca encima de la pila de “scenes” (escenas), el juego. Cuando se pulsa el botón de “Continuar” desde el menú principal, lo que se hace es un “popscene”, es decir, se desapila la escena cosa que hace posible recuperar la escena del juego, en el estado que se encontraba la última vez. 5.3 Juego Cuando se inicia el juego, el acelerómetro por defecto está habilitado, en caso de que se quiera deshabilitar, basta con ir al menú de opciones, dentro del juego, y pulsar el botón del “Acelerómetro”. 43 Existe un inconveniente con el acelerómetro, y este se da a conocer cuando se cambia de una vista apaisada a la otra. Cuando se cambie la vista, el movimiento del iPhone para mover al personaje en cualquier dirección, tendrá que ser el movimiento inverso. Pongamos por ejemplo de que queremos mover nuestro personaje hacia la derecha, para lograr moverlo hacia la derecha, tendremos que mover el iPhone hacia la izquierda. Cada localización que hay en el juego, le pertenece un patrón, el cual se ha ido colocando en la capa “Misc”. Se ha optado para que a cada localización tenga su propia canción. Cuando el personaje cambie de localización, hará que la música de la antigua localización se pare, y empiece a sonar la música de la nueva localización. Para hablar con los NPC, es suficiente acercarse a éste y que ambos personajes colisionen. Para pasar a las pantallas de batalla, que ha optado de hacer aparecer el botón de “Luchar”, cuando el personaje se coloque justo encima del enemigo. Esta transición de escenas, está hecha mediante “pushscene” y “popscene”. Así nos aseguramos que cuando se haya salido de la escena de la batalla, se vuelva al mismo punto del escenario. En el caso que se hubiera perdido el combate y salga la escena de “Game Over”, esta limpiará la pila de escenas que se había creado. En los combates, he optado de hacerlos por turnos, y en los que siempre nuestro personaje será el primero de atacar, para que luego lo haga el enemigo. La mayoría de enemigo tendrán solo la opción de realizar un ataque físico, por ello que siempre nos atacarán una vez lo haya hecho nuestro personaje. Existe un “minijefe”, que sólo nos podrá atacar mediante ataques mágicos. Estos ataques mágicos consumen poder mágico, y por ello su uso es limitado. En el momento que haya gastado todo su poder mágico, se verá forzado a no poder atacarnos. 44 Para el jefe final, he decidido que éste disponga de 2 tipos de ataque, el físico y el mágico. Mediante una función random, este irá alternando los ataques. En referente al jefe final, el botón de “Luchar”, no aparecerá hasta que se hayan derrotado todos los “minijefes”. Se ha creado una variable entera, a la que se la incrementa cada vez que se derrota a un “minijefe”. Para poder finalizar el juego, nuestro protagonista tendrá que entrar en el barco que hay en el “Puerto de Tolbi”. A este solo podrá acceder una vez que haya derrotado al jefe final. Para ello se ha creado una variable booleana que se hará cierta, cuando se le haya derrotado. En la lucha contra estos “minijefes” y contra el jefe final, se ha optado de eliminar la opción de huir de la batalla por un motiva doble, por el mero hecho que se trata de una lucha “importante” y en estas, huir no es una opción, y también debido a las variables que se comentan en los 2 puntos anteriores. Para el tema de las batallas, he creído conveniente en crear para cada batalla contra cada enemigo un archivo distinto. Lo he hecho de esta manera por el hecho de que queda más entendible para la lectura del código. 45 46 6 Planificación temporal Con el fin de esquematizar lo máximo posible el cálculo del tiempo total del proyecto, se ha realizado un diagrama de Gantt: Figura 6. Planificación temporal - Diagrama de Gantt 47 48 7 Conclusiones y mejoras La realización de este proyecto me ha enseñado muchísimas cosas. El tema de realizar una aplicación en un lenguaje completamente nuevo para mí y realizar un juego de este estilo, realmente si alguien me lo hubiera dicho que lo hiciera, no lo hubiera visto posible. Gracias a la multitud de páginas en las que había tutoriales para aprender ObjectiveC y Cocos2d, ha sido posible realizar este proyecto. Toda la experiencia en general de este proyecto ha sido muy satisfactoria, no solo por el hecho de haber programado en un lenguaje que nunca antes había utilizado, sino en la multitud de programas que he tocado y utilizado. Todos estos programas que he utilizado en este proyecto, también he tenido que ir aprendiendo su funcionamiento, ya que igual que en el caso de Objectice-C, era la primera vez que los utilizaba. Por ese motivo, en una cuantas ocasiones se ha dado el caso en el que iba progresando en el proyecto, pero de repente me daba cuenta de que lo que había hecho hasta la fecha no era correcto. Uno de estos ejemplos fue el de la creación del escenario. El escenario que cree la primera vez, era superior al tamaño máximo que se podía permitir con cocos 2d. O el caso de los patrones, que no supe hasta que no introduje el escenario en cocos2d para darme cuenta, que para cada capa sólo se podía utilizar un conjunto de patrones. Casos como estos, provocaron un retraso en el proyecto, pero mirándolo por el lado positivo, aprendí de ellos. Si en otra ocasión hiciera otra aplicación ya tendría en cuenta estos casos, y no me volverían a suceder. Ver cómo con cada uno de estos programas se iba haciendo parte del proyecto, y ver luego como poco a poco cada una de las piezas se iban juntando, para mí, personalmente no tiene precio. A medida que iba progresando en el proyecto, observé que había muchos pequeños detalles que se podían haber mejorado. Quizá si en un futuro decidiera seguir mejorando este proyecto y hacerlo mucho más grande de lo que es, es seguro que los iría añadiendo. 49 50 8 Recursos utilizados 8.1 Xcode Es el entorno de desarrollo integrado (IDE, en sus siglas en inglés) de Apple Inc. y se suministra gratuitamente junto con Mac OS X. Xcode trabaja conjuntamente con Interface Builder, una herencia de NeXT, una herramienta gráfica para la creación de interfaces de usuario. Xcode incluye la colección de compiladores del proyecto GNU (GCC), y puede compilar código C, C++, Objective-C, Objective-C++, Java y AppleScript mediante una amplia gama de modelos de programación, incluyendo, pero no limitado a Cocoa, Carbón y Java. Otras compañías han añadido soporte para GNU Pascal,1 Free Pascal,2 Ada y Perl.3 Entre las características más apreciadas de Xcode está la tecnología para distribuir el proceso de construcción a partir de código fuente entre varios ordenadores, utilizando Bonjour. 8.1.1 Historia Xcode se introdujo el 24 de octubre de 2003 junto con la versión 10.3 de Mac OS X, siendo desarrollado a partir del anterior entorno de desarrollo de Apple, Project Builder, al que sustituyó. Project Builder, a su vez, también era una herencia de la compañía NeXT, fusionada con Apple en 1996. La aparición de Xcode 2.1 en junio de 2005 fue significativa porque proporcionó a la comunidad de desarrolladores las herramientas para crear binarios universales que permiten al software creado para Mac OS X ser ejecutado tanto en la arquitectura PowerPC como en la nueva, basada en Intel (x86). Esta versión integró además las herramientas y marcos de trabajo WebObjects de Apple para construir aplicaciones y servicios web de Java, que anteriormente se vendían como un producto separado por un precio de 699$. Con el lanzamiento de Mac OS X v10.5 también lo fue el Xcode 3.0, que tenía como principales novedades la inclusión de Objetive-C 2.0, un nuevo Interface Builder, la opción de refactorizar proyectos y hacer "snapshosts" del proyecto entre otras. 51 Xcode 4, lanzado a principios de 2011, incluía como novedades una nueva interfaz y la compatibilidad con Mac OS X 10.7 Lion. Con esta versión, Xcode dejó de ser ompatible con Mac OS X 10.5 Leopard. 8.2 Cocos2d Cocos2D es un framework para el desarrollo de juegos en 2D y aplicaciones con alto contenido interactivo. Cocos2D para iPhone es basado en Cocos2D pero implementa Objective-C como lenguaje de programación en lugar de Python. Dentro de las características principales de este framework encontramos: Integración con motores de física: Box2D, Chipmunk Manejo de Escenas y efectos de transiciones Compatibilidad con eventos Touch y el acelerómetro Texturas PVRTC de 2-bit y 4-bit, texturas RGBA de 16 bits y 32-bit Basado en OpenGL ES 1.1 Dentro de Cocos2D encontramos tres conceptos principales a considerar: escenas, capas y objetos. Las escenas equivalen a los niveles o vistas implementadas en un juego. Las capas se incorporan a las escenas y pueden contener uno o más objetos: menús, botones, etiquetas, cuerpos, etc. A su vez una escena puede contener una o más capas. 8.2.1 Implementación de Cocos2D en una aplicación 1. Descargar las librerías de Cocos2D para iPhone. 2. Ejecutar el siguiente comando en la consola (dentro de la carpeta descargada): ./install_template.sh 3. Crear un nuevo proyecto en Xcode de tipo cocos2d Application 52 Figura 8.2.1.a. Cocs2d - Nuevo proyecto 4. Compilar y Ejecutar Figura 8.2.1.b. Simulador iOS La plantilla creada nos muestra los principales elementos de una aplicación: CCDirector: Es el controlador principal de nuestra aplicación [CCDirector setDirectorType:CCDirectorTypeDefault]; 53 CCScene: Implementa las escenas o vistas CCScene *scene = [CCScene node]; CCLayer: Permite la creación de capas (HelloWorld es un objeto tipo CCLayer) HelloWorld *layer = [HelloWorld node]; CCLabel: Uno de los tipos de objetos que se pueden implementar dentro de una capa CCLabel* label = [CCLabel labelWithString:@"Hola Mundo" fontName:@"Marker Felt" fontSize:64]; En estos momentos tenemos implementadas las librerías de Cocos2D en nuestro proyecto de Xcode. Ahora podemos utilizar los diferentes componentes que nos brindan estas librerías y lograr una mejora en el desempeño de nuestras aplicaciones. En el siguiente artículo revisaremos los conceptos básicos y la utilización de los principales métodos del framework. 8.3 Tiled Map Editor El Tiled es un editor de mapas libre escrito en C++ y con la biblioteca QT. El programa es multiplataforma y de propósito general. Como su propio nombre indica está hecho para juegos que tienen sus mapas en forma de tiles (casillas) esto es la gran mayoría de los juegos 2D. 8.3.1 Características Mapas tanto ortogonales como isométricos. Formato de archivo XML. Soporte para múltiples capas tanto de tiles como de objetos. Soporte para múltiples tilesets. 54 Muy personalizable todas las propiedades de mapas con parejas de clave valor. Soporte de color clave y transparencias. Tamaño de los tiles y mapas totalmente personalizable. 8.3.2 Mapas ortogonales e isométricos Puedes crear mapas tanto en la vista clásica de los juegos 2D, como en la tan usada simulación del 3D a través de la vista isométrica. En la imagen inferior podemos ver la vista ortogonal. Figura 8.3.2. Tiled Map Editor – Vista ortogonal Apreciamos como el editor cuanta con herramientas básicas en la parte superior para el dibujado de mapas como el tampón, el cubo de pintura para rellenar o la goma de borrar, con un par de usos se controlan todas estas herramienta. En la parte derecha nos encontramos con dos paneles, en la parte superior el panel de capas. Desde este panel podemos gestionar en que capa queremos pintar, cambiarles el nombre, ocultarlas o modificarlas. A parte de elegir su transparencia. Debajo de este panel nos encontramos con el panel de tilesets que se gestionan mediante pestañas. Ambos paneles son arrastables y se pueden poner como ventanas flotantes o acomodarlos en cualquier lugar del editor y con cualquier tamaño. 55 8.3.3 Tamaño de los tiles y mapas totalmente personalizable Figura 8.3.3. Tiled Map Editor – Nuevo mapa Cuando creas un nuevo mapa te da a elegir si será ortogonal o isométrico. También te deja elegir el número de tiles de ancho y alto y el tamaño que tendrán los tiles. Como vemos totalmente configurable. 8.3.4 Color clave y tilesets Figura 8.3.4. Tiled Map Editor – Nuevo conjunto de patrones Cuando se carga un nuevo tileset al mapa nos deja elegir el nombre, la imagen del tileset. El tamaño de los tiles y el margen y espaciado, esto es, la distancia visual en las que el editor debe separar los tilesets para un correcto mapeado. También nos deja elegir si usar color transparente. En el caso de marcarlo podemos escoger un color que representar como transparente, muy útil para si tienes tilesets con un fondo puesto. 56 8.3.5 Capas de objetos Una característica muy interesante son las capas de objetos. Esto son capas especiales en las que se pueden colocar objetos rectangulares con la precisión a pixel y sin estar ligadas a los tiles. Cada objeto que creemos tiene un cuadro de propiedades accesibles desde el botón derecho. Figura 8.3.5.a. Tiled Map Editor – Propiedades del objeto En este cuadro de diálogo podemos configurar diferentes datos del objeto como el nombre, el tipo, la posición, tamaño. Debajo también tenemos una lista con dos campos nombre y valor. Estas listas nos permitan definir propiedades propias y definir un valor. Es muy personalizable. Estos cuadros de propiedades valor no solo están disponibles en los objetos. También los poseen los tilesets, las capas, los mapas y en realidad casi todos los elementos para que puedas definir propiedades clave valor de casi todo. Debajo podemos ver un ejemplo de las propiedades del mapa y posibles usos. 57 Figura 8.3.5.b. Tiled Map Editor – Propiedades del patrón 8.3.6 El formato TMX Cuando guardas un mapa, el programa crea un fichero con extensión .tmx este fichero en realidad no es más que un archivo XML que contiene todo los datos de nuestro mapa. Solo deberemos leer el archivo XML desde nuestro juego (casi todos los lenguajes tienen bibliotecas para trabajar con XML) y usar los datos como creamos convenientes. 8.4 VisualBoy Advance Es un emulador de la Nintendo GameBoy Advance, con el cual he extraído gran parte de los escenarios para el juego, mediante fichero .png que luego he tratado con Photoshop para luego utilizar estas imágenes en el Tiled Map Editor. 8.5 Photoshop Se trata esencialmente de una aplicación informática en forma de taller de pintura y fotografía que trabaja sobre un "lienzo" y que está destinado para la edición, retoque fotográfico y pintura a base de imágenes de mapa de bits (o gráficos rasterizados). Este programa lo hemos utilizado constantemente para diferentes cosas a lo largo del proyecto. Para la extracción de imágenes animadas, edición de imágenes, creación de los patrones para el Tiled Map Editor, etc. 58 8.6 Zwoptex Se trata de una aplicación para Mac OS X, mediante la cual podemos crear animaciones compatibles con la librería de cocos2d. En la imagen inferior podemos observar el programa en funcionamiento. Hemos escogido 4 imágenes que formarán parte de una de las animaciones que podremos ver en el juego. Figura 8.6. Zwoptex 8.7 Audacity Se trata de una aplicación para Mac OS X, mediante la cual podemos grabar el sonido y luego editarlo como a nosotros nos parezca oportuno. Hemos utilizado este programa para grabar algunos sonidos que faltaban al juego, estos sonidos están sacados del juego que nos hemos basado. 59 Figura 8.7. Audacity 60 9 Referencias Tutoriales: http://www.youtube.com/course?list=EC640F44F1C97BA581 http://www.youtube.com/course?list=EC53038489615793F7 http://www.youtube.com/course?list=ECD6327E00257AF1D0 http://bobueland.com/cocos2d/tutorials/ http://www.youtube.com/playlist?list=PL3D5A9CF48EDF6ED3&feature=plcp Otras páginas web de interés: http://www.goldensun-syndicate.net/sprites/ http://www.cocos2d-iphone.org/api-ref/latest-stable/ http://www.cocos2d-iphone.org/forum/ http://razonartificial.com/2010/12/tiled-map-editor-el-editor-de-mapas-libre/ 61