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: %sn",SDL_GetError());
	exit(1);
 } 

 screen = SDL_SetVideoMode(640,480,24,SDL_HWSURFACE);
 if (screen == NULL)
 {
	printf("No se puede inicializar el modo gráfico: %sn",
  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: %sn",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;
  }
}

Entradas relacionadas:

  1. Curso programación de videojuegos con SDL – Allegro, otra librería para el desarrollo de videojuegos
  2. Curso programación de videojuegos con SDL – ¿Qué es SDL?
  3. Curso programación de videojuegos con SDL – Introducción
  4. Curso programación de videojuegos con SDL – Instalación y configuración
  5. Curso C# con Mono – ¡Hola Mundo!

Acerca de F. Javier Carazo Gil

Casi Ingeniero Informático, co-fundador y administrador de Linux Hispano, co-fundador de Red de Autores y Geometrio, puedes saber más sobre mí, mi vida laboral, mis libros, mis artículos y mi día a día en @fjcarazo y en mi perfil público de LinkedIn.
  • aj.kaanbal

    Avanzando paso a paso. Gracias por el tutorial.
    Sólo un par de detalles. Las senencias “include” estan vacias.
    Yo agregué:

    #include "stdlib.h"
    #include "SDL/SDL.h"

    y funcionó.

    Otro detalle es en las siguientes líneas.

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

    faltaba un %s

  • http://elblogdeelsant0.blogspot.com/ elSant0

    Iba a comentarlo mismo que @aj.kaanbal

  • http://www.jcarazo.com F. Javier Carazo Gil

    @aj.kaanbal: Muchas gracias por avisar, ya está corregido, el problema viene por no poder usar en HTML los símbolos: < y >

    Ya está arreglado eso y el %s que se me había olvidado.

    En breve publico otra entrega, un saludo y gracias de nuevo :) (también a @elSant0).

  • Alexis

    muy buen tutorial , estoy experimentando con esto pero me sucede un error tal vez alguien me puede aclarar esto, cuando ejecuto el makefile la consola me ,arca un error de *** falta un separador , revizando el makefile este error se da justo cuando entra la linea de codigo $(shell $(SDL_CONFIG) –libs) segun lo q veo veo es por el espacio q se antepone segun el ejemplo intente quitarlo e incluso agregar un tab pero no me sirvio ninguna de esas opciones, pero si quito esa linea el makefile no marca ningun error…

    Seria de mucho ayuda si alguien me pudiera explicar como solventar este error

  • http://www.elaleprieto.com.ar aleprieto

    @Alexis, no sé si lo solucionaste pero me pasó lo mismo (recién arranco con C :)

    el tema es que la línea aparece cortada en el texto de arriba, cuando lo pegás en el Vi (o cualquier otro) debería ir todo en la misma línea…

    espero te sirva…

    saludos y gracias Javi por el tutorial!

  • http://csunsa.herobo.com Rommel Anatoli Quintanilla Cruz

    SDL_KEYUP no representa la tecla Flecha Arriba, sino creo al evento lanzado cuando una tecla se suelta, el hecho es que para identificar qué letra se presiono se debe comparar con event.key.keysym.sym, y para el ejemplo de arriba la comparación sería:


    if(event.key.keysym.sym==SDLK_UP)
    terminar=1;

    http://www.libsdl.org/docs/html/sdlkey.html

  • http://www.jcarazo.com F. Javier Carazo Gil

    @Rommel: a mí me funciona eso, de todas formas, veo que lo tuyo es más correcto, así que muchísimas gracias por el aporte.

  • http://maximi89.linuxerz.org maximi89

    Podrías añadir un

    void SDL_Delay(Uint32 ms);
    Después del SDL_Event event;

    SDL_Delay(10);
    Después de el while terminar == 0

    Esto para reducir el consumo de CPU, ya que si no hacemos esto el programa consume 100% de CPU… y al hacer este pequeño detalle que adaptamos a nuestras necesidades el programa baja de 90% de CPU a 1%

    Espero les sirva ;)

  • http://www.jcarazo.com F. Javier Carazo Gil

    @maximi89: Muchísimas gracias :) . Gran aporte.

    Tienes toda la razón, así mucho mejor.

  • _KURRY_

    estoy empezando en esto de programar,por puro entretenimiento,y veo que es complicado de cojones XDDD

    /home/kurry/360/CppApplication_1/main.c:17: undefined reference to `SDL_Quit’
    /home/kurry/360/CppApplication_1/main.c:18: undefined reference to `SDL_Init’
    /home/kurry/360/CppApplication_1/main.c:20: undefined reference to `SDL_GetError’
    /home/kurry/360/CppApplication_1/main.c:23: undefined reference to `SDL_SetVideoMode’
    /home/kurry/360/CppApplication_1/main.c:26: undefined reference to `SDL_GetError’
    /home/kurry/360/CppApplication_1/main.c:30: undefined reference to `SDL_WM_SetCaption’
    /home/kurry/360/CppApplication_1/main.c:31: undefined reference to `SDL_Flip’
    /home/kurry/360/CppApplication_1/main.c:34: undefined reference to `SDL_PollEvent’

    por quE da ese error?

  • http://www.jcarazo.com F. Javier Carazo Gil

    @_KURRY_ es un problema del enlazador. ¿Has usado un make?