Curso programación de videojuegos con SDL – ¡Hola mundo!

Comenzaremos con un ejemplo mínimo de SDL dónde abriremos una ventana con el título “Hola Mundo”. Para ello además del código en C prepararemos el Makefile para compilarlo. Podríamos haber usado un entorno de desarrollo integrado como Anjuta por ejemplo, pero ya que se trata de una iniciación a SDL lo mejor creo que es trabajar directamente sobre el compilador y los Makefile.

Makefile

Comenzaremos con el Makefile. Incluiremos además de “sdl-config” las librerías que hemos instalado en el paso anterior:

SDL_CONFIG = sdl-config
DEFAULT_CFLAGS = $(shell $(SDL_CONFIG) --cflags)
MORE_CFLAGS = -O2 

CFLAGS = $(DEFAULT_CFLAGS) $(MORE_CFLAGS)
CXXFLAGS = $(DEFAULT_CFLAGS) $(MORE_CFLAGS) -fno-exceptions -fno-rtti 

LDLIBS = -lSDL_image -lSDL_mixer -lSDL_ttf -lSDL_net
 $(shell $(SDL_CONFIG) --libs) 

all: holamundo_sdl
holamundo_sdl: holamundo_sdl.c 

clean:
	rm -f *~
	rm -f main.o main

holamundo_sdl.c

Pasemos ahora a implementar nuestro primer programa con SDL. Será lo más sencillo posible y básicamente realizará las dos siguientes acciones:

  • Abrirá una ventana con el título “Hola Mundo SDL”.
  • Se cerrará cuando pulsemos “Tecla hacia arriba”.
#include <stdio.h>
#include <stdlib.h>
#include <SDL.h> 

int main(int argc, char *argv[])
{
 SDL_Surface *image, *screen;
 SDL_Rect dest;
 SDL_Event event; 

 int terminar=0; 

 atexit(SDL_Quit); 

  if (SDL_Init(SDL_INIT_VIDEO) < 0)
 {
	printf("No se pudo iniciar SDL: %s\n",SDL_GetError());
	exit(1);
 } 

 screen = SDL_SetVideoMode(640,480,24,SDL_HWSURFACE);
 if (screen == NULL)
 {
	printf("No se puede inicializar el modo gráfico: %s\n",
  SDL_GetError());
	exit(1);
 } 

 SDL_WM_SetCaption("Hola Mundo SDL","Hola Mundo SDL"); 

 SDL_Flip(screen);
 while(terminar == 0)
 {
	while ( SDL_PollEvent(&event) )
	{
		if ( event.type == SDL_KEYUP )
			terminar = 1;
	}
 } 

 return 0;
}

Comentemos lo más importante del mismo:

  • Inicio de SDL y salida si algo falla.
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
  printf("No se pudo iniciar SDL: %s\n",SDL_GetError());
  exit(1);
}
  • Establecer modo de vídeo a 640×480 píxeles, 24 bits de profundidad de color (y salida si algo falla al igual que antes). Podéis apreciar que si existe error podemos capturarlo con “SDL_GetError()”
screen = SDL_SetVideoMode(640,480,24,SDL_HWSURFACE);
if (screen == NULL)
{
  printf("No se puede inicializar el modo gráfico: \n",SDL_GetError());
  exit(1);
}
  • Ponemos el título a la pantalla:
SDL_WM_SetCaption("Hola Mundo SDL","Hola Mundo SDL");
  • Actualizamos la pantalla:
SDL_Flip(screen);
  • Obtenemos los eventos. En caso del evento ser: “Pulsación de tecla Flecha Arriba”, cerramos el programa. Como podéis apreciar el evento es almacenado en “event” que es una variable del tipo SDL_Event. Dentro de dicha varible accedemos al tipo de evento. El evento pulsación “Flecha Arriba” es: “SDL_KeyUp” como podéis observar.
while(terminar == 0)
{
  while ( SDL_PollEvent(&event) )
  {
     if ( event.type == SDL_KEYUP )
        terminar = 1;
  }
}