P R O G R A M A C I Ó N D E V I D E O J U E G O S C O N S D L<strong>SDL</strong>_Surface *screen;screen = <strong>SDL</strong>_SetVi<strong>de</strong>oMo<strong>de</strong>(640,480,24,<strong>SDL</strong>_SWSURFACE| <strong>SDL</strong>_DOUBLEBUF);if ( screen == NULL ){fprintf(st<strong>de</strong>rr, "No se pue<strong>de</strong> establecer el modo \<strong>de</strong> vi<strong>de</strong>o 640x480: %s\n", <strong>SDL</strong>_GetError());exit(1);}Le hemos pedido a <strong>SDL</strong> que establezca un modo <strong>de</strong> vi<strong>de</strong>o <strong>con</strong> una resolución <strong>de</strong>640x480 píxeles y 24 bits <strong>de</strong> color (true color). A<strong>de</strong>más le solicitamos que use lamemoria <strong>de</strong> ví<strong>de</strong>o y una estrategia <strong>de</strong> doble buffer para repintado.Antes hemos dicho que la superficie que nos <strong>de</strong>vuelve <strong>SDL</strong>_SetVi<strong>de</strong>oMo<strong>de</strong> es laúnica visible. Sin embargo, es seguro que necesitaremos crear y utilizar superficiesintermedias para almacenar gráficos, <strong>con</strong>struir escenas, etc... Estas superficies nopue<strong>de</strong>n ser directamente mostradas por pantalla, pero sí copiadas en la superficieprincipal (visible). A este proceso lo llamamos bit blitting y veremos más abajo cómo serealiza esta operación. La manera <strong>de</strong> crear una nueva superficie es mediante la función<strong>SDL</strong>_CreateRGBSurface que crea una superficie vacía y lista para usar. El formato <strong>de</strong>esta función es<strong>SDL</strong>_Surface *<strong>SDL</strong>_CreateRGBSurface(Uint32 flags, int width, int height, int<strong>de</strong>pth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask);A simple vista parece algo complicada, así que vamos a <strong>de</strong>tenernos un poco en ella. Comopue<strong>de</strong>s observar, esta función nos <strong>de</strong>vuelve un puntero a una superficie, al igual que hacía lafunción <strong>SDL</strong>_SetVi<strong>de</strong>oMo<strong>de</strong>. Los parámetros width y height tienen el mismo significadoque en <strong>SDL</strong>_SetVi<strong>de</strong>oMo<strong>de</strong>, y <strong>de</strong>pth es lo mismo que bpp (me pregunto por qué no hanmantenido la misma nomenclatura). Los posibles valores para flags son:<strong>SDL</strong>_SWSURFACE<strong>SDL</strong>_HWSURFACECrea la superficie <strong>de</strong> ví<strong>de</strong>o en la memoria principalCrea la superficie en la memoria <strong>de</strong> ví<strong>de</strong>o.<strong>SDL</strong>_SRCCOLORKEY Permite el uso <strong>de</strong> transparencias (color key).<strong>SDL</strong>_SRCALPHAActiva el alpha-blending.Un poco más a<strong>de</strong>lante veremos más claramente el significado <strong>de</strong> las dos última opciones.Nos queda Rmask, Gmask, Bmask y Amask. Estos parámetros son un poco más complejos <strong>de</strong>compren<strong>de</strong>r sin entrar en mucho <strong>de</strong>talle en las estructuras <strong>de</strong> datos internas <strong>de</strong> <strong>SDL</strong>, en<strong>con</strong>creto en la estructura <strong>SDL</strong>_PixelFormat. Baste <strong>de</strong>cir que la R, la G, la B y la A <strong>con</strong> laque empiezan cada uno <strong>de</strong> estos parámetros vienen <strong>de</strong> Red, Green, Blue y Alpharespectivamente. Rmask, por ejemplo, es la mascara <strong>de</strong> bits que representa al color rojo puro.Recuerda que un color cualquiera viene dado por la mezcla <strong>de</strong> los colores rojo, ver<strong>de</strong> y azul,por lo tanto, Rmask serían los bits que es necesario activar para <strong>con</strong>seguir el color que tieneun 100% <strong>de</strong> rojo, un 0% <strong>de</strong> ver<strong>de</strong> y un 0% <strong>de</strong> azul. Lo mismo es válido para el resto <strong>de</strong>parámetros. Veamos un ejemplo <strong>de</strong> uso <strong>de</strong> esta función.rmask = 0xff000000;gmask = 0x00ff0000;bmask = 0x0000ff00;amask = 0x000000ff;surface = <strong>SDL</strong>_CreateRGBSurface(<strong>SDL</strong>_SWSURFACE, 640, 480, 24,rmask, gmask,bmask, amask);if(surface == NULL) {printf("Error al crear la superficie");27
P R O G R A M A C I Ó N D E V I D E O J U E G O S C O N S D L}exit(1);Cargando y mostrando gráficosVale, todo esto está muy bien, pero ¿cuándo vamos a empezar a ver algo?Está bien. Pasemos directamente a un ejemplo completo. La figura3.1 muestra elresultado <strong>de</strong> ejecutar el programa ejemplo3_1.Figura3.1.28