05 noviembre 2008

Remake (parcial) de Fruity Frank... 13 - Migrando a C#

Antes de seguir ampliando las posibilidades del juego, llega el momento de hacer un cambio drástico: usar otro lenguaje de programación. Vamos a usar C#, que permite despreocuparnos de ciertos detalles de bajo nivel, y además nos permitirá usar una metodología orientada a objetos para rediseñar el juego... dentro de no mucho tiempo.

A pesar de que C# deriva de C, y de que vamos a usar la librería Tao.SDL que deriva de SDL, habrá que hacer algún que otro cambio.

Como en la versión anterior, crearemos un fichero auxiliar que oculte un poco de SDL, simplifique algunos pasos, y que además nos traduzca las órdenes a español. En este caso, se llama "sdl_n.cs" y se puede ver en la página del proyecto.

Los cambios a nuestro juego, sin ser grandes, son unos cuantos:


  • Todo el programa pasará a formar parte de una clase: "public class Juego". En concreto, como se apoyará en la clase auxiliar SdlN, comenzaremos con "public class Juego: SdlN".


  • Los datos de nuestros enemigos están en un "struct"; los componentes de este "struct" ahora deben ser public.


  • Cambia la declaración del "array" que contiene nuestros enemigos: ahora deberá ser al estilo de C#: enemigo[] enemigos = new enemigo[NUMENEMIGOS];


  • El mapa del juego ahora será un "array" de "strings". Se declara casi igual, pero ahora tendremos una columna menos en MAXCOLS (ya no hace falta dejar un carácter adicional para indicar el final de cadena). Por ese mismo motivo, la comprobación de la columna en la que estamos no acaba en MAXCOLS-2, sino en MAXCOLS-1. De igual modo, como las cadenas en C# no son modificables, ya no podemos alterar el mapa con "mapa1[yPersonaje][xPersonaje] = ' ';", sino que deberemos usar un "remove" para quitar un carácter y luego un "insert" para introducir el nuevo carácter en su lugar.


  • Podemos aprovechar para cambiar el tipo de alguna variable. Por ejemplo, las coordenadas X e Y pueden ser un "short" en vez de un entero de 32 bits. Las componentes R, G y B de un color serán "byte". Por eso será necesario también cambiar algunos datos durante el desarrollo de juegos, forzando una conversión de tipos ("cast"), bien porque aprovechemos datos auxiliares que todavía sean "int" y debamos convertir a "short": datoShort = (short) datoEntero, o bien porque hagamos operaciones y el compilador no tenga la certeza de que el resultado vaya a caber en un entero corto: (short) (xIniPantalla + xPersonaje * anchoCasilla)


  • Todo el cuerpo del juego lo sacaremos de "Main" para meterlo en una nueva función, llamada (por ejemplo) "BuclePrincipal". Así nuestro "Main" contendrá apenas 3 órdenes: la declaración de un juego, su presentación y su bucle principal.


  • Como peculiaridad de la librería que usaremos (Tao.Sdl), y por no profundizar más por ahora, nuestros tipos de datos SDLA_Imagen* y SDLA_Fuente* ahora pasarán a ser un único tipo "IntPtr".


  • Todos los SDLA_xxx cambian de nombre, perdiendo ese "SDLA_" del principio, para abreviar un poco y tratar de ganar en legibilidad. Por ejemplo, en vez de "SDLA_teclaPulsada" usaremos "TeclaPulsada", y "SDLA_dibujarImagenOculta" se convertirá en "DibujarImagenOculta".



Como siempre, todos los fuentes están en: code.google.com/p/fruityfrank