Está en la página 1de 5

028-032-juegos 22.11.

2004 16:20 Uhr Seite 28

DESARROLLO SDL

Creación de un juego

Programación con SDL


En este artículo, el primero de una Gracias al hecho de que se utiliza el
acceso directo (en vez de la emulación) a
serie, Steven Goodwin da un vistazo a los dispositivos del sistema, se puede
lograr un gran nivel de rendimiento en
SDL. Qué es, cómo funciona y, lo que todas las plataformas.

es mucho más importante, cómo ¡Excavad, Excavad, Malditos!


usarlo para escribir un flamante Hay cientos de juegos SDL disponibles
en Internet y muchos de ellos están
juego, Explorer Dug. disponibles con todo su código fuente.
Contribuiremos a esta colección con un
POR STEVEN GOODWIN Figura 1: La pantalla de bienvenida pequeño juego de plataformas llamado
Explorer Dug. Lo programaremos en C

S
DL significa Simple DirectMedia rango de conjuntos de características (ya que probablemente sea la forma en
Layer y es una API multi- desde primitivas gráficas básicas, hasta que se entenderá mejor), aunque se
plataforma para programar apli- redes y soporte para tipografías True puede escribir aplicaciones SDL en
caciones multimedia, como los juegos. Type (TTF). La mayoría de estas librerías muchos otros lenguajes, como PHP,
Aporta una base estable sobre la que los han sido enviadas por usuarios finales y Ruby, Perl, Java y LISP. Principalmente
programadores pueden trabajar, sin pre- no forman parte del paquete principal de nos concentraremos en las característi-
ocuparse de cómo se encargará el SDL. Esto no es un problema en sí cas de SDL y cómo usarlas para producir
hardware de renderizarlo o incluso qué mismo, pero si el propósito principal es un juego. También destacaremos las
hardware lo ejecutará. usar SDL para trabajar desarrollando áreas del desarrollo del juego que
SDL está disponible bajo la licencia para varias plataformas, el desarrollador requiere más trabajo de nosotros los pro-
LGPL (Licencia Pública General Menor), habrá de asegurarse de que las librerías gramadores ¿De acuerdo? ¡Bien!
y como tal no requiere que el código que pretende utilizar se encuentran Comencemos…
fuente de la aplicación que se base en disponibles para las plataformas con las
ella sea publicado. que vaya a trabajar, ya que no todas Gran Bola de Fuego
Actualmente existen buenas imple- están completamente soportadas. La primera tarea es descargar e instalar
mentaciones de SDL para Linux (i386, La herencia de Windows en SDL es SDL. La versión actual estable es la
PPC, y PS2), BSD, Windows, Macintosh muy evidente dentro de la API, tanto es 1.2.7, y está disponible desde [3] como
OS 9/X, Solaris, Irix y BeOS. así que mucha de la terminología (y un archivo tar comprimido con gzip.
muchas de las funciones) son muy pare- Además de distribuirse el código fuente,
Acceso versus Emulación cidas a sus equivalente en DirectX. A están disponibles dos versiones binarias
La API SDL está compuesta de cinco pesar de ello, no se emula Windows de
subsistemas distintos: vídeo, audio, ninguna manera. En cambio, cada lla- Cuadro 1: Drivers
CDROM, entrada de joystick y tempo- mada a la API gráfica de SDL, por SDL no está limitado a X11 como dispositivo
rizadores. Cada uno apunta a un área de ejemplo, utiliza directamente el contro- de salida.También puede usar dga, fbcon ¡y
desarrollo diferente y puede ser inicial- lador desde el sistema operativo hasta aalib! Para hacer uso de estas carac-
izada y usada independientemente de anfitrión, bastante distinto a lo que sería terísticas, debemos asegurarnos de que el
los demás. Además, SDL fomenta el uso un sistema emulado. dispositivo apropiado se compila dentro de
SDL (lo cual requerirá otro ./configure, make,
de librerías que puedan suministrar En Windows, esto implicaría el uso de
make install del paquete). Entonces podrá
nuevas funcionalidades a la API básica. DirectX. Bajo Linux, se utiliza una de las
usar la variable de entorno SDL_VIDEO-
Las dos librerías más comunes son librerías del dispositivo de gráficos,
DRIVER para indicar que dispositivo quiere
SDL_mixer (que proporciona un mejor como X11 o DGA. También está sopor- usar. Por ejemplo:
manejo de audio) y SDL_Image, que pro- tado el control MTR (Memory Type
export SDL_VIDEODRIVER=aalib
porciona soporte para una amplia Range Register, [2]) aplicaciones aceler-
./explore
selección de formatos de ficheros gráfi- adas a pantalla completa (véase el
Puede encontrar una lista de los dispositivos
cos, incluyendo, GIF, JPG, PNG y TGA. Cuadro 1: Dispositivos).
suministrados con SDL tecleando:
El sitio principal de SDL [1] lista 109 libr- La API de audio puede reclutar los ser-
./configure -help | grep U
erías diferentes, actualmente en vicios de OSS, ESD o aRts para
enable-video
producción, suministrando un amplio suministrar música y efectos de sonido.

28 Número 01 www.linuxmagazine.com.es
028-032-juegos 22.11.2004 16:20 Uhr Seite 29

SDL DESARROLLO

diferentes: Ejecución, runtime, y desar- Todos los programas SDL pueden tarde, deberíamos comenzar siempre con
rollo (development). Naturalmente, la comenzar con una de estas lineas: un SDL_Init, porque incluye la inicial-
última proporciona mejores facilidades ización de otros componentes que
de depuración, lo cual es más útil para #include "SDL.h" SDL_InitSubsystem no tiene. Muestras de
nosotros, como desarrolladores. De todas estos componentes podrían ser: Las
formas recomiendo trabajar con las o: hebras son inicializadas, el ultimo
fuentes ya que esto nos permite un código de error es borrado y el paracaí-
mejor ajuste y el uso completo de un #include "SDL/SDL.h" das es (opcionalmente) desplegado
depurador para introducirnos en el mis- (véase Cuadro Paracaídas).
mísimo código de SDL. Esto no solo es La primera es preferible por motivos de
útil en el seguimiento de errores, tam- portabilidad en varias plataformas, SDL_Init(SDL_INIT_VIDEO | U
bién puede ser muy iluminador. aunque esto requerirá que se añada el SDL_INIT_AUDIO);
El archivo tar.gz se desempaqueta de directorio SDL a la lista de rutas inclu-
la manera habitual: idas que gcc buscará. Todas las demás Es exactamente igual a:
cabeceras de archivos SDL están incor-
tar xfz SDL-1.2.7.tar.gz poradas dentro de ésta para así limitar el SDL_Init(SDL_INIT_VIDEO);
mantenimiento. También necesitamos SDL_InitSubSystem
Y se instala con el proceso igualmente enlazar la librería principal de SDL (lib- (SDL_INIT_AUDIO);
familiar: SDL) dentro de nuestra aplicación. Al
principio solo usaremos las funcionali- Por ahora, solo necesitamos el subsis-
./configure dades de está librería. Según pase el tema de vídeo, por tanto lo
make tiempo y nuestros requisitos crezcan, inicializaremos y comprobaremos si hay
make install añadiremos otras librerías. Hasta errores. SDL adopta el estándar de usar
entonces, los dos requisitos de más valores negativos para indicar un código
Por defecto, esto colocará las librerías arriba pueden satisfacerse en la linea de error. El valor de este número indica
necesarias y los archivos incluidos en comandos con: el error concreto.
/usr/local/lib y /usr/local/include/SDL SDL también suministra la función
respectivamente, aunque esto puede gcc -I/usr/include/SDL -lSDL U SDL_GetError que devuelve el nombre
cambiarse en el proceso de inicio con: test/testsprite.c textual del ultimo error. Pero debe ser
llamado inmediatamente, porque si la
./configure -prefix=/poner/sdl/U Si cambia las rutas de librerías e inclui- subsiguiente función SDL falla, el ante-
algunsitio/encualquierotraparte dos, se puede usar el programa sdl-config rior error se perderá.
para obtener esta información (véase Cerrar el sistema es tan simple como
Además de suministrar dispositivos adi- Cuadro SDLCONFIG). llamar a la función SDL_Quit.
cionales, debería tener pocos motivos
para repetir el proceso ./configure ya que El Mundo en Nuestras Manos void exRelease(void)
SDL es fácil de configurar y muy estable, Nuestra primera incursión en la progra- {
e invariablemente funciona a la primera. mación con SDL será la pantalla de SDL_Quit();
El paquete SDL también contiene un “bienvenida” del juego. Con esto abar- }
extenso juego de páginas de manual caremos un número de conceptos
(sección 3) detallando los parámetros e fundamentales, tal como superficies, Cuadro 2: SDLCONFIG
indicadores de cada función. blitting (de blit: Block Image Transfer) y
sdl-config es un pequeño programa que
actualización de pantalla.
viene empaquetado con SDL y su función es
Arriba con ese muro Cada estructura y función SDL básicamente informar o prefijar, el lugar de
El paquete SDL viene con un pequeño comienza con el prefijo SDL_. Además la instalación de SDL.También se puede usar
conjunto de pruebas que permiten com- envolveremos estas funciones dentro de para dar los indicadores correctos tanto al
probar la integridad de cada subsistema. las nuestras (todas precedidas con ‘ex’) compilador como al enlazador.
Lo encontraremos en el directorio test, y para encapsular mas funcionalidad y $ sdl-config
funcionará nada más terminar la insta- suministrar un lugar común donde Usage: sdl-config [--
lación, siempre que haya salido todo reunir el código del juego y el de SDL. prefix[=DIR]] [--exec-
bien. En el caso de que surjan proble- Esto ayudará en la depuración. prefix[=Dir]] [--version]
mas, buscaremos los mensajes de error La primera etapa es inicializar SDL. [--cflags] [--libs][--static-
que cada prueba envía a la linea de Hay dos funciones para hacer esto, libs]
comandos, ya que pueden indicar si son SDL_Init y SDL_InitSubSystem. SDL_Init $ sdl-config -libs
problemas con el hardware o la configu- puede inicializar uno (o más) subsis- -L/usr/local/lib -Wl, -
ración. Si la maquina es capaz de temas y debería ser la primera función rpath, /usr/local/lib -lSDL -
ejecutar un escritorio, debería estar a la SDL en un programa. Aunque podemos lpthread
altura de cualquier tarea con SDL inicializar subsistemas adicionales más

www.linuxmagazine.com.es Número 01 29
028-032-juegos 22.11.2004 16:20 Uhr Seite 30

DESARROLLO SDL

De igual modo que se puede inicializar SDL_Surface *pScreen;


un subsistema individualmente, también pScreen = SDL_SetVideoModeU
Cuadro 3: Paracaídas
El paracaídas es una manera de capturar
puede cerrarlo de una manera similar: (640, 480, 16, SDL_HWSURFACE);
señales (tales como fallos de segmentación,
errores de bus, cauces rotos y excepciones de
SDL_QuitSubSystemU Aquí tenemos una configuración de punto flotante) lo cual da a SDL una oportu-
( SDL_INIT_VIDEO ); superficie de vídeo a 640x480. El 16 nidad para llamar a SDL_Quit y liberar sus
indica la profundidad de bit, el cual recursos. El paracaídas se instala automáti-
La función final siempre debe ser refleja el número total de colores camente en la inicialización, si no queremos
SDL_Quit, ya que esto retirará lo mane- disponibles. En este caso, 65.536 (2^16), utilizarlo, debemos empezar la aplicación
jadores de señales del paracaídas y lo cual nos da un buen equilibrio entre con:
terminará cualquier hebra que quede calidad visual y velocidad. Las opciones SDL_Init ( SDL_INIT_VIDEO |
activa. habituales son 8, 16 y 24 aunque SDL SDL_INIT_NOPARACHUTE);
puede soportar 12 y 15 (véase el cuadro La aplicación debe suministrar sus propios
La primera vez que vi tu cara Carga de Profundidad). manejadores de señales si es necesario, si
En SDL todos los gráficos se almacenan Normalmente, en el desarrollo de soft- bien conviene recordar que, en aras de la
en ‘superficies’. Es un termino que se ha ware el programador está limitado por el portabilidad, no todas las plataformas
tomado prestado de DirectX y que sig- hardware con el que trabaja y obligado a soportan todas las señales y algunas
plataformas no soportan señales en abso-
nifica ‘memoria gráfica’. La pantalla es doblegarse a sus exigencias sin rechistar.
luto.
una superficie. La imagen del fondo es Los juegos, afortunadamente, son un
una superficie. Los personajes son super- mundo aparte. Hemos elegido el tamaño
ficies, etcétera. Las superficies pueden de pantalla y la profundidad de bit para Véase el cuadro Funciones de vídeo.
ser creadas y destruidas varias veces a lo hacer alarde de nuestros gráficos en el El parámetro final es un juego de indi-
largo de la vida del juego. Sin embargo, mejor entorno posible. Si no utilizamos cadores a nivel de bit. Estos especifican
sólo puede haber una superficie de pan- suficientes colores, por ejemplo, gráficos atributos para la superficie y la ventana
talla. Es esta superficie de pantalla la que esenciales como la llave o la puerta de en la que es mostrado. El indicador
aparece en el monitor y, por tanto, salida pueden ser difíciles (o imposibles) SDL_HWSURFACE requiere que la super-
cualquier cosa que quiera que sea visible de ver. Esto es injusto para el jugador y ficie de la pantalla, si es posible, deba ser
debe ser dibujada encima de esta super- por eso es admisible salir del juego si creada en memoria de vídeo. Si nos
ficie. esta resolución no se puede conseguir. encontramos que el dispositivo no
Las superficies pueden ser de un Por otra parte, si se está usando SDL soporta superficies de hardware (como
tamaño arbitrario y son retenidas en dos para aplicaciones que no son juegos, o en el caso de X11), o que la memoria
lugares: memoria de vídeo o memoria de no importa la degradación de la imagen, hardware está llena, la superficie puede
sistema. La memoria de vídeo es más se puede usar cualquier modo de vídeo ser creada, pero software.
rápida y es conocida como “superficie de que el usuario pueda tener ajustado en Si es apropiado crear una superficie
hardware”. La memoria de sistema (o su escritorio poniendo la profundidad de hardware para un búfer en particular
memoria software) es parte de la RAM bit a cero: (como por ejemplo para la pantalla prin-
normal y marcada internamente por SDL cipal), seguimos teniendo que invocar
como ‘datos gráficos retenidos’. pScreen = SDL_SetVideoModeU SDL_HWSURFACE. Puede que nosotros
La pantalla se inicializa con el (640, 480, 0, SDL_HWSURFACE); estemos utilizando X11, pero otro
comando especial SetVideoMode, aun- printf("The bit depth is set toU usuario podría no estar haciéndolo y ten-
que la superficie que devuelve no es %d\n", pScreen>format>U emos que darles el mejor juego que
diferente de cualquier otra. BitsPerPixel); podamos.

Listing 1: Initialise Listing 2: First screen


01 BOOL exInitSDL(void) 01 SDL_Surface *pImg;
02 { 02
03 if (SDL_Init(SDL_INIT_VIDEO) 03 if ((pImg = SDL_LoadBMP("welcome.bmp")))
< 0) 04 {
04 { 05 /* Hemos cargado con éxito la imagen */
05 fprintf(stderr, "No se 06
pudo inicializar video SDL: 07 SDL_BlitSurface(pImg, NULL, pScreen, NULL);/* transferir todo */
%s\n", SDL_GetError()); 08 SDL_UpdateRect(pScreen, 0,0,0,0); /* toda la pantalla */
06 return FALSE; 09 SDL_Delay(2*1000); /* 2 segundos */
07 } 10
08 11 /* A continuación liberamos la superficie */
09 return TRUE; 12 SDL_FreeSurface(pImg);
10 } 13 }

30 Número 01 www.linuxmagazine.com.es
028-032-juegos 22.11.2004 16:20 Uhr Seite 31

SDL DESARROLLO

Además está el parámetro final que , int height, int depth, Uint32U Una forma mucho más fácil es dibujar
permite redimensionar la ventana Rmask, Uint32 Gmask, Uint32 U las imágenes con GIMP y salvarlas como
(SDL_RESIZABLE), quitarle el marco Bmask, Uint32 Amask); un BMP. Entonces se puede cargar la
(SDL_NOFRAME) o soportar renderizado imagen, correctamente formateada y
OpenGL (SDL_OPENGL). A menudo, SDL_Surface *SDL_CreateRGBU copiarla dentro de una flamante superfi-
el primer impulso con un juego es SurfaceFrom(void *pixels, int U cie. SDL permite esta generosa
hacerlo a pantalla completa (SDL_ width, int height, int depth, U funcionalidad con una simple función
FULLSCREEN). int pitch, Uint32 Rmask, Uint32U llamada:
Pero nos quedaremos con una versión Gmask, Uint32 Bmask, Uint32 U
en ventana ya que es más fácil trabajar Amask); SDL_Surface *SDL_LoadBMPU
con ella. Además, es posible hacer que la (const char *file);
máquina se vuelva inutilizable si se está Esto se utiliza raramente por que tiene
ejecutando el juego a pantalla completa, que escribir cada pixel de la imagen SDL solo provee soporte a archivos BMP
desde donde no es siempre posible con- (en el formato correcto) directamente dentro de la librería estándar. Aunque
mutar a otro escritorio virtual y matar el dentro de la superficie. Además, normal- SDL_image suministra soporte para
programa. Esto también ocurre si se mente hay una gran cantidad de muchos otros formatos, nuestro juego se
tropieza con un punto de ruptura en el pixels. limitará a BMPs y hará uso de varias
depurador o se nos olvida aportar algún
mecanismo para abandonar el juego. Cuadro 5: Carga de profundidad
Recordemos que, al igual que un depu-
rador, el paracaídas de SDL captura varias Cuando la profundidad de bit es distinta de tabla se llama la paleta (la cual usa 24 bits
8, los datos del pixel se almacenan en un completos para almacenar la información de
señales (como Ctrl+C) y, por tanto, éstas
“formato empaquetado”. Esto se llama así color) y puede ser configurada con las fun-
no están siempre disponibles.
porque el color se representa con tres ciones SDL_SetColors y SDL_SetPalette.
Cada superficie que se crea (y eso números, uno para cada uno de los compo- Aunque hoy en día ha decaído en lo que se
incluye a la pantalla) debe ser liberada nentes rojo, verde y azul que se empaquetan refiere a la programación de juegos, gracias a
con la función SDL_FreeSurface, una vez juntos (en un simple Uint o Uint32) para este formato, se puede mantener la produc-
que ha dejado de usarse: mostrar el color. Con una profundidad de 24 ción de gráficos de alta calidad en hardware
bits (a veces llamado Color verdadero), cada muy limitado.También se pueden producir
SDL_FreeSurface(pScreen); uno de los componentes RGB ocupa 8 bits. muchos efectos interesantes (y muy rápidos)
Esta es la resolución más alta que probable- cambiando los colores en la paleta sin hacer
Mis Posesiones Terrenales mente necesitemos, pero normalmente es cambios en cada pixel sobre la pantalla. El
Además de la pantalla, necesitamos excesiva para la mayoría de los juegos. mayor problema con las superficies de 8 bits
Desafortunadamente las cosas se vuelven paletizadas es que solo se dispone de 256
algunas superficies de nuestra pro-
más complicadas con el más común de los colores específicos para toda la imagen. Si el
piedad, dentro de las cuales podremos
formatos empaquetados. Me refiero al color fondo usa un juego de 256 colores y el per-
dibujar nuestro gráficos. Hay dos formas de 16 bits. En este caso los componentes RGB sonaje principal usa otro diferente, entonces
principales de crear nuestras propias usan 5, 6, y 5 bits para cada color o ¡5, 5 y 6 o SDL cambiará automáticamente algunos de
superficies. La primera es crear la super- 6, 5 y 5! El formato exacto de la superficie los colores. Si bien esto no es algo demasiado
ficie manualmente con una de las puede variar dependiendo de donde esté malo, los resultados pueden ser impredeci-
siguientes funciones: almacenado y que tarjeta gráfica se esté bles y por lo tanto hará que el trabajo
usando. La orden también puede variar si se artístico sea un poco menos impresionante.
SDL_Surface *SDL_CreateRGBU está usando un PowerPC, por ejemplo, La otra cara de la moneda, sin embargo, es
Surface(Uint32 flags, int widthU debido a la cuestión de la orientación de los que mover datos de 8 bits es el doble de
datos (endian). Sin embargo, esto no es algo rápido que mover datos de 16 bits y, por
de lo que debamos preocuparnos, ya que
Cuadro 4: Funciones de desde SDL se convierten los formatos
tanto, es a menudo un truco empleado para
dispositivos de mano (PDAs, móviles, etc.).
vídeo automáticamente durante una transferen- Para asegurar la compatibilidad en varias
Estas funciones pueden suministrar alguna cia de bloque o blit. Si se necesita plataformas, los tipos estándar de C como
idea útil sobre que modos de vídeo son posi- comprender el formato interno (tal como short e int, no se usan. En su lugar, SDL define
bles con SDL. Las páginas de manual tienen veremos más tarde en esta serie) es agrad- los suyos propios, que son usados por toda la
prototipos completos y una explicación de able saber que SDL suministra la función API. Estos tipos pueden cambiarse sobre
estas funciones. SDL_MapRGB para ayudarnos. En verdad, nuevas plataformas para asegurar que un
SDL_GetVideoinfo Recupera información acerca este problema con el formato de los paque- Uint16, por ejemplo, es siempre de 16 bits.
del hardware de vídeo. tes también se manifiesta con el modo de
typedef unsigned char Uint8;
SDL_VideoDriverName Da el nombre del dispositivo de color de 24 bits, pero es menos pronunciado.
typedef signed char Sint8;
vídeo. Las reglas cambian cuando se especifica una
profundidad de bit de 8. En vez de separar los typedef unsigned short Uint16;
SDL_ListModes Enumera todas las resolucio-
nes de pantalla disponibles. 8 bits dentro del componente RGB, cada typedef signed short Sint16;
SDL_VideoModeOK Determina si un modo especi valor (desde 0 a 255) referencia a una tabla typedef unsigned int Uint32;
fico de vídeo está disponible. separada que indica el color actual. Esta typedef signed int Sint32;

www.linuxmagazine.com.es Número 01 31
028-032-juegos 22.11.2004 16:20 Uhr Seite 32

DESARROLLO SDL

superficies cargadas de esta manera. cualquiera de las dos superficies, fuente cie pantalla que hemos configurado no
Cada superficie retendrá un juego de grá- o destino. Esto es muy útil, ya que es la imagen que se visualiza en la ven-
ficos específico: Uno para el telón de podemos dibujar gráficos en posiciones tana. Esa imagen se controla por el
fondo, otro para el jugador, otro para el tales como (-4, -2) o (600, 450), lo cual dispositivo (tal como X11), no por SDL.
enemigo, etcétera. permite dividir suavemente nuestros grá- A fin de ver la imagen, debemos decirle
La imagen final del juego, por tanto, se ficos por el borde de la pantalla. SDL a SDL que actualice el dispositivo con el
construirá a partir de muchas copias de resuelve como representar la porción vis- gráfico de nuestra superficie. Para hacer
superficies a superficie (recordemos que ible óptimamente. esto usaremos la función SDL_
la pantalla es solo una superficie), UpdateRect.
aunque gobernadas por la lógica del SDL_Rect srcrect = U
juego. Este proceso de copiado se llama {600, 450, 64, 64}; void SDL_UpdateRect(U
blitting y es la abreviatura de BLock SDL_Surface *screen, Sint32 x, U
Image Transfer. Solo transferiremos bloques desde 600, Sint32 y, Sint32 w, Sint32 h);
450 a 639, 479 aunque la extensión sea
El Baile del Blit 663, 513. Si se quiere transferir en Sólo un pequeña porción rectangular de
Podemos transferir bloques (blits) entre bloque la superficie entera (como hici- la pantalla es actualizada (lo cual es nat-
dos superficies cualquiera y eso incluye mos en la pantalla de bienvenida) uralmente más rápido que si
desde una superficie a sí misma. Tam- entonces pasaremos srcrect como NULL. actualizamos toda la superficie). Como
bién podemos transferir bloques desde Solo usamos las coordenadas x, y de alternativa, podemos elegir pasar ceros a
una porción de una superficie, a una por- dstrect refiriéndonos a la esquina supe- cada uno de los parámetros y actualizar
ción diferente de otra superficie. La rior izquierda del área de destino, todo el área de golpe. Por ejemplo:
única limitación es que el tamaño de porque no somos capaces de estirar y
ambas porciones (la fuente y el destino) transferir bloques. Pasando NULL como SDL_UpdateRectU
deben ser del mismo tamaño. La valor dstrc le diremos a SDL que (pScreen, 0, 0, 0, 0);
operación de transferencia de bloques se comience la transferencia de bloque
puede (si ambas superficies están en desde (0,0). Si la extensión del bloque Ahora hemos transferido algunos blo-
memoria de vídeo) ejecutar por hard- transferido excede la superficie de des- ques a nuestra pantalla y provocado la
ware, lo cual es increíblemente rápido. tino la imagen se recortará normalmente. actualización del monitor y así actu-
No todos los dispositivos gráficos, no Esta área recortada puede ser limitada alizarlo con nuestra propia imagen. De
obstante, soportan la aceleración por artificialmente con: esta manera, si añadimos un pequeño
hardware, así que para un breve recorda- retraso, completaremos nuestra primera
torio, véase el cuadro Dispositivos. void SDL_SetClipRect(U pantalla.
Hay una sola función para hacer trans- SDL_Surface *surface, U Producir un nivel del juego o person-
ferencias de bloques. Es única así que es SDL_Rect *rect); ajes animados, es simplemente una
sencillo de recordar: cuestión de mas transferencias de blo-
Y cualquier futura transferencia de ques, en más lugares, desde más
int SDL_BlitSurface(U bloque a esa superficie solo ocurrirá den- superficies. No implica nada más que lo
SDL_Surface *src, U tro del área especificada en el que ya hemos visto. Desafortunada-
SDL_Rect *srcrect, U rectángulo. Como dije más arriba, mente, hay buenas y malas manera de
SDL_Surface *dst, U pasando NULL como puntero SDL_Rect, hacer esto. El próximo mes le daremos
SDL_Rect *dstrect); le estamos diciendo a SDL que use el un vistazo a las buenas maneras,
área completa de la superficie, lo que mostraremos como las superficies
Desde esta función no se dispone de la efectivamente eliminara el área recor- pueden ser usadas para crear la pantalla
capacidad de estirar o rotar la superficie; tada. Esta característica nos permite del juego ¡y daremos vida a algunos de
para esto deberemos recurrir a mantener un área de la pantalla pura y los malos! ■
cualquiera de las librerías SDL_gfx [4] o sagrada, sin tener en cuenta que compo-
SGE [5]. Como el estirar bitmaps con- nentes del juego intenten transferir INFO
sume mucho tiempo de proceso no lo bloques allí, protegiendo información tal
[1] SDL: http://www.libsdl.org
usaremos en nuestro juego, ya que esta- cómo la puntuación, o el número de
[2] Memory Type Range Register: http://
mos aspirando a la máxima velocidad. vidas.
www.linuxvideo.org/user/mtrr.txt
Por tanto generaremos nuestros gráficos
al tamaño exacto que necesitemos. ¡Bienvenidos! [3] Descargas de SDL: http://www.libsdl.org/
SDL_Rect es una estructura simple Así que ahora podemos cargar una ima- download-1.2.php
para indicar el tamaño del área que quer- gen en una superficie y transferir un [4] Librería SDL_gfx: http://www.ferzkopp.
emos transferir, tomando como x, y, la bloque de esa superficie a otra superficie net/~aschiffler/Software/SDL_gfx-2.0/
anchura y la altura. SDL cortará (tal como la pantalla). A fin de ver como [5] Librería SGE: http://www.etek.chalmers.
automáticamente nuestras coordenadas queda nuestro trabajo, debemos dar a se/~e8cal1/sge/index.html
internamente si excedemos los límites de conocer una revelación más. La superfi-

32 Número 01 www.linuxmagazine.com.es

También podría gustarte