Beruflich Dokumente
Kultur Dokumente
El desarrollo de un videojuego es un proceso extenso. el cual abarca muchas reas, no solo la programacin. Se deben considerar gran cantidad de factores. Desde la arquitectura de hardware hasta compatibilidad de formatos y dispositivos. En el mercado actual de videojuegos son varias la empresas de desarrollo de videojuegos que dividen sus tareas en varios equipos. En esta tesis se investiga el uso de una herramienta diseada para facilitar el desarrollo de videojuegos. Esta herramienta es XNA Game Studio 3.1 creada por Microsoft. la cual entrega la posibilidad de desarrollar software para varias plataformas, entre estas tenemos PC, Xbox 360 y Zune. Adems se Investiga sobre como realizar integracin de fsica a un videojuego. con el n de hacer mas reales los proyectos de videojuegos. Se Abarcan varios aspectos y tecnicas utilizadas en el desarrollo de un videojuego como el uso de sprites, fuentes y texto, tecnicas 2D, musica, video, fsica etc...
ndice general
I. Introduccin
1.1. Objetivos 1.1.1. 1.1.2. 1.1.3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objetivo general
1
3 3 3 3
Objetivos especcos
4
5 6 6 7 8 9 11 12 12 12 13 14
Caractersticas de XNA
Sistema de coordenadas 2D
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
III.Desarrollo
3.1. Interfaz XNA 3.1.1. 3.1.2. 3.1.3. 3.1.4. 3.2. 3.3. 3.4. 3.5. 3.6. 3.2.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . El explorador de soluciones Ventana Principal.
15
16 16 17 17 18 18 19 22 23 24 25
Clases principales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Biblioteca de clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Capa Alpha (RGBA) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creando un Proyecto en XNA . . . . . . . . . . . . . . . . . . . . . . . . . . Propiedades de ventana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ii
NDICE GENERAL
NDICE GENERAL
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
26 32 36 39 47 47 53 54 63 64 67 67 67 74 74 74
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Rotacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.12. Parallax Scroll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.12.1. Implementar Parallax Scroll 3.13. Game Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.13.1. Crear un Game component . . . . . . . . . . . . . . . . . . . . . . . . 3.14. Msica y sonidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.14.1. XACT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.14.1.1. Utilizar XACT 3.15. Vdeo. 3.14.1.2. Mp3 y otros formatos
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IV.Fsica
4.1. 4.2. 4.3. 4.4. Fsica en un videojuego . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vector2 4.3.1. 4.4.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MathHelper
77
78 78 79 80 91 91
Colisiones 2D
95
96 97
A. Apndice
1.1. Algunos videojuegos creados con XNA. . . . . . . . . . . . . . . . . . . . . .
98
99
iii
ndice de guras
2.1. 2.2. 2.3. 2.4. 2.5. 3.1. 3.2. 3.3. 3.4. 3.5. 3.6. 3.7. 3.8. 3.9. Capas XNA Game Studio 3.1 Plano Cartesiano Ventana . . . . . . . . . . . . . . . . . . . . . . . . . . 5 7 10 11 13 16 17 17 18 19 20 21 21 22 24 25 26 27 28 29 29 30 30 31 32 33 34 35 35 36 37 Framework de XNA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Partes de un videojuego
3.11. Windows Game . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.12. Nave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.13. Agregar carpeta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.14. Agregar Imagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.15. Variables de imagenes 3.16. Cargar Imagenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.17. ContentRoot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.18. Dibujar Imagenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.19. Resultado dibujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.20. Variables de posicin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.21. Movimiento con posicin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.22. Modicando la posicin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.23. Movimiento con variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.24. Modicando la posicin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.25. Moviendo Sprite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.26. Variables de posicin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
iv
NDICE DE FIGURAS
NDICE DE FIGURAS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37 38 38 39 40 41 42 43 44 45 46 46 47 48 48 49 49 50 51 51 52 52 53 54 55 55 56 56 57 58 59 60 60 61 61 62 63 65 66 68 68 69
3.28. Movimiento y rotacin 3.30. Resultado rotacin 3.32. Plantilla Sprite Font
3.29. Dibujando rotacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.31. Nuevo elemento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.33. Archivo SpriteFont XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.34. Error por fuente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.35. Caracteres soportados 3.36. Variables para fuentes 3.38. Resultado DrawString . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.40. Frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.41. Variables y constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.42. Metodo Load de spritesheet 3.43. Metodo Update frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.44. Metodo Draw de spritesheet . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.45. Game1 Spritesheet Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.46. Game1 Spritesheet Initialize, Load . . . . . . . . . . . . . . . . . . . . . . . 3.47. Game1 Spritesheet Update . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.48. Game1 Spritesheet Draw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.49. Resultado SpriteSheet 3.50. Fondo cielo 3.52. Clase Fondos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.54. Fondos AdicionarFondo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.55. Fondos CompararProfundidades . . . . . . . . . . . . . . . . . . . . . . . . . 3.56. Fondos Mover . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.57. Fondos Dibujar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.58. Fondos Dibujar (Continuacin)
3.59. Otros mtodos Mover . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.60. Fondos SetPosicionFondo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.61. Fondos Actualizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.62. Variables e Instancia para Scroll Parallax . . . . . . . . . . . . . . . . . . . . 3.63. Fondos LoadContent 3.65. Crear GC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.64. Resultado Parallax Scroll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.66. Game Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.67. Ubicacin XACT 3.68. XACT nuevo proyecto
NDICE DE FIGURAS
NDICE DE FIGURAS
3.70. Nuevos Banks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.71. XACT con archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.72. XACT Opciones de Audio 3.51. Capas con transparencia 4.1. 4.2. 4.3. 4.4. 4.5. 4.6. 4.7. 4.8. 4.9. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.73. Variables para XACT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70 72 73 74 76 79 80 81 82 83 84 84 85 85 86 87 88 89 90 91 92 92 93 93 94 99 100 101
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.10. Update cajas (Continuacin) . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.11. Draw cajas 4.12. Resultado BoundingBox Intersect . . . . . . . . . . . . . . . . . . . . . . . . 4.13. Resultado BoundingBox Contains . . . . . . . . . . . . . . . . . . . . . . . . 4.14. BoundingSphere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.15. Complejidad de colisiones 4.16. Variables para gravedad 4.17. Initialize con gravedad 4.18. Update gravedad 4.19. Resultado Cada Libre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.20. Trayectoria de un proyectil . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1. 1.2. 1.3. Pong y Space Invaders con XNA . . . . . . . . . . . . . . . . . . . . . . . . . Invasin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Juego CanonSlaught
vi
Captulo I Introduccin
CAPTULO I. INTRODUCCIN
El desarrollo de un videojuego es un proceso que ha ido evolucionando con el tiempo y mayormente con el cambio tecnolgico. Si bien el comienzo de los videojuegos fue motivado por curiosidad y el ocio, hoy en da el mundo de los videojuegos es un mercado tremendamente lucrativo. Las reas comprendidas en el desarrollo de un videojuego se ha incrementado debido a la mayor innovacin y crecimiento en la industria del software; tanto as, que su crecimiento supero en trmino de ventas a la industria del cine y la msica. Un ejemplo de claro de ello fue Call of Duty: Modern Warfare 2 , consiguiendo 410 millones de dlares en su primer da de salida. Los videojuegos de hoy en da son bastante complejos, con algoritmos y mtodos de desarrollo nicos; cuyo desarrollo requiere la interaccin de gran cantidad de profesionales de muy diversas reas. Prcticamente todas las ramas de las ciencias de la computacin tienen su aplicacin en videojuegos. Si bien el mercado de los videojuegos presenta un nivel de competencia y exigencia alto. Un buen videojuego es aquel que resulta entretenido y adictivo. El cual se puede lograr sin gastar millones.
1 Videojuego
1.1. OBJETIVOS
CAPTULO I. INTRODUCCIN
1.1.
Objetivos
Capitulo II:
videojuego.
Expone el marco terico donde se detalla que es XNA y cuales son sus
Game Studio 3.1. En este captulo se explica como es la integracin de fsica en XNA
2.1. XNA
2.1.
XNA
XNA no es un acrnimo, es decir no son siglas. XNA es una API (Interfaz de programacin de aplicaciones). Desarrollada por Microsoft para facilitar el desarrollo de videojuegos para las plataformas Xbox 360, Zune, Windows y Windows Phone 7, esta ultima solo disponible a contar de la versin 4.0 de XNA Game Studio. Tcnicamente XNA es un marco de trabajo (Framework) el cual esta basado en .NET Framework. Las diferentes capas de XNA como se puede apreciar en la imagen 2.1. De arriba hacia abajo, XNA Game Studio utiliza la funcionalidad de XNA Framework y este a su vez esta basado en .NET Framework. Al nal encontramos las plataformas a las que van destinadas las aplicaciones que se logren desarrollar con XNA Game Studio. en este caso y para uso de la tesis la versin 3.1
XNA es una plataforma de desarrollo de videojuegos sobre directx, la cual proporciona bastante funcionalidad sobre las APIs multimedia de Microsoft. Lo que no permite poder centrarnos en lo que queremos hacer con nuestro juego y despreocuparnos de como hacerlo.
2.1. XNA
2.1. XNA
2.1.2.1.
Gracamente el framework de XNA se puede apreciar en la imagen 2.2, donde se destaca que el programador solo se preocuparia del cdigo y del contenido dejando lo dems a XNA. facilitando enormemente la tarea de desarrollar un videojuego. Podemos entender el framework en cuatro capas.
Plataforma
La plataforma es la capa mas baja. Esta compuesta por un conjunto de APIs que son la base de XNA. algunas de estas son Direct3D, XACT, Xinput, Xcontent
2.1. XNA
Framework extendido
La principal labor de esta capa es hacer del desarrollo de juegos algo fcil. Actualmente esta capa tiene dos componentes principales: el modelo de aplicacin y el Content Pipeline.
Juegos
Los juegos son la capa ms alta (incluso aunque estn al nal de esta lista!). Esta capa est formada por el cdigo del juego y su contenido.
Grcos
El API grco est basado en el de Direct3D. Empez siendo muy similar al de Managed DirectX (MDX) pero nalmente pas una serie de refactorizaciones y limpiado hacindolo incluso ms fcil y consistente con las guas de diseo de .NET. Un gran cambio de MDX que incluyeron fue la supresin de las funciones jas para el cauce grco a favor de un cauce grco programable a travs de shaders. Para aquellos que todava no saben escribir shaders XNA incorpora una clase bsica llamada BasicEect que podremos usarla para pintar rpidamente sin tener que programar nada extra. Una vez aprendamos a escribir nuestros propios shaders podremos sustituir esta clase bsica para incluir nuestros propios cheros.
Audio
El API de audio est construido sobre XACT (aunque XNA ya soporta reproduccin de archivos .wav .wma y .mp3) XACT ES la multiplataforma de audio de Microsoft para Windows y Xbox360. La idea detrs de XACT es similar a la de los shaders con Direct3D. La herramienta XACT crea
2.1. XNA
paquetes de efectos de sonido pudiendo congurar aspectos como el volumen, looping, mezclado de canales etc. Los desarrolladores luego cogen el paquete, lo cargan y en seguida pueden reproducir los archivos por su nombre, sin tener que inicializar buers, streaming de datos u otro tipo de inicializacin.
Dispositivos de entrada
El API para los dispositivos de entrada est construida sobre XInput, el API que dirige a los controles de la Xbox 360. Ofrece un modo inmediato que no requiere inicializacin. No hay que preocuparse sobre adquirir o liberar un dispositivo, establecer el modo compartido, etc. Lo nico que necesitamos es llamar a GetState sobre el tipo de controlador apropiado y ya est. Adems se proporciona un tipo llamado GamePad que representa a los mandos de Xbox360 y Windows, as como para el teclado y el ratn.
Almacenamiento
El API de almacenamiento proporciona la forma en la que podemos leer y escribir datos (como partidas grabadas, lista de mximas puntuaciones, etc.) de forma independiente a la plataforma donde se est ejecutando el juego. En Windows es bastante sencillo ya que tenemos clases de entrada y salida para manejar todo esto. En Xbox 360, necesitamos asociar un game state con un perl y un dispositivo de almacenamiento, como el disco duro o una unidad de memoria. Pero de nuevo todo esto se consigue de manera sencilla y transparente para el desarrollador, de forma que el mismo cdigo para Windows servir para un juego de Xbox 360.
Matemticas
XNA incluye los tipos ms usados para la programacin de juegos como Vectores de dos, tres y cuatro componentes, matrices, planos, rayos. Tambin se incluyen boundingBox, boundingSpheres y BoundingFrustrum. Estos volmenes incluyen mtodos para hacer test de intersecciones y poder detectar colisiones.
2.1. XNA
Como se aprecia en la imagen 2.3 el eje x aumenta a medida que no alejamos del centro hacia la derecha y decrece a medida que nos alejamos del centro hacia la izquierda. Y para el eje vertical y ocurre lo mismo. aumenta a medida que nos alejamos hacia arriba y decrece a medida que bajamos. El sistema de coordenadas en XNA es similar. salvo que el origen o punto (0,0) se encuentra en el extremo superior izquierdo de la pantalla. Los valores en Y aumentan a medida que descendemos por la pantalla y en consecuencia los valores en X aumentan a medida que avanzamos horizontalmente por la pantalla. Gracamente quedara as 2.4
10
Es importante mencionar que la unidad en vez de ser metros o centmetros, en XNA o en el general de los videojuegos es el pixel. En consecuencia el dibujo estar limitado a la resolucin en la que se este trabajando. Sin embargo esto no implica que no podamos dibujar por ejemplo en una resolucin de 800*600 pixeles en el punto (900, 300). en denitiva podremos, pero este no sera visible para el jugador. El dibujar fuera del rea de trabajo o vista es una tcnica que se ha utilizado bastante en los juegos 2D. ya que la carga de imagenes se har fuera de la vista del jugador y as este no se vera sorprendido por la repentina aparicin de un sprite. Un aspecto a considerar al momento de dibujar Sprites 2D es que al igual que con el origen del plano en XNA. el dibujo de la textura considerara el extremo superior izquierdo como origen.
2.2.
Content Pipeline
En la actualidad los videojuegos incorporan gran cantidad de contenidos gracos y sonoros de gran calidad. Es posible apreciar gran contenido digital mezclando imagenes 2D de alta resolucin, modelos 3D, efectos y sonidos etc.. Si bien estos contenidos puedes desarrollarse paralelamente al videojuego y quedar a cargo de personas que no son necesariamente programadores por ejemplo un diseador. llega
11
el momento en que hay que incluir los contenidos al videojuego, y esta no es una tarea fcil desde el punto de vista de la programacin. En empresas desarrolladoras de videojuegos se crea un equipo que se encarga nicamente de esta tarea. ya que ella conlleva realizar exportaciones o creacin de programas de exportacin del contenido a un formato legible para el juego, realizar la codicacin para cargarlo. En resumen, hacer todo el trabajo necesario para reproducirlo correctamente en el juego. XNA nos libera de esa tarea con su propio Content Pipeline. que nos permite agregar a nuestro videojuego archivos de imagen, sonido, efectos, vdeos etc..
2.3.
2.4.
Diseo de un videojuego
Segn el libro The Art of Game Design: A book of lenses escrito por Jesse Schell Un buen videojuego, es aquel que logra sacar lo mejor de todas las partes que hacen o componen un videojuego 2.5.
12
13
14
3.1.
Interfaz XNA
La interfaz sobre la que trabajaremos es la de Visual Studio ya que XNA es un framework. por lo que las teclas de acceso rpido (HotKeys) nos sern familiares. pro ejemplo para guardar Ctrl + g para ejecutar nuestra aplicacin o juego en este caso F5 para interrumpir la ejecucin Shift + F5. Un HotKeys interesante es el de depurar con la tecla F11 Ya que tras depurar dejara marcado en amarillo la siguiente linea a ejecutar. Las tres partes mas importantes de la interfaz y que que utilizaremos para la programacin de nuestro juego son el Explorador de soluciones la Lista de errores y la Ventana principal.
16
17
3.2.
Clases principales
Program.cs Game1.cs
Esta clase inicializa nuestro juego, no es necesario modicarla para correr nues-
tro proyecto. 3.5 Esta es la clase base del juego. es la mas importante ya que en ella iran las lineas
18
19
Game1.cs
Primero encontramos los using 3.6 que son los encargados de importar lo necesario de .NET y XNA a nuestro proyecto.
20
Despus tenemos el mtodo Constructor 3.7, en este mtodo debemos colocar lo que querramos que se ejecute obligatoriamente, como la ubicacin del Content, la resolucin de pantalla etc.. Luego tenemos el mtodo Initialize 3.7 Colocaremos la lgica del videojuego, por ejemplo las posiciones de los elementos del proyecto.
21
Por ultimo los metodos Update y Draw. El mtodo Update, se ejecuta constantemente y es donde actualizaremos el estado del videojuego, por ejemplo aqu programaremos el movimiento de los Sprites al pulsar el teclado. Y el mtodo Draw es el encargad de dibujar por pantalla los elementos del proyecto.
3.3.
Biblioteca de clases1
La coleccin de XNA Framework es una biblioteca de clases, interfaces y tipos de valores que se incluyen en XNA Game Studio. Esta biblioteca proporciona acceso a la funcionalidad de XNA Framework y est diseada para ser la base sobre la cual construir aplicaciones, componentes, y los controle con XNA Game Studio.
1 Traduccin
de http://msdn.microsoft.com
22
Microsoft.Xna.Framework
Microsoft.Xna.Framework.Audio
nipular proyectos XACT. Estos son los que contienen archivos de audio.
Microsoft.Xna.Framework.Content
el Content Pipeline.
Microsoft.Xna.Framework.Design
Microsoft.Xna.Framework.GamerServices
tos servicios relacionados con los jugadores. Estos servicios se comunican directamente con el jugador, los datos del jugador, o de otra manera reejan las opciones del jugador hace. los servicios de jugador incluyen dispositivo de entrada y las API de datos de perl.
Microsoft.Xna.Framework.Graphics
Microsoft.Xna.Framework.Graphics.PackedVector
componentes que no son mltiplos de 8 bits.
ratn y dispositivos de Xbox 360. Contiene clases para enumerar y utilizar elementos
multimedia como lbumes, listas de reproduccin y fotos. Contiene clases que implementan soporte para el uso de
Microsoft.Xna.Framework.Storage
de archivos.
3.4.
XNA permite trabajar con transparencias en las texturas, es decir, con el canal alfa de un color RGBA (Red, green, blue, alpha). Existen 2 vas para conseguir que una textura tenga capa alfa. La primera trabajar con imagenes .png que ya contienen la capa alfa, incluso si creamos de cero una imagen .png el editor de imagenes nos preguntar si se desea crear como transparencia. El otro modo de conseguir una transparencia en una textura es a partir del magenta puro (255,0,255) el cual XNA automticamente reconoce como capa de transparencia de la textura.
23
3.5.
Para trabajar con XNA lo primero que debemos hacer hacer, es correr Microsoft Visual Studio. Si lo ejecutamos por primera vez, seleccionar el lenguaje C# como el que se va a utilizar. Al instalar XNA Game Studio 3.1, por defecto en el men de inicio en la opcin todos los programas, dentro de la carpeta de Microsoft XNA Game Studio 3.1 habr un acceso directo a Visual Studio. Ulteriormente a la ejecucin de Visual Studio seleccionamos en archivo Nuevo Proyecto como se aprecia en la imagen 3.10
Inmediatamente se nos preguntara por el tipo de proyecto. seleccionamos dentro de visual C# que sea XNA Game Studio 3.1 y como plantilla elegimos Windows Game 3.1
24
Como se puede apreciar en la imagen 3.11dentro de las plantillas disponibles tambin se encuentran una para Xbox 360 y Zune que son las otras plataformas para las que podramos hacer nuestro juego. Tambin se pueden crear sus respectivas libreras que guardaran clases y el proyecto quedara como un DLL.y tambin aparece un Starter Kit que es una buena referencia si se quiere hacer un videojuego de plataformas. Por ultimo podremos modicar el nombre de nuestro proyecto y su ubicacin, tambin el nombre del juego que equivale a nombre de la solucin. Luego de aceptar ya esta todo listo para comenzar a programar un videojuego.
3.6.
Propiedades de ventana
Hay propiedades como la resolucin o titulo de la ventana que podemos modicar con unas pocas lineas de cdigo, y as aprovechar mejor las posibilidades de la pantalla y dar un toque personal al videojuego. Las propiedades referentes a la pantalla las realizamos en el constructor. Para iniciar la aplicacin a pantalla completa 3.6.
25
this
. graphics . IsFullScreen =
true ;
Permitir que el usuario modique con el mouse las dimensiones de la pantalla 3.6.
this
. Window . A l l o w U s e r R e s i z i n g =
true ;
this
3.6.
this
. graphics . PreferredBackB
Y por ultimo para modicar el titulo de la ventana, agregamos dentro del mtodo Initialize
3.7.
El termino Sprite hace referencia a una imagen rasterizada o mapa de bits. que son muy utilizadas en los juegos de dos dimensiones. el protagonista de un videojuego puede estar representado por uno o mas sprites. un ejemplo de Sprite es esta nave 3.12que fue dibujada con Adobe Photoshop CS y la cual utilizaremos para explicar como colocar una imagen utilizando XNA.
Los formatos aceptados por XNA son: 1. - BMP 2. - JPG/JPEG 3. - PNG 4. - TGA 5. - DDS
26
Cualquier imagen, sonido, XML o incluso modelos 3D los incluiremos en nuestro proyecto a travs del explorador de soluciones. Para mantener un mayor control y orden sobre nuestro proyecto es recomendable, crear carpetas con nombres descriptivos. por ejemplo para los sprites una carpeta sprites, para la fuentes una carpeta fuente y as respectivamente. Esta carpetas se pueden crear apretando click derecho en Content(Carpeta de contenido) que se encuentra en el explorador de soluciones. 3.13
Creada nuestra carpeta Sprites procedemos a agregar nuestra nave. Tambin con click derecho pero esta vez sobre la carpeta Sprites 3.14y elegimos en agregar elemento existente. Luego se nos preguntara la ubicacin de la imagen que queremos agregar y aceptamos. Veremos que inmediatamente debajo de la carpeta Sprites quedo nuestra imagen. Para hacer mas completo el ejemplo agregaremos otra imagen, que en este caso har de fondo, as parecer que nuestra nave esta en algn lugar.
27
Luego de haber agregado las imagenes hacemos doble click sobre la clase principal Game1.cs. as en la parte central del entorno de trabajo se nos cargara el cdigo por defecto de esta clase, con esto nalizamos con el explorador de soluciones y procedemos a escribir cdigo. debajo de la clase Game1 y de los manejadores de trcos y sprites, colocaremos las variables correspondientes a la nave y el fondo como se aprecia en la siguiente imagen 3.15.
28
Estas variables sern del tipo Texture2D que es una variable diseada para contener este tipo de archivos y poder manejarlos facilmente. Tambin podemos encontrar el tipo de variable Texture3D que es para modelos en tres dimensiones. Declaradas las variables ahora nos ubicaremos en el mtodo LoadContent 3.16 podemos utilizar el listado de mtodos para llegar facilmente. aqu es donde especicaremos la ubicacin de nuestras recin agregadas imagenes. as el videojuego las puede cargar al momento de ejecutar el juego.
La propiedad Content, es de nuestra clase, la obtiene cuando se Hereda la clase Game a la nuestra. Como su nombre lo dice, trabaja sobre nuestra carpeta Content. -La funcin Load,
29
se utiliza para cargar, dentro de las < > se coloca el tipo de objeto que vamos a cargar, como la nuestra es del tipo Texture2D, le ponemos Texture2D. -Dentro de los parntesis, seguido de unas comillas colocamos la ruta de nuestra imagen, hay dos cosas a tener en cuenta, primero que nosotros no debemos poner Content/nave.png, eso es por que arriba esta puesto Content.RootDirectory, 3.17 ah se le dice donde esta nuestro Content. Y segundo, no debemos poner la extensin de nuestra imagen, con solo poner el nombre alcanza, as tambin con lo que sea que estemos cargando.
Figura 3.17: ContentRoot Luego a travs del listado de mtodos seleccionamos Draw y aqu es donde comienza el dibujo. Es importante considerar el orden en que colocamos los sprites ya que estos se superpondran uno sobre otro. entonces si colocsemos el fondo sobre la nave esta ultima no seria visible. para comenzar el dibujo hay que inicialisar el spriteBatch quedara as: spriteBatch.Begin(); 3.18
30
Usamos la propiedad Draw del spriteBatch para dibujar. Como primer parmetro, pide el nombre de la variable donde guardamos la textura. Como segundo parmetro colocamos la posicin donde dibujaremos. en la imagen vemos que el fondo tiene la posicin Vector2.Zero esto indica q dibuje en el origen. y la nave estar en la posicin X=100 e Y=300, el ultimo parmetro el color de colocar red veramos nuestra nave con un ltro rojo, white la muestra tal cual la habamos dibujado. Por ultimo Cerramos el spriteBatch, con spriteBatch.End(); ahora solo queda compilar y ejecutar con F5 y la aplicacin se vera como la imagen a continuacin. 3.19
31
3.8. MOVIMIENTO
3.8.
Movimiento
Ya sabiendo colocar imagenes y mostrarlas por pantalla ha llegado el momento de poder moverlas en el espacio de juego. como nuestro juego se desenvuelve en dos dimenciones nos moveremos a travs del eje X e Y. de ser uno en 3 dimensiones serian en el eje X, Y, Z. Para manejar el movimiento crearemos justo debajo de nuestras variables gracas dos variables del tipo int que guardaran la posicin en X e Y. 3.20 Podemos tambin utilizar una sola variable del tipo Vector2. Utilizaremos las dos formas ya que como sabemos en la programacin hay muchas maneras de realizar lo mismo.
Figura 3.20: Variables de posicin La variable del tipo Vector2 de nombre inicio adquiere sus valores en el mtodo Initialize y la inicializamos as: 3.8 inicio = new Vector2 ( 0 , 0 ) ;
Donde el primer parmetro es la posicin en X y la segunda es la posicin en Y. tambin podemos inicializarla as: inicio = Vector2 . Zero ;
Que de igual forma hace referencia al origen. A continuacin controlaremos el movimiento de nuestro sprite a travs del teclado. y la clase que se encarga de ello es KeyboardState que captura cuando se presiona o no una tecla. Esta clase tiene 2 propiedades que son las mas comnmente usadas:
IsKeyUp
Detecta si la tecla ingresada como parmetro NO esta pulsada. Detecta si la tecla ingresada como parmetro esta siendo apretada.
IsKeyDown
En el mtodo Update la cual siempre se estar actualizando durante la ejecucin del juego, colocamos: KeyboardState k e y b o a r d = Keyboard . G e t S t a t e ( ) ;
32
3.8. MOVIMIENTO
Ahora lo que nos interesa es mover nuestro sprite y esto lo haremos a travs de sentencias if 3.21vericamos si se presionaron la teclas pensadas para mover el sprite (Arriba, abajo, izquierda, derecha) y modicamos las variables de posicin.
Se puede apreciar tambin en la imagen, que se asigno la accin salir si se presiona la tecla Escape y de igual forma si se presiona el botn back en el Gamepad del jugador 1. Ahora solo bastara modicar la posicin que le asignemos al sprite nave en el mtodo Draw como se ve a continuacin.
33
3.8. MOVIMIENTO
Ahora al dibujar podremos mover la nave ya que pos_x y pos_y sern modicadas por las teclas Arriba, abajo, izquierda, derecha. tambin vemos que la posicin del sprite fondo ya no es Vector2.Zero. la hemos reemplazado por la variable inicio que tambin tiene los valores 0,0. por lo que el fondo se mantendr igual a cuando habamos cargado por primera vez. Ahora expondremos otra opcin, que es basar el movimiento en una sola variable del tipo Vector2. Para explicar esta otra alternativa utilizaremos el mismo cdigo que venamos utilizando para explicar el movimiento. la diferencia esta en que ya no utilizaremos las variables
pos_x ni pos_y .
Como ya habamos declarado una variable del tipo Vector2 que se llamaba inicio , utilizaremos esta para aplicar movimiento a nuestro sprite. Modicamos el Update pero en vez de modicar dos variables distintas aqu solo indicamos que propiedad de la variable nos interesa modicar. (Ventaja de la POO ). Entonces si queremos modicar el eje Y especicaremos que queremos modicar solo inicio.Y y lo mismo con el eje X3.23
2 Programacin
Orientada a Objeto
34
3.8. MOVIMIENTO
Figura 3.23: Movimiento con variable Ahora en el mtodo Draw especicamos que la posicin de el sprite nave sera la variable inicio. 3.24 y modicamos tambin el parmetro de posicin del fondo ya que si lo dejsemos tambin con la variable inicio el fondo se movera al mismo tiempo que la nave. provocando un interesante efecto espejo.
Figura 3.24: Modicando la posicin La utilizacion de cualquiera de estos dos mtodos para mover un sprite entregara el mismo resultado. 3.25 Pero una ventaja interesante que tiene el tipo Vector2 es que posee
35
3.9. ROTACIN
3.9.
Rotacin
En esta explicacion optaremos por utilizar variables del tipo Vector2, como habamos mencionado antes este tipo de variable posee implementadas varias funciones matemticas, las cuales utilizaremos para dar rotacin a nuestro sprite. Para mayor comodidad modicaremos el cdigo que habamos hecho para explicar el movimiento de una imagen o sprite. primero borraremos la variables pos_x y pos_y dejando solo la variable inicio la cual dejaremos para especicar donde dibujar el fondo, y agregaremos una variable del tipo Vector2 que utilizaremos para la posicin de la nave y tendr nombre posicion. crearemos tambin una variable del tipo oat la cual se encargara de la rotacion y por defecto llamaremos rotacion. 3.26
36
3.9. ROTACIN
Ahora inicialisamos nuestros vectores indicndoles su posicin y a la variable rotacin le asignamos un valor otante que representara los grados, para comenzar sera cero:
Ahora para agregar rotacin adems de movimiento con las teclas, modicaremos el mtodo Update que habamos utilizado para mover la imagen. cambiamos la variable inicio por posicin. y adems agregamos un if, preguntando si se presiono la tecla espacio (Space). la cual modicara el ngulo de rotacin en 5 grados.
37
3.9. ROTACIN
Figura 3.28: Movimiento y rotacin Para hacer efectiva la rotacin del sprite, debemos agregar mas parmetros al spriteBatch como se aprecia en la imagen. 3.29
Figura 3.29: Dibujando rotacin Los parmetros mas importantes son despus del parmetro Color, donde se indican los
38
grados de rotacin, luego de este parmetro se indica el inicio de la rotacin que seria el centro de la nave. Y como resultado nal ahora podemos mover la nave por pantalla y si apretamos la tecla espacio la nave rotara. 3.30
3.10.
Texto y fuentes
En cualquier videojuego es importante mostrar informacin por pantalla. puede ser instrucciones, puntajes, conversaciones, narracin o la historia misma del juego Para escribir en XNA es necesario agregar un nuevo elemento del tipo Sprite Font que sera la fuente que utilizaremos para escribir. esto lo hacemos con click derecho 3.31 en Content (explorador de soluciones) o para mayor orden y control crear una carpeta llamada fuentes. seleccionamos agregar Nuevo elemento luego nos preguntara que tipo de plantilla queremos agregar y elegimos Sprite Font. 3.32 (podemos modicar el nombre de la fuente a crear, pero no hay que modicar la extensin).
39
40
Esto generara un archivo en lenguaje XML que inmediatamente se cargara en el centro de pantalla para su modicacin. 3.33 este archivo tiene informacin sobre el tipo de letra, tamao, espacio entre caracteres, estilo etc.. y el cual podemos modicar a gusto. siempre y cuando sepamos que estamos haciendo ya que es muy probable que la lista de errores nos indique un error y es poco probable que pensemos en las fuentes aunque si leemos detalladamente se menciona Spritefont. Tambin es importante considerar la fuente de letra que se ocupe ya que esta depende exclusivamente de las que posea el pc donde se ejecute la aplicacin.
41
42
Si leemos detalladamente se menciona que un carcter no es soportado por el SpriteFont. Para solucionar este error abrimos nuestro archivo XML, y nos dirigimos al nal de este. Ah modicaremos el numero dentro de las etiquetas <End></End> que por defecto tiene el valor 126 y lo dejamos en 260. 3.35 si leemos los comentarios sobre CharacterRegions vemos que se menciona la tabla de caracteres ASCII. ah se explica que dejando el valor en 126 se cubren los caracteres del latn bsico, por ello es que aumentamos el valor a 260.
43
Para cargar nuestros Spritefonts por pantalla(escribir en pantalla) primero creamos una variable por cada fuente que hayamos creado. y las declaramos en la clase principal como todas las variables que ya hemos utilizado para el dibujo y movimiento de un sprite. agregamos las variables de las fuentes a nuestro cdigo y quedara as.
44
Al igual que con las imagenes debemos cargar la fuente e indicarle la ruta en que se encuentra. En LoadContent escribimos: f u e n t e 1 = C o n t e n t . Load<S p r i t e F o n t >(" F u e n t e s / f u e n t e 1 " ) ; f u e n t e 2 = C o n t e n t . Load<S p r i t e F o n t >(" F u e n t e s / f u e n t e 2 " ) ; Recordemos que no es necesario escribir la extensin del archivo gracias a Content.RootDirectory 3.17. Ahora solo queda dibujar. y al igual que si fuera un sprite la fuente la dibujaremos en en el mtodo Draw() la diferencia radica en que en vez de utilizar la mtodo Draw del spriteBatch usaremos el mtodo DrawString el cual nos permite ingresar una cadena por parmetro. podemos concatenar tambin una variable con el smbolo + seguido de la cadena entre . Al igual que si fuera un sprite tambin le indicamos la posicin donde queremos que escriba. vemos que a un vector podemos aplicar el operador /, tambin podemos utilizar el operador
* pero no as el + ni el -.
45
46
3.11. SPRITESHEET
3.11.
SpriteSheet
Otra interesante tcnica utilizada en los juegos 2D es el uso de sprite sheet (Hoja de duendecillos). Como mencionamos antes en 3.7 se usan sprites para representar algn objeto o personaje en un videojuego. pues lo que hace la hoja de duendecillos es contener todos los frames de una animacin de personaje u objeto en un mismo archivo. y en base a clculos que implican el largo y ancho del fotograma se puede reproducir la animacin en la aplicacin.
La idea bsica de una animacin es mostrar frames en un determinado tiempo. Como podemos apreciar en el spritesheet 3.39 este posee doce dibujos de Guybrush las cuales pertenecen a una pose especica, las cuales mostradas en orden produciran el efecto de movimiento y que nuestro personaje camina. entonces lo que debemos indicarle a XNA es que frame mostrar, cuando cambiar el frame y cual es el siguiente frame.
47
3.11. SPRITESHEET
Figura 3.40: Frames En la imagen 3.40 se aprecia mejor el como estn los frames en la hoja y cual seria el orden del ciclo para hacer la animacin. Para tratar los spritesheet es recomendable crear una clase nueva en el proyecto. la llamaremos TexturaAnimada esta clase sera la encargada de especicar que frame dibujar y cuales son sus coordenadas dentro del spritesheet. Variables y el constructor 3.41
48
3.11. SPRITESHEET
En el constructor encontramos:
Position
Almacenara la posicin de donde dibujar el sprite o frame en este caso. Almacena el numero de frames que contiene el spritesheet. Calcula el tiempo que sera mostrado cada frame.
framecount
timePerFrame frame
Indica el frame actual, colocar cero har que la animacin comience por el primer
frame.
totalElapsed
Tiempo transcurrido.
Habr un mtodo Load en la clase, el cual recibe el content desde la clase Game1 y el nombre de la imagen para poder cargarla.
Figura 3.42: Metodo Load de spritesheet Se creara un mtodo UpdateFrame 3.43 el cual recibe recibe el tiempo que ha pasado desde la ltima vez que fue llamado y comprueba si ya se ha sobrepasado el tiempo de un frame para cambiarlo al siguiente.
Figura 3.43: Metodo Update frame Y por ultimo se creara un mtodo llamado DrawFrame. Este servir para localizar el frame a dibujar dentro del spritesheet, para ello se divide el ancho del sprite sheet entre el
49
3.11. SPRITESHEET
numero de frames para saber cuanto es el ancho de cada uno. Y el rectngulo sourcerect se encarga de seleccionar el frame a pintar. Una vez tenemos todo, lo pintamos por pantalla con el mtodo Draw. En la imagen 3.44 podemos apreciar que el mtodo DrawFrame aparece dos veces, el primero es el que dibuja realmente, el segundo prepara el dibujo que es el que realiza las tareas mencionadas anteriormente como localizar el frame y calcular su ancho.
En la clase Game1.cs l que se hace es denir las constantes de nmero de frames y de frames por segundo, creamos el objeto de la clase TexturaAnimada y la iniciamos. Cargar la textura en el Load(), actualizar el frame pasndole port parmetro el tiempo transcurrido y dibujar el frame actual, todo eso manejado por la clase auxiliar de nombre TexturaAnimada.
50
3.11. SPRITESHEET
51
3.11. SPRITESHEET
Y como resultado de todo esto podremos ver a Guybrush Caminando campante por la playa.
52
3.12.
Parallax Scroll
Parallax Scroll o Scrolling Parallax es una tcnica bastante usada en los juegos 2D. Si bien hemos notado Scroll horizontal en Super Mario World o Scroll vertical en Aero Fighters ambos para la plataforma SNES
3 Super
esta tcnica lo que hace es mover varias capas superpuestas a distintas velocidades. simulando movimiento y profundidad. Una aplicacin tpica es el de mover un fondo de cielo lentamente, luego sobre este algunas montaas un poco mas rpido, y sobre este un suelo de tierra mas rpido aun. entonces se produce el efecto de que se estuviera avanzando en el escenario.
Figura 3.50: Fondo cielo La imagenes con transparencias 3.51 no se pueden apreciar del todo bien ya que el editor Lyx no soporta transparencias. Para manejar las capas se creara una nueva Clase en el proyecto, la que llamaremos Fondos. En Fondos.cs denimos 3.52.
54
Figura 3.52: Clase Fondos En la clase Fondos 3.52 Esta la denicin de una textura o capa y atributos de esta como posicin, profundidad, velocidad, direccin, tamao y color con que se dibujara. Ahora para poder manejar mas de un fondo o capa se creara dentro de Fonds.cs una nueva clase de nombre MultiFondos 3.53.
Figura 3.53: Clase MultiFondos La clase MultiFondos, va a ser la encargada de posicionar y mover los fondos o capas. En el constructor se recibe un objeto del tipo GraphicsDeviceManager, para posteriormente dibujar las capas. La clase posee dos variables del tipo Boolean: de nombres Moviendose y moverHorizontal, las cuales indicaran si una capa o fondo se esta moviendo, tambin hay una lista genrica, para ir guardando los fondos.
55
Figura 3.54: Fondos AdicionarFondo Este mtodo recibe los parmetros bsicos para inicializar la clase Fondo, luego se adiciona la capa a la lista. El segundo mtodo es el de CompararProfundidades
Figura 3.55: Fondos CompararProfundidades CompararProfundidades sirve para ordenar los fondos desde el ms lejano al mas cercano, este mtodo recibe dos fondos y compara su propiedad profundidad.
56
El mtodo Mover(), es uno de los ms importantes, debido a que este mtodo toma cada fondo de la lista, y verica si el estado de la propiedad movindose es true, luego se verica la propiedad moverHorizontal, y si esta es true se mueve el fondo en el eje de las X, dependiendo de la velocidad que hayamos inicializado y en la direccin especica, si es -1 se mover de derecha a izquierda o de abajo hacia arriba, Si se encuentra en false moverHorizontal se procede a mover Verticalmente. Mtodo Dibujar 3.57.
57
58
El mtodo Dibujar(), ordena los fondos, y luego utiliza la clase SpriteBatch para dibujar los fondos, de acuerdo a si se va a dibujar Horizontalmente o Verticalmente, y adems verica los limites, para cuando el fondo se haya pasado del lmite (salir de la pantalla) entonces volver a empezar a dibujar, hace un ciclo de la misma imagen. Los otros mtodos 3.59son tiles para congurar el movimiento de los fondos, y detener la animacin.
59
Por ultimo el mtodo Actualizar hace lo mismo que el mtodo Mover, pero recibe como parmetro la velocidad del juego (GameTime), esta variable cambia dependiendo de la potencia del computador.
60
Para usar la tcnica Scroll Parallax en nuestra clase principal Game1. Primero creamos una instancia de la clase Fondos. y creamos variables del tipo Texture2D para nuestras capas 3.62.
new
MultiFondos ( g r a p h i c s ) ;
En LoadContent indicamos la ubicacin de los fondos y agregamos estos a la instancia de la clase Fondos 3.63.
61
En el mtodo Update agregamos 3.12.1. f o n d o . Mover ( 0 . 5 f ) ; Y por ultimo el dibujo en el mtodo Draw 3.12.1. fondo . Dibujar ( ) ; El resultado de todo sera 3.64:
62
3.13.
Game Component
Game Component es una abstraccin lgica de principales funcionalidades de nuestro juego. su ventaja es la de poder dividir nuestro juego en componentes lgicos de alto nivel. Esto porque XNA se diseo para modularisarse lo mas posible. Con esto se obtiene orden en el cdigo y reusabilidad de cdigo. que es uno de los principales problemas en ingeniera de software. El Game Component nace con la idea de poder tener piezas intercambiables (Componentes de juego) de un juego a otro. As el programador solo deber cambiar unas pocas lineas de cdigo para utilizar un componente. Un ejemplo y justicacin del uso de game component seria. Acabamos de terminar un juego y queremos realizar otro deberemos reescribir todo nuevamente?. El nuevo juego utilizara un men, si ya hice un antes porque no ocuparlo nuevamente? es as como el men podramos haberlo denido como game component desde un principio. as en el nuevo juego bastara con unas pocas lineas para integrarlo y ya sabramos que funciona. porque ya lo habramos provado antes. En internet, en comunidades de XNA es posible encontrar varios componentes, desde mens, hasta indicadores de puntaje u energa.
63
64
65
public c l a s s
GameComponent1
Por defecto tenemos un game component que no dibuja nada por pantalla, si queremos que tenga el mtodo Draw tendremos que indicar que herede de DrawableGameComponent y no de GameComponent, adems habr que aadir el mtodo Draw: 3.13.1
public
{
override
void
b a s e . Draw ( gameTime ) ; } Ahora con el componente creado basta con crear una instancia de esta clase en la clase principal del juego y aadirlo a la lista de componentes de XNA 3.13.1 GameComponent1 miComponente = Components . Add ( miComponente ) ; Un buen uso de GameComponent es para la creacin de mens, Indicadores de puntaje, energa, vitalidad etc...
new
GameComponent (
this
);
66
3.14.
Msica y sonidos
Porque un videojuego no solo es algo visual, tambin es muy importante el aspecto sonoro. Grandes juegos poseen tambin grandes bandas sonoras que quedan en el recuerdo de los jugadores.
3.14.1. XACT
XACT (Microsoft Cross-Platform Audio Creation Tool) es la herramienta que entrega Microsoft para el manejo de sonidos y msica en XNA. Esta herramienta posee interfaz grca que facilita bastante su uso. se puede encontrar en sus versiones 2.0 y 3.0 las cuales no tienen muchas diferencias. Si bien la versin 3.0 tiene algunas mejoras, no hay cambios sustanciales por lo que el salto de XACT 2.0 a 3.0 no presentara dicultades. Estas herramientas se encuentran dentro de la carpeta tools en Microsoft XNA Game Studio 3.1 3.67.
3.14.1.1.
Utilizar XACT
Al contrario que con el resto de recursos que se utilizan en un juego, como imagenes, efectos etc.. el sonido no debe (aunque se puede) incluir en el Content ya que deberamos crear un pipeline que lo gestionara. Por esta razn no se aade el sonido al content. Esa es la tarea del proyecto o lista XACT. Primero debemos tener una carpeta en nuestro proyecto XNA destinada para el audio. a la cual accederemos de forma manual. entiendase manual a que deberemos acceder a ella por carpetas y no por la interfaz del explorador de soluciones. y es en esta carpeta donde almacenaremos los archivos de audio. Antes de ejecutar XACT 3.0 debemos abrir primero XACT Auditioning Utility 3.67 el cual nos permitir escuchar simultaneamente los archivos mientras creamos o editamos nuestro proyecto XACT. Al ejecutarlo aparecer una ventana de la consola de Windows, la que no deberemos cerrar hasta culminar nuestro proyecto. Si solo vamos a agregar los archivos al proyecto no es necesario abrir Auditioning Utility. Al comienzo de esta explicacin se menciono que se debera haber creado una carpeta para el audio la cual ya debera contener los archivos a utilizar . Pues al crear el proyecto nuevo en XACT es en esta carpeta en donde lo debemos guardar.
67
Luego en la parte izquierda de la pantalla 3.69 debemos agregar nuevos Wave Banks y Sound Banks (A los nuevos Banks se les puede cambiar el nombre). esto lo hacemos con click derecho sobre Wave Banks y Sound Banks. Ahora a a la derecha se cargaran dos ventanas 3.70 que servirn para agregar los archivos .wav .aif y .ai y crear listas de reproduccin. estas ventanas aparecern superpuestas entre si, para mejorar la visin de estas, en la opcin Window (parte superior) hacemos click en
68
69
Figura 3.70: Nuevos Banks Para agregar los archivos de audio apretamos click derecho dentro del rea Wave Bank 3.70 y seleccionamos todos los archivos de audio que utilizaremos en nuestro juego. Porque agregar todos lo archivos? la respuesta es que al tener mas de una lista XACT en el proyecto es muy probable que hayan conictos entre ellas. Si se logro agregar los archivos estos aparecern dentro de Wave Banks. lo que debemos hacer a continuacin es arrastrar todos estos archivos a la ventana de Sound Bank donde dice Sound Name3.71 y por ultimo arrastrar estos mismos archivos de Sound Bank SoundName a Cue name 3.71. as podremos
70
seleccionar individualmente cada tema en nuestro proyecto. En Cue Name con click derecho podemos agregar una nueva lista de reproduccin que puede contener varios temas de Sound Name. Tan solo creando la lista y arrastrando los temas a esta lista. en la imagen 3.71 se puede apreciar que los temas rockam01 y rockman02 estn en la lista msica. y que cada uno tiene un 50 % de probabilidad de reproduccin. esto implica que cuando reproduzca la lista msica en el juego puede sonar primero cualquiera de las dos canciones. estas probabilidades pueden modicarse en el mismo XACT como tambin dejar un orden establecido de reproduccin. Las posibilidades que nos entrega esta herramienta son varias 3.72 entre las mas destacadas se encuentra:
Volume Pich
modicar el volumen.
cambiar el tono. Modicar la prioridad de las canciones para su reproduccin. Variar el tono Conseguir variaciones de tono.
Priority
VolVariation
Dirigir el sonido si se cuenta equipo de sonido 5.1 Hacer que una cancin o sonido se repita una cantidad de veces indenidamente.
71
72
Habiendo realizado lo anterior el proyecto se encuentra listo para ser aadido a nuestro proyecto XNA. El archivo que genero XACT y que guardamos en la carpeta de audio, es el que debemos agregar al proyecto XNA a travs del Content en el explorador de soluciones. Este sera el encargado de controlar los recursos de audio. Ahora tan solo basta declarar las variables necesarias. // v a r i a b l e s AudioEngine SoundBank de audio
engine ;
soundBank ;
WaveBank waveBank ; En el mtodo Initialize, como se puede apreciar en la imagen 3.73 al inicializar las variables ahora se les debe especicar donde estn las carpetas. ya que de esta forma liberamos del recurso audio al Content pipeline. Para reproducir un tema, sonido o lista bastara poner su nombre como parmetro en el mtodo PlayCue().
73
3.15. VDEO.
3.14.1.2.
Gracias XNA 3.1 y a la librera Microsoft.Xna.Framework.Media es posible reproducir mas formatos de audio aparte de .wav, se agrego .wmw y .mp3.
3.15.
Vdeo.
La reproduccin de un vdeo es un elemento bastante atractivo en un videojuego, las grandes empresas desarrolladoras de juegos ponen bastante nfasis en la presentacin de un videojuego. ya que esta puede inuir en el usuario en la decisin de adquirir o no el videojuego.
Video
Esta clase permite cargar el contenido de nuestro vdeo. tiene propiedades como
VideoPlayer
obtener una textura especica, etc. Para trabajar con vdeo primero se deben declarar variables del tipo Video y VideoPlayer 3.15.1. Video video ; reproductor ;
VideoPlayer
En el mtodo LoadContent colocamos la ubicacin del vdeo. y cargamos el archivo 3.15.1. v i d e o = C o n t e n t . Load<V i d e o >(" t e s t " ) ; r e p r o d u c t o r . Play ( v i d e o ) ;
74
3.15. VDEO.
En el mtodo Update podemos podemos modicar el estado del vdeo 3.15.1. if { r e p r o d u c t o r . Play ( v i d e o ) ; } if { r e p r o d u c t o r . Pause ( ) ; } Y por ultimo para colocar el vdeo en pantalla lo ubicamos igual que como dibujabamos texturas, para que obtengamos una textura se utiliza el mtodo GetTexture() 3.15.1. s p r i t e B a t c h . Begin ( ) ; if || { s p r i t e B a t c h . Draw ( r e p r o d u c t o r . G e t T e x t u r e ( ) , new Rectangle (0 , 30 , v i d e o . Width , video . Height ) , C o l o r . White ) ; } s p r i t e B a t c h . End ( ) ; ( r e p r o d u c t o r . S t a t e == M e d i a S t a t e . P l a y i n g r e p r o d u c t o r . S t a t e == M e d i a S t a t e . P a us e d ) ( Keyboard . G e t S t a t e ( ) . IsKeyDown ( Keys . S ) ) ( Keyboard . G e t S t a t e ( ) . IsKeyDown ( Keys . P ) )
75
3.15. VDEO.
76
Captulo IV Fsica
4.1.
Fsica en un videojuego
Un videojuego como cualquier sistema informtico busca representar una realidad. y para ello las matemticas y la fsica son herramientas esenciales. Incluir Fsica a un videojuego hace que el jugarlo sea toda una experiencia. Grandes ttulos de videojuegos basan mucho su xito a su capacidad de representar el mundo real. Dentro de los videojuegos hay una categora que es la de simulacin donde se priorisa la realidad. Un simulador de carreras en el que el vehculo al chocar contra otro no tenga ningn efecto nos dejara con un sabor amargo tras jugarlo. lo mismo con un simulador de ftbol. si el jugador pateara la pelota y esta nunca cayera al csped. No siempre tendremos como objetivo hacer una copia exacta de la realidad al crear un videojuego. muchos juegos se han hecho famosos no por lo real, si no todo lo contrario. Juegos donde podremos saltar enormes distancias, volar, correr a velocidades inhumanas etc.. Si bien no buscamos hacer una copia exacta de la realidad tendremos en algn momento que tomar en cuenta ngulos si queremos disparar de un caon. tendremos que considerar peso y volumen si es que hay colisiones etc.. Por ello XNA nos entrega bibliotecas que nos facilitaran el calculo y nos ayudaran a dar fsica a nuestro proyecto.
4.2.
Vector2
Un vector es un punto en nuestro plano cartesiano. Anteriormente ya hemos hecho mencin de utilizar la clase Vector2 para manejar las posiciones. ya que esta clase consta de varios mtodos matemticos implementados y optimisados. algunos de estos mtodos son: public static float Distance ( Vector2 value1 , Vector2 value2 )
Que entrega la distancia entre dos vectores otro sera. Vector2 . Lerp ( Vector1 valor1 , Vector2 valor2 , Float monto )
Donde monto debe tener valores entre 0 y 1. El mtodo Lerp devolver un nuevo Vector2 que estar mas cercano a valor1, mientras mas cercano est monto a 0 y, viceversa, devolver un Vector2 mas cercano a valor2 cuando monto tienda a 1. Un ejemplo para el uso de Lerp sera. En un videojuego tenemos un misil redirigido. podramos, en base a la distancia existente entre el misil y algn enemigo poder determinar el curso a seguir por el misil, suponiendo que si no esta cercano a un enemigo el misil deba seguir una linea recta y si est cerca de un enemigo deba avanzar hacia l. Algunas propiedades utilizadas son:
Vector2.Zero() Vector2.One()
Devuelve un Vector2 con los valores X e Y iguales a cero. Devuelve un Vector2 con los valores X e Y iguales a uno.
78
4.3. MATHHELPER
Para obtener ms informacin sobre Vector2 y sus mtodos es recomendable revisar la MSDN de Microsoft
4.3.
MathHelper
MathHelper posee un conjunto de mtodos trigonomtricos tiles en el clculo de posiciones, balstica, ondas, etc... MathHelper opera los ngulos en base a radianes 4.1.
Si estamos acostumbrados a trabajar con grados, debemos saber convertir de grados a radianes para operar con ngulos en XNA a travs de MathHelper. Ver la imagen 4.2 sobre conversin entre radianes y ngulos, adems muestra el comportamiento de las funciones trigonomtricas esenciales(seno, coseno, tangente, cotangente, secante y cosecante) . Los campos o miembros que nos entrega MathHelper para algunas operaciones son:
Log10E Log2E Pi
Representa el valor de Pi. Representa el valor de Pi medio (Pi dividido por 2). Representa el valor de Pi cuarto (Pi dividido por 4).
Para saber mas sobre MathHelper tambin es recomendable revisar la MSDN de Microsoft
1 http://msdn.microsoft.com
79
4.3. MATHHELPER
4.3.1. Colisiones 2D
En el mundo real, cada accin tiene una reaccin y es as como tambin en un videojuego un elemento no debe estar indiferente a otro. una nave espacial no debera atravesar otra nave espacial como si nada. es por ello que en los videojuegos esta interaccin entre elementos se trata con colisiones. XNA nos entrega dos clases para tratar colisiones, estas son:
BoundingBox
Sirve para detectar colisiones en guras rectangulares Sirve para detectar colisiones en guras circulares
BoundingSphere
Para ello se crea un borde por gura, y si estos bordes coinciden uno del otro se provoca una colisin
80
4.3. MATHHELPER
81
4.3. MATHHELPER
BoundingBox
Esta clase crea bordes no visibles sobre la gura para la deteccin de colisiones. Para usarla debemos declarar una variable del tipo BoundingBox. Se debe crear una variable distinta por cada gura que querramos conocer si hay o no colisin. Adems de detectar colisin tambin podemos saber si un objeto esta dentro de otro. En el mtodo Update es cuando se crea el borde invisible alrededor de la gura 4.3.1. y al cual le debemos ingresar dos parmetros del tipo Vector3 para indicar el inicio y n del borde. f i g u r a _ c a j a = new BoundingBox ( V e c t o r 3 min , Vector3 max ) ;
min max
La posicin de nuestra textura (x,y,z). Sera la posicin de nuestra textura mas el ancho y alto de la misma(x,y,z).
Con estos dos puntos formara el BoundingBox que rodeara a nuestra textura 4.5. El valor de z para ambos puntos es 0 ya que tratamos con guras 2D.
82
4.3. MATHHELPER
El BoundingBox se crea en el mtodo Update ya que con movimiento las posiciones siempre estarn cambiando y este borde siempre debe acompaar a la gura. En el Update tambin cuando preguntamos si hubo colisin. Hay dos tipos de deteccin:
Intersect Contains if
{
Chequea si un BoundingBox toca otro BoundingBox o BoundingSphere. Chequea si un BoundingBox contiene todo el volumen de otro BoundingBox.
( bbox1 . I n t e r s e c t ( bbox2 ) ) p o s i c i o n .X
5;
if
{
5;
Ejemplo:
Para este ejemplo utilizaremos variables del tipo bool (booleanas) para mostrar si hubo o no colisin, adems sabremos si un objeto esta o no dentro del otro.
83
4.3. MATHHELPER
Declaracin de variables:4.6
84
4.3. MATHHELPER
Mtodo Update:
85
4.3. MATHHELPER
86
4.3. MATHHELPER
87
4.3. MATHHELPER
88
4.3. MATHHELPER
BoundingSphere
La diferencia que tiene esta clase con respecto a BoundingBox es que el rea que comprende es circular. Para utilizarla debemos declarar una variable del tipo BoundingSphere 4.3.1.
BoundingSphere
bsphere ;
new
BoundingSphere (
Center ,
Radius ) ;
center
89
4.3. MATHHELPER
radius
Es hasta donde llega el redondo desde el centro hacia fuera, con eso sabe de que
dimetro sera.
Figura 4.14: BoundingSphere En cdigo funcional la creacin del borde seria: 4.3.1 bsphere =
new
2, /
redondo_1 . H e i g h t
redondo_1 . Width
Para vericar las colisiones se utilizan los mismos mtodos que con BoundingBox (Intersect y Contains) 4.3.1. if { // C u a l q u i e r } if { // c u a l q u i e r } Podemos comparar Ambos mtodos, si un objeto rectangular colisiona con uno circular 4.3.1 i f ( bbox . I n t e r s e c t ( b s p h e r e ) ) { // Alguna } accin accin ( bsphere_1 . I n t e r s e c t s ( bsphere_2 ) ) accin ( b s p h e r e _ 1 . C o n t a i n s ( b s p h e r e _ 2 ) == ContainmentType . C o n t a i n s )
90
Las posibilidades que nos entrega el detectar colisiones en un juego es bastante amplia. desde agregar un poco de realidad al juego, aumentar la interactividad de este. Hasta facilitarnos el como hacer las cosas en nuestro juego, y pasar de un juego sencillo para el usuario a uno complejo y llamativo. Un ejemplo de como las colisiones nos facilitan la programacin y adems ayudan a aumentar la complejidad de este sera. Si queremos tener un enemigo de tamao considerable en nuestro videojuego y que el jugador vaya destruyendo partes de este. o talvez dejar solo algunos puntos dbiles de difcil acceso y as aumentar la dicultad del enemigo. podemos crear varios BoundingBox o BondingSphere que acompaen el tamao considerable de nuestro enemigo 4.15.
4.4.
Fuerza Gravitacional.
La fuerza fundamental de la gravedad permitir que en nuestro videojuegos sus elementos no oten caoticamente por la pantalla. Un cuerpo no cae siempre con la misma velocidad, a menos que se encuentre en el vaci. por ello para hacer de un videojuego un poco mas real, es que se agrega el factor gravedad el cual har que un objeto caiga y acelere al hacerlo.
91
posInicial sera igual a la posicin donde se dibujo la esfera y vel_xy sera la velocidad con que fue lanzada la esfera. Si a vel_xy le asignamos el valor (0,0) signica que solo cae por lo tanto sera una cada libre Ahora en el mtodo Update.
92
Cuando presionamos la tecla G, nuestra esfera caer. si a vel_xy le asignamos los valores (0,0) veremos ele efecto cada libre, de lo contrario apreciaremos la trayectoria de un proyectil 4.20.
Para el efecto cada libre 4.19 se modicaron la variable pos para hacer caer la esfera al medio de la pantalla.
93
94
95
5.1. CONCLUSIONES
5.1.
Conclusiones
El desarrollo de videojuegos es una ardua y extensiva tarea, y mas aun si se desea entrar al mercado actual de desarrollo de videojuegos, donde las exigencias aumentan, segn la oferta y los avances tecnolgicos. Si bien esto puede hacer cambiar de parecer a muchos quienes pensaron en inmiscuirse en este mundo. Aun queda la posibilidad de lograr algo grande. El xito de un videojuego puede radicar en otros aspectos no solo en el alto contenido grco y la tecnologa que se utilice en este. Sobre los objetivos, se ha logrado el objetivo principal de esta tesis, planteado en un principio 1.1.1. Que fue desarrollar un prototipo de videojuego estilo arcade para PC con XNA. Se lograron cada uno de los objetivos especcos planteados con aterioridad. Obteniendo un logro ms all de lo planteado en un principio ya que se gano experiencia en el uso de XNA y el manejo de errores sobre este. En la actualidad se pueden apreciar gran cantidad de juegos con un contenido grco impresionante, donde el agua, la iluminacin y sombras son un deleite para la vista, texturas en alta calidad, manejo de partculas, por mencionar algunos. Pero juegos sencillos, sin tanta posibilidad grca han recaudado grandes cantidades de dinero y se han hecho muy populares, ejemplos de ellos son los juegos creados por Zynga en Facebook, donde todos sus juegos tiene la opcin de comprar elementos de juego con tarjeta de crdito. o Angry Birds creado para el Iphone y ahora en su versin para Android, donde ya supero los dos millones de descargas. Esto signica que aun hay un mercado que no requiere tantos costos y tiempo para lograr sobresalir y ganar dinero, Este mercado es el de los SmartPhones, Tablets PC, Xbox Live y WiiWare de Nintendo entre otros. Por lo que posibilidades de ganancias y fama aun estn abiertas. XNA como herramienta logra proveer lo necesario para el desarrollo de videojuegos, adems facilita su tarea. La libreras que posee, abarcan practicamente todo lo necesario para el desarrollo de videojuegos. con XNA podremos desarrollar juegos 2D y 3D. trabajar con texturas de alta calidad, importar modelos 3D desde Autodesk 3ds Max , utilizar contenido multimedia. implementar fsica al videojuego juego sin tener que crear desde cero las funciones matemticas que lo permiten, ya que posee varios mtodos ya probados. Si un programador es exigente y quiere realizar un videojuego con alto contenido grco, tambin lo puede hacer, ya que XNA fue construido sobre DirectX pudiendo utilizar gran cantidad de APIs que trabajan con tareas complejas. En resumen las principales ventajas que tiene XNA y el uso de C# son: C# es un lenguaje moderno y ecaz. Hereda toda la potencia de C++. Esta desarrollada sobre la plataforma .NET C# es un lenguaje compilado, por lo tanto ms velocidad.
1 Aplicacin
96
XNA tiene soporte para desarrollar juegos 2D y 3D. El framework XNA esta construido sobre DirectX. No es difcil de comenzar a utilizar Puedes publicar tu juegos para PC, Xbox 360, Zune y a partir de la versin 4.0 de XNA Game Studio se suma la plataforma Windows Phone 7. Y algunas Desventajas: No Posee cdigo abierto. Soporta solo plataformas de Microsoft. Poco soporte en espaol. Para vdeo solo soporta el formato wma. Si se busca comenzar en el mundo del desarrollo de videojuegos, XNA Game Studio es una excelente opcin. tanto para quienes buscan desarrollar algo simple como complejo. adems ya hay mucha gente que lo esta utilizando por lo que es posible encontrar informacin en las comunidades de XNA. El prototipo Actual en el que me encuentro trabajando de nombre CanonSlaught es un videojuego en el que se controla un can mediante su rotacin, el cual debe evitar que los enemigos crucen desde la derecha a izquierda. Este prototipo es un videojuego en 2D al cual se le agrego msica, efectos de sonido y de partculas.
5.2.
Trabajos Futuros
Complementar el prototipo agregando mas etapas y mejorando la fsica de este. Aprender Modelado 3D con Autodesk 3ds Max. Aprender sobre el desarrollo de videojuegos en tres dimenciones. Iniciar un proyecto de videojuego en 3D.
97
Apndice A Apndice
98
APNDICE A. APNDICE
1.1.
Siguiendo algunos tutoriales en Internet, se logro crear algunos videojuegos clsicos como Pong e Space Invaders 1.1.
99
APNDICE A. APNDICE
Tambin se modico el cdigo de Space Invaders agregandole nuevos sprites, msica, efecto de disparo y la tcnica ScrollParallax.
Por ultimo el proyecto el cual esta en desarrollo que es CanonSlaught 1.3. Un juego en dos dimensiones, el cual se utiliza un can para destruir naves enemigas y monstruos. El cual contara con men, msica, efectos de sonido y partculas. adems de la tcnica ScrollParallax.
100
APNDICE A. APNDICE
101