15 de Diciembre, 2005

[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:

  1. Inicializar la librería
  2. Inicializar los subsistemas (vídeo, audio, etc.)
  3. El bucle del juego
  4. 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:

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.

Anotación por Juan J. Martínez, clasificada en: sdl, ruby, programming.

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.

Algunas anotaciones relacionadas: