jueves, 8 de julio de 2010

Programando videojuegos: Tutorial XNA Game Studio 4.0 parte 5

crab-icon ball c#

¿Que tal pequeños cangrejillos? Disculpad la tardanza de esta quinta parte del tutorial, pero me ha dado mas problemas de los que me esperaba, y además he andado algo ocupadillo. En esta parte de tutorial vamos a aprender a manejar detección de colisiones, parte fundamental de prácticamente cualquier videojuego, así que nos ponemos serios, que empieza lo difícil. Empecemos por la teoría.

Existen numerosas técnicas de detección de colisiones entre sprites (no exclusivas de XNA, son comunes en el mundo del desarrollo de videojuegos). Lo más fácil y eficiente (de cara a procesamiento y obtención de buenos resultados de performance) es utilizar rectángulos, detectando colisión cuando estos se intersecan.

           

El problema obvio es la imprecisión en la detección de la colisión. Según esto, un impreciso acercamiento entre los dos objetos ya supondría una colisión, como se puede ver en las imágenes anteriores.

En muy pocas ocasiones, pues, esta técnica tan simple nos valdrá. Aunque existen otras variantes más precisas, y todavía eficientes, basadas en la detección de colisiones mediante rectángulos. Una de ellas sería dividir cada uno de los sprites en rectángulos más pequeños, y englobarlos todos en uno más grande. Entonces, primero intentaríamos detectar la colisión mediante los rectángulos grandes, y solo si esta es afirmativa, intentaríamos detectar la colisión entre los rectángulos más pequeños (y estos son los que decidirían si hay colisión o no).

           colisiones1

Como esta existen muchas variantes de la misma técnica, basadas en diferentes formas geométricas, y si bien esta técnica es mucho mas precisa que la anterior, aun puede ser más precisa, aplicando la detección de colisiones denominada “Perfecta” o Pixel a Pixel, en la cual se obtendrá precisión perfecta, activándose solo cuando se colisione a nivel de pixel.

La principal desventaja de esta técnica es que es más complicada que las anteriores, y por tanto tiene un coste computacional mucho mayor. Sin embargo en nuestro caso vamos a adoptar una solución intermedia, comprobando solo la colisión pixel a pixel solo si se detecta colisión con rectángulos. Evidentemente el rendimiento no es igual que con las técnicas más simples, pero se mejorará muchísimo.

Fuente: http://geeks.ms/blogs/jbosch/archive/2009/08/08/xna-pixel-perfect-collision-con-xna-en-base-a-un-mapa-de-colisiones-2d.aspxEnemigoBasico

Pues explicado esto, vamos al tema. Lo primero que habrá que hacer es una clase para crear enemigos. Esta parte voy rápido que no hay nada nuevo. Añadimos la imagen del enemigo como siempre (metiéndola en la carpeta content y arrastrándola al VS). Una vez esta esto, creamos la clase Enemigo1, algo así:



Imagino que a estas alturas sabréis por donde van los tiros. 40 y 57 son las dimensiones de la imagen. Además de los atributos de siempre vemos que tenemos un Rectangle, llamado bounds, en el que almacenamos el rectángulo que representa la imagen dibujada en pantalla y lo mantenemos actualizado (en update). Además añadimos varias propiedades para poder acceder a imagen, _posicion y bounds sin necesidad de implementar un método get (Gracias a esto se podra acceder simplemente con enemigo.Imagen o enemigo.Bounds. Este nuevo atributo, así como las diferentes propiedades también tienen que ser añadidas a las clases Nave y Disparo, pues nos hará falta para la detección de colisiones:







Solo muestro las partes que cambio por evitar hacer un post enorme, así que cuidado si copiáis pegáis. Con esto añadimos las nuevas propiedades, el nuevo atributo, y mantenemos actualizado este atributo. Es importante darse cuenta de la diferencia entre este rectángulo (bounds) que muestra el rectángulo ocupado por la imagen en la ventana, y el otro rectángulo que ya teníamos en Nave, que representa que parte de la imagen se va a dibujar.



Ahora que esta todo preparado, lo primero que hay que hacer es mostrar los enemigos por pantalla. Esto lo manejaremos en la clase Game1 de momento (En la próxima parte del tutorial se hará una pequeña reestructuración).





Añadimos a los atributos una lista de enemigos, que luego instanciamos en el constructor, además de un int para contar los frames (ahora veréis para que). Después, en Update, añadimos UpdateEnemigos, que hará varias cosas. Lo primero será aumentar frameCounter para así saber cuando pasan 60 frames.



Si el contador es mayor que 60 procederemos a añadir un nuevo enemigo (Con esto evitamos añadir sabedioscuantos enemigos por segundo). Para ello, instanciamos un objeto Random, y creamos un enemigo con una coordenada X aleatoria (Con la anchura de la pantalla de máximo) y –57 de coordenada Y para que entre poco a poco a la pantalla. Añadimos este enemigo recién creado a la lista enemigos, controlamos el evento FueraDePantalla (De igual manera que lo hacemos con los disparos, para borrar los enemigos que se salgan de la pantalla). Por ultimo ponemos el contador de frames a 0.



Después, fuera del If (esto se tiene que ejecutar siempre, no solo cada 60 frames) se invocara a Update de todos los enemigos. Una vez más no utilizamos foreach por que es posible que se dispare FueraDePantalla y que cambie enemigos, lo que haría que un foreach diese un error en tiempo de ejecución, pero la expresión lambda utilizada en esencia hace lo mismo.



image



Tras esto podemos probar a ejecutar y veremos que ya tenemos una serie de enemigos en pantalla cada X tiempo. ¿Va cogiendo forma no?. Ahora que ya está todo preparado podemos empezar con la detección de colisiones, manejada una vez mas desde Game1 temporalmente:





Añadimos a Update otro método en el cual manejaremos las colisiones. Como ya mencionamos anteriormente no se puede eliminar la lista que se este iterando dentro de un iterador foreach, pero esta vez no podremos usar una expresión lambda, así que utilizaremos un tag y unas variables locales para saber cuando se encuentra una colisión y borrar tanto el disparo como el enemigo después de salir del bucle.



En el método colisión enemigo disparo, usado por el método anterior, comprobamos si hay una colisión rectangular, y en caso de que sea así pasamos a ver si hay colisión pixel a pixel. En caso de que sea así devolvemos true y si no devolvemos false.



En cuanto al método estático ColisionPixel, almacenamos los datos de los pixeles en los arrays bitsA y bitsB, buscamos los limites del espacio que vamos a manejar, con las coordenadas x1, x2, y1 y y2. Con todo esto recorremos los arrays bitsA y bitsB con dos bucles for en los cuales comprobamos en cada iteración el canal Alpha de transparencia de las dos imágenes en un punto concreto. Por esto en caso de que ninguna de las dos imágenes sea transparente en cualquier punto significa que hay colisión, por lo que devolveremos true.



image image



Con esto la detección de colisiones esta completa, y lo podemos ver ejecutando el juego, aunque no se aprecie en la captura :P La colisión de los enemigos con las nave la pondremos mas adelante, cuando se añadan las vidas y la pantalla de gameover. No obstante esto empieza a coger forma ya, ¿no? Podéis bajar el código hasta ahora en el siguiente enlace:  http://www.megaupload.com/?d=OE6KUY4S



En la próxima entrega del tutorial menú, pantalla de pausa y pantalla de gameover. No os lo perdáis y ¡Sed buenos cangrejos!





EDIT: He cambiado algunas cosas en el código respecto a la parte 5 del tutorial original con la intención de obtener un código más limpio. Quite todas las _ de las variables, y me asegure de que todas las propiedades estaban en mayúscula. A parte de esto también cambie algunos puntos donde se accedía a las variables mediante las propiedades desde dentro de la misma clase.



Para los que hagan el tutorial a partir de ahora (22/09/2010) no lo notarán, pues ya esta actualizado, pero los que ya han hecho el tutorial que se bajen mi código, ya que esta corregido. Es posible que se me colase alguna errata, en tal caso hacédmelo saber.

sábado, 3 de julio de 2010

GameLab 2010: Tercer día

image003--200x250 Un día más en The Code Crab hemos asistido al GameLab 2010, y aquí estoy resumiendo el día. Lo primero es decir que hoy viernes, ultimo día, la feria concluía a las 2 del mediodía, y por tanto había menos actividades que los otros días, y una vez más no hay nada nuevo que probar por lo que me centrare en las charlas. Además de esto no he podido asistir a todas las charlas, por lo que resumiré las que pude ver.

A primera hora hubo una mesa redonda sobre las nuevas plataformas, y el modo en que afectan estas a los creadores. Por desgracia no pude asistir, pero mi sorpresa fue grande al ver que la siguiente conferencia, iPad, una oportunidad para los creadores, no fue en realidad una conferencia como indicaba el programa, sino otra mesa redonda en la que apenas se mencionó el iPad. De hecho no asistí a la primera mesa redonda, pero el titulo que tenia encaja definitivamente mucho mas en la mesa redonda que vi (Y no me equivoque de charla yo, que pregunté y todo).

image

En esta improvisada mesa redonda pudimos ver a Xavier Carrillo, Director General de Digital Legends Entertainment, el supuesto ponente, junto con Gonzo Suárez y Igor Pusenjak (No estoy seguro al 100% de que eran ellos, pues como reitero una vez más esta mesa redonda estaba fuera del programa). Se habló de los nuevos medios, y de la importancia de los juegos sociales, descubiertos mediante facebook. ¿Que nos deparara el futuro? Desde luego hay que aprovechar al máximo todos los nuevos medios, cambiando radicalmente la formula tradicional del desarrollo de los videojuegos.

image

Tras esta mesa redonda, hubo otra sobre las diferentes plataformas en el mercado de los juegos móviles, pero tras el desastre(esto es mi opinión, claro) de la supuesta conferencia del iPad no estaba de humor para otra mesa redonda, así que no asistí.

Tras esto Juancho Carrillo, Lead Designer de Tonika Games, junto con Roberto López Yeste y Richard Brown nos ofrecieron una interesante conferencia en la cual se nos presento PlayEnglish.

Tras un rato de publicidad de Sony (y es que tenemos muy claro que los chicos de Sony se encantan a si mismos) nos mostraron el trailer que podéis ver encima (nada exclusivo, es el anuncio de TV).

Este juego es bastante innovador, según nos contaron, pues pese a ser un juego educativo esta más centrado en la diversión que en el aprendizaje, haciendo así que el aprender ingles sea progresivamente, de forma natural y divertida. El jugador tendrá que encarar una serie de pruebas, dignas de cualquier aventura gráfica, en las cuales tendrá que aplicar conocimientos de ingles y adquirir conocimientos nuevos de forma practica. Además de esto el juego cuenta con varios imageniveles de dificultad, y se centra en las partes que dan problemas al jugador, ofreciendo una experiencia personalizada.

Todo esto hace de PlayEnglish un juego bastante interesante y digno de probar, para de paso repasar esos Phrasal  Verbs que tanto dolor de cabeza nos dieron en su día. Tras esto se declaro en exclusiva que el próximo desarrollo del estudio iba a ser… Patito Feo, que pese a lo mal que pueda sonar, seguro que es un gran éxito (orientado a un publico mas concreto claro).

Por ultimo, la ultima conferencia fue de la mano de Gilberto Sánchez, Director Editorial de Virtual Toys, estudio responsable de títulos como Horsez y Imagina Ser. La conferencia hablaba del proceso intermedio que hay entre la finalización de un juego y la publicación del mismo, y se dejo claro que hacer un buen juego solo es un 40% del trabajo.

image

Tras un rato hablando de temas de publicidad, mercados, y demás cosas aburridas, se nos anuncio que el estudio ahora mismo estaba trabajando en Torrente Online 2, el cual dispone de muchas novedades frente al primero, y cuya beta ya estará disponible el próximo 19 de julio.

Con esto (y con un sorteo de una ps3 y una psp go) concluye el GameLab 2010. En cuanto mis impresiones generales del evento, creo que este año se ha batido un record de visitas, pues ha estado algo más orientado al publico que otras veces, más pensado para diseñadores y empresas.

image

La presencia de Sony no dejo nada que desear, ofreciéndonos varias novedades como el 3D, el Castlevania LOS, el nuevo SingStar, el Gran Turismo 5 y PlayStation Move, pero sin embargo la presencia de Nintendo fue bastante ligera, en cuanto a que tenia cosas para probar pero ninguna novedad, mientras que Microsoft ni siquiera patrocinaba, solo colaboraba, por lo que ofreció conferencias interesantes pero nada para probar. Con esto quiero decir, que GameLab se está convirtiendo en un pequeño E3, y vamos por buen camino, pero aun no es suficiente, y si Nintendo y Microsoft hubiese colaborado tanto como lo hizo Sony el evento hubiese sido mucho mejor.

En cuanto a las conferencias (y esto es, una vez más, mi opinión, y no un hecho universal), una vez mas se mezclan conferencias muy interesantes, como presentaciones en exclusiva de juegos (Como Castlevania o Kinect), con otras que se repiten año tras año sin ninguna clase de novedad, como una serie de mesas redondas. En mi opinión para seguir avanzando el GameLab debe centrarse más en las novedades. Conferencias sobre diferentes plataformas, presentaciones de juegos, nuevas tecnologías y que nos depara el futuro. Todo esto lo hubo este año, pero por desgracia, solo fue entorno al 50% de las conferencias, siendo el resto bastante menos interesantes.

image image

Por tanto en mi opinión, GameLab, algún año será un pequeño E3 en Asturias, pero aún nos queda un largo camino por recorrer. Sin embargo, ese día cada vez esta más cerca, estoy seguro de que el próximo año estará aún mejor, ¡Lo esperamos con impaciencia Lobo!. Tras la vuelta a la normalidad me pondré a trabajar de nuevo en el tutorial de XNA, así que estad atentos. ¡¡Sed unos cangrejos pacientes!!

jueves, 1 de julio de 2010

GameLab 2010: Segundo día


Un día más en The Code Crab hemos asistido al GameLab 2010, y aquí estoy ofreciendo mi experiencia de nuevo. Dado que no hubo nada más nuevo que poder probar, por desgracia. Por esto hoy me centraré más en las conferencias.
P010710_13.44
A primera hora, Alon Shtruzman, vicepresidente de Playcast Media, nos ha ofrecido una conferencia sobre los videojuegos sin consola y la importancia de los medios, así como la influencia que estos tienen en el contenido. Como ya sabréis es un tema importante estos días, debido al lanzamiento no hace tiempo de OnLive.
El ponente ha previsto un importante cambio en el mercado de los videojuegos, especialmente los casual, abriendo camino para los juegos en la nube o juegos sin consola. Todo este cambio de mercado, según Alon, viene dado por la reciente proliferación de los juegos sociales y familiares, siendo el paso a los juegos sin consolas el próximo paso lógico, acercando más aún los juegos a nuestro salón y al de todo el mundo.

Tras esta interesante charla he asistido a una serie de conferencias sobre XNA, de varias horas de duración que era en paralelo con otras charlas que me perdí. Por desgracia para mi, el 80% de las charlas eran similares a unas que se habían dado en mi facultad hace unos meses. El propósito de las charlas es la presentación de Windows Phone 7, así como una introducción al desarrollo de videoconsola para este valiéndose de XNA, pero que os voy a contar de XNA ya a estas alturas :)
También se anuncio el Imagine Mobile, el cual es un concurso interesante que presenta una gran oportunidad, os aconsejo que si tenéis tiempo participéis.
image
Después de comer al fin llego el momento que todo el mundo estaba esperando, la presentación de Castlevania Lords of Shadow. El juego, se presento en exclusiva en el GameLab solo presentado antes en el E3. Como ya he mencionado antes también hay disponible una demo, a la que tuve la suerte de probar (un par de veces :).
Este juego ha sido diseñado por Mercury Steam, un estudio español anteriormente pequeño, en colaboración con Kojima. El ponente, Enric Álvarez, declaró que cuando recibieron la llamada de Kojima no se lo creían. La conferencia comenzó mostrándonos el vídeo de presentación, ya mostrado en el E3, que podéis ver a continuación.

¿Habéis notado la canción de Vampire Killer al final del vídeo?
Tras este vídeo, Enric declaro que se intento cuidar al máximo los detalles para procurar una máxima inmersión por parte de los jugadores, con cosas como una gran banda sonora, y una ambientación oscura y sangrienta, de acuerdo con los estándares de los juegos clásicos de la saga, pero con gráficos de ultima generación, así como un arte gráfico impresionante.
Tras varias declaraciones se procedió a enseñarnos dos niveles del juego inéditos (Nada que ver con la demo, que ofrecía un tutorial y dejaba ver un sistema de combate similar a God of War).
En el primero de ellos, vemos una de las partes iniciales del castillo en el cual se deja entrever diferentes aspectos del juego, como un mapa abierto, y un elaborado componente de exploración. Tenemos 2 barras de magia, una roja para hechizos de ataque y otra azul para hechizos defensivos, a parte de los clásicos objetos, y combinaciones entre objetos y magias.
P010710_16.33 P010710_16.20
Enric nos prometió una gran cantidad de secretos, con los cuales podremos obtener entre otras cosas mejoras de salud y magia, y para muchos de los cuales tendremos que volver a una parte anterior del castillo después de conseguir algún poder.
En cuanto a los enemigos, vemos una gran diferencia al pasar de un enemigo a otro, convirtiendo la lucha en algo dinámico. Tras todo esto, se llego a un jefe final, el carnicero del castillo, y vemos que la dificultad, al menos en los jefes, es bastante elevada, ¡Enric no se lo pasó hasta el tercer intento y valiéndose de trampas!
Después observamos la torre del reloj, lo que nos permitió observar un elaborado plataformeo, el cual cambia a lo largo del juego, evitando así una experiencia monótona. Si nos caemos mientras escalamos la torre volveremos a un punto inmediatamente anterior pero perdiendo algo de vida, y por un error de Enric hemos visto el doble salto (con alas, estilo Alucard).
En conclusión, el nuevo Castlevania parece, por fin, una gran adaptación de la saga al entorno 3D, con un juego muy innovador, atractivo y entretenido, pero fiel a los orígenes al mismo tiempo.
P010710_17.43image 
Una vez concluida esta sorprendente presentación, pudimos ver en acción a Kinect (o Proyect Natal, como se conocía hasta ahora), de la mano de David Darnés, Productor de Ubisoft Barcelona, aunque por desgracia no lo pudimos probar, excepto un par de afortunados.
Tras un poco mas de la cantidad de publicidad de Ubisoft recomendada por las autoridades sanitarias, se presento Kinect junto con Motion Sports, un juego lanzado junto al dispositivo de la mano de Ubisoft, evidentemente.

 
Motion Sports ofrece una serie de pequeños juegos de deportes (no me suena de nada esto tampoco), ideales para jugar con amigos, y la principal innovación es el uso de Kinect, por lo que no hace falta ninguna clase de controlador, se controla todo con la voz y el movimiento.
En la demo estaban disponibles los juegos de rugby y esquí, y parecía funcionar bastante bien en general, aunque tenía algunos problemas con los brazos. Además parece fácil salirse del radio, parando el juego. Esto puede suponer alguna molestias para juegos moviditos, pero nada serio.

Tras estas dos geniales conferencias, el evento continuó con una conferencia sobre Basket Dudes y el modelo de micro pagos, de la mano de Fernando Piquer, Fundador y CEO de Bitoon Entertainment, en la cual se nos dejo claro que el modelo se centra en ofrecer una experiencia completa de juego a todos los usuarios, estén dispuestos a pagar o no, pero ofreciendo una serie de ventajas a los jugadores que paguen.
 
Por último, Daniel Sánchez-Crespo, Director General y Jefe de Diseño de Novarama (Empresa desarrolladora del exitoso juego Invizimals) expuso una interesante charla sobre la manera de innovar en el sector del desarrollo de videojuegos.
P010710_19.18
Después de esto nos presento en exclusiva Invizimals Shadow Zone, la continuación del exitoso juego Invizimals, del cual no consigo encontrar imágenes y aún no hay trailer, pero pudimos observar muchas novedades con respecto al primero, en cuanto a nuevos Invizimals, nuevas maneras de capturar y un nuevo sistema de rankings online. Por cierto, que Invizimals se estrenará pronto en USA, seguro que es un gran éxito, igual que aquí :)

Una vez más me detendré antes de lo que me gustaría por que vuelvo a llevar escrito más de lo que debería (Si es que me emociono con el Castlevania). Mañana concluiré con el ultimo día del GameLab, una vez mas resumiendo las conferencias a las que pueda asistir. ¿Que os parece el lavado de cara del blog? Yo creo que sobretodo ahora se lee mejor independientemente de la resolución usada.


Gracias por leer The Code Crab una vez más, y ¡Sed unos cangrejos pacientes!, ¡Mañana más!
Gracias a Sara por el cangrejo una vez más :)

PD: Perdón por la calidad de las fotos, las hago con mi móvil y sacar fotos a un proyector no es la mejor idea.