[PJRS] Primer contacto con SDL
Esta anotación forma parte de la serie Programando Juegos con Ruby y SDL.
Todos los programas que emplean la librería SDL tienen una estructura similar:
- Inicializar la librería
- Inicializar los subsistemas (vídeo, audio, etc.)
- El bucle del juego
- Salir del juego (
SDL
libera recursos automáticamente)
Esta estructura es casi siempre igual, así que incluso es posible hacer una plantilla para comenzar cómodamente cuando queramos arrancar con un nuevo proyecto.
En primer lugar es buena idea tener a mano las siguientes fuentes de documentación:
- Ruby user's guide
- Ruby Language Reference Manual
- Ruby/SDL Reference Manual (este último se puede descargar fácilmente para consulta offline, ya que es un solo fichero)
Como Ruby hace las cosas muy sencillas, vamos a complicar esa plantilla un poco más, lo que nos ayudará a entrar en contacto no solo con la librería sino con el propio lenguaje.
En Ruby
no podemos hacer referencia a nada, ya sea una función o una variable, hasta que el intérprete no ha leído el código que lo define. Por eso vamos a usar una estructura bastante sencilla que nos va a ahorrar muchos problemas.
#!/usr/bin/ruby # la linea de arriba puede que se tenga que ajustar en # nuestro sistema a la localización de ruby # usamos dos "librerías": # para procesar los parámetros del programa require 'parsearg.rb' # y bueno, ¿para qué será esto? ;) require 'sdl.rb' def main() # código de la función principal end # definimos otras funciones # por ejemplo como_usar def como_usar() puts "Uso: #{$0} (opciones)\n\n" puts "Con opciones:\n" puts "\t--fullscreen\n\n" end # comienza el juego main # fin del fichero
Vamos a escribir el código de esa función principal main
, empezando por tomar en nuestro programa un parámetro opcional para poner o no pantalla completa:
# ¿qué función explica cómo usar el programa? $USAGE = "como_usar" # solo una opción: --fullscreen # si hubieran más las pondríamos a continuación, separando con # comas: "fullscreen", "nosound" # (no he encontrado buena documentación de parseArgs) parseArgs(0, nil, nil, "fullscreen")
Ahora inicializamos SDL
. El valor de la opción lo recogemos en $OPT_fullscreen
(a cierto si se ha usado) cuando seleccionamos el modo de vídeo. Además cambiamos el título de la ventana y escondemos el ratón, por hacer bonito.
# inicializa SDL - se debe hacer antes de usar la librería # solo usamos vídeo por ahora SDL.init(SDL::INIT_VIDEO) # Cambiamos el título de la ventana SDL::WM.setCaption("Plantilla SDL", "") # ahora vamos a poner el modo de vídeo # no usaremos flags en el modo de vídeo por defecto sdlVideoFlags = 0 # ¿pantalla completa? if $OPT_fullscreen # añade el flag a lo que ya haya sdlVideoFlags |= SDL::FULLSCREEN end # ponemos el modo de vídeo a 640x480 16bpp pantalla = SDL.setVideoMode(640, 480, 16, sdlVideoFlags) # ¿algún problema? if pantalla == nil STDERR.puts "Problemas con setVideoMode\n" exit -1 end # no queremos ver el ratón SDL::Mouse.hide # por ahora ya vale, espera a que se pulse enter en # la consola donde ejecutamos el programa (si no estamos # en pantalla completa!) gets() if !$OPT_fullscreen
El código es muy sencillo, e incluso se hacen comprobaciones de error (si elegimos un modo de vídeo no soportado, por ejemplo).
Me he visto tentado a poner enlaces a la documentación de Ruby SDL
en los nombres de las funciones, pero me parece mucho mejor que cada uno vaya y busque la función para leer su funcionamiento y los parámetros que acepta. Cuando se utiliza una librería de propósito tan específico como SDL
, la mayor parte de la dificultad de su uso reside únicamente en consultar la documentación buscando qué función hace lo que nosotros necesitamos en cada momento.
Podemos probar la opción y ejecutar el programa en una ventana o en pantalla completa, aunque en el segundo caso acabará de inmediato. Esto es así porque en pantalla completa no podremos acceder a la consola donde ejecutamos la aplicación para satisfacer el gets
, lo que es un problema ;).
Se puede experimentar un poco con el código, aunque no es una plantilla completa. Aún faltaría una mínima gestión de eventos (para poder salir de pantalla completa pulsando una tecla, por ejemplo), pero eso ya lo dejo para la próxima entrega.
Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.