Categorías: Tutoriales

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;
  }
}
F. Javier Carazo Gil

Cofundador de CODECTION, empresa especializada en WordPress, autor de un libro sobre WordPress (el primero en español) y multitud de artículos (en medios físicos y virtuales) sobre el tema. Participa en la comunidad WordPress de forma activa siendo parte del equipo organizador de la WordPress Meetup de Córdoba, dando charlas en diferentes WordCamp y siendo autor y coautor de multitud de plugins libres y premium para WordPress de gran éxito.

Ver comentarios

  • 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

  • @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).

  • 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

  • @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!

  • 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

  • @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.

  • 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 ;)

  • 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?

Entradas recientes

DeepSeek

3 días hace

Contacto

2 semanas hace

Smart-tv mute

2 semanas hace

STEAM OS

3 semanas hace

2025

1 mes hace

El podcast de Linux Hispano – #072 – El hardware libre debe consolidarse como el software libre

https://www.youtube.com/embed/z-xGk9c_eOw Guionista y locutor: Manuel Ignacio López Quintero.Fecha de publicación: 31 de diciembre de 2024.

1 mes hace