Desarrollo de videojuegos en SDL I

Otro de los pdf que encontré y hasta ahora el que mejor pinta tiene para ayudarme a arrancar con algún jueguecito y estrenar mi portfolio.


Se titula Tutorial de libSDL para la programación de videojuegos y empieza con mucha teoría sobre SDL acompañado de bastante código de ejemplo para ir practicando. Algo ya había puesto en esta entrada, pero volveré a postearlo para dejar una serie de entradas juntas sobre dicho tutorial.

Las herramientas con las que se trabajará en el tutorial son:
  • SDL
  • Gimp
  • C/C++
  • Linux
  • Netbeans
  • GNU/GCC
  • Repositorios
  • Planificador de tareas
Básicamente no se necesitan muchos conocimientos previos, los básicos de programación, básicos de física y de inteligencia artificial. Si es un juego online, también se necesitan unos conocimientos de red.

La estructura básica del juego, como ya habíamos visto varias veces:
  • Inicialización
  • Game loop
    • Gestión de la entrada
    • Procesamiento
    • Salida de datos (dibujo en pantalla)
  • Finalización
Me salto la parte de los motivos por lo que se escoge SDL (multiplataforma entre otras cosas) y los tipos de videojuegos que hay, y paso a la librería SDL.

Librería SDL
SDL está compuesto por subsistemas. Algunos son:
  • Vídeo y gráficos
  • Eventos de entrada (teclado, ratón, joystick...)
  • Sonido
  • Manejo del CD-Rom
  • Timers
  • Gestión de dispositivos
  • Red
Comienzos con SDL
Se compila normal con g++ -o resultado prueba.c
Cuando incluimos SDL, se añade el flag -lSDL
Si usamos subsistemas concretos, se añaden los flags correspondientes
-lSDL_image -lSDL_ttf -lSDL_mixer -lSDL_net

Es buena idea usar los makefiles (localicé un pdf sobre este tema que seguramente me eche una mano)
De la misma forma, podemos especificar a g++ los flags de SDL. Es bueno que los conozca por lo que incluimos 'sdl-config --cflags --libs' (siendo libs los flags de sdl)

Tipos de datos en SDL
Para asegurar la compatibilidad, SDL especifica todos los detalles del dato
SxxxBB
S/U (signed/unsigned)
xxx (int, float...)
BB (número de bits, en múltiplos de 8)

Ej: Uint32

Funciones básicas en SDL
Uint32 SDL_WasInit(Uint32 ags);
Nos devuelve si el subsistema se ha inicializado. Devuelve 0 si no, o el flag o flags inicializados. Los flags se pueden combinar con OR.

char *SDL_GetError(void);
Devuelve un string con el error sucedido.

Inicialización y finalización del SDL
Se incluyen las librerías necesarias, por ejemplo
#include <SDL/SDL.h> //SDL básico
#include <SDL/SDL_ttf.h> //para las fuentes

Se inicializa en primer lugar
int SDL_Init(Uint32 flags)

La función devuelve 0 si ha sido correcto o -1 si algo ha ido mal. Los distintos valores de flags son:
  • SDL_INIT_VIDEO: Inicializa el subsistema de video.
  • SDL_INIT_AUDIO: Inicializa el subsistema de audio.
  • SDL_INIT_TIMER: Inicializa el subsistema de timers.
  • SDL_INIT_CDROM: Inicializa el subsistema de CD-ROM.
  • SDL_INIT_JOYSTICK: Inicializa el subsistema de joystick.
  • SDL_INIT_EVERYTHING: Inicializa todos los subsistemas.
  • SDL_INIT_NOPARACHUTE: Prepara a SDL para capturar señales de error fatal.
Si se inicializan varios subsistemas, se hacen en el mismo comando, combinando los flags con OR. Si más adelante necesitamos iniciar otro subsistema, se usa la siguiente orden
int SDL_InitSubSystem(Uint32 flags);

Cuando acabemos, hemos de cerrar con
void SDL_Quit(void);

Si sólo necesitamos cerrar algún subsistema antes del final, usamos
void SDL_QuitSubSystem(Uint32 flags);

Para establecer un título de ventana
SDL_WM_SetCaption(char *title, icono);


Antes de dibujar nada, tenemos que establecer un "lienzo" donde pintar, el cual es SDL_Surface.

Para asegurarnos de que se ejecutan funciones antes de cerrar la aplicación, tenemos la función atexit(); que recibe una función como parámetro, por ejemplo
atexit(SDL_Quit);

Para establecer el modo de vídeo tenemos
SDL_SetVideoMode();


En la siguiente entrega, ¡más!

Etiquetas: ,. Guarda el enlace permanente.

Deja un comentario ^^