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:
#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:
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: \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; } }
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.
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
Iba a comentarlo mismo que @aj.kaanbal
@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 ;)
@maximi89: Muchísimas gracias :). Gran aporte.
Tienes toda la razón, así mucho mejor.
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?