Curso de introducción a videojuegos multiplataforma con SDL Introducción Bruno González y Pablo Orduña aka StenyaK y NcTrunstenyak@gmx.net - pablo@ordunya.com http://kwh.iespana.es Julio 2004 e-ghost ESIDE Universidad de Deusto This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/2.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
SDL - Qué es? Introducción Aspectos de portabilidad Subsistemas Juegos que la utilizan Cómo instalarla Otros módulos
La SDL es una librería para desarrollo multimedia multiplataforma: Funciona bajo: GNU/Linux, Windows, BeOS, MacOS Classic, MacOS X, FreeBSD, OpenBSD, BSD/OS, Solaris, IRIX, and QNX Hay ports no oficiales para: Windows CE, AmigaOS, Dreamcast, Atari, NetBSD, AIX, OSF/Tru64, RISC OS, and SymbianOS Proporciona al programador una API para manejar tanto gráficos, eventos, sonido, etc. a un relativo bajo nivel, pero manteniendo en lo posible la portabilidad
Está implementada en C, y funciona en C++ de manera nativa. Además, puede ser utilizada con otros lenguajes: Ada, C#, Eiffel, Erlang, Euphoria, Guile, Java, Lua, ML, Objective C, Pascal, Perl, PHP, Pike, Python, o Ruby
Es una librería simple En sí sola, no permite: La carga de imágenes en otro formato que BMP La carga de sonidos en otro formato que WAV El mezclar sonidos para que suenen a la vez El mostrar textos en pantalla El dibujar unos gráficos mínimos (ni siquiera líneas) El uso portable de redes Estas características deben ser implementadas aparte
Sin embargo, todas estas características (y muchas más) están completamente cubiertas por distintos módulos de la SDL Así, en la sección Libraries de www.libsdl.org encontramos diversas librerías con diferente soporte para diferentes plataformas. Entre otras, encontramos librerías de manejo de widgets, de carga de vídeos, wrappers para C++...
Consta de 8 subsistemas: Video Manejo de eventos Audio Multithreading Manejo de flujos con ficheros Timers CD-ROM Joystick
Subsistema de video: Es el subsistema en el que más nos vamos a centrar Permite acceso directo al hardware en determinadas condiciones. En la API tiene funciones para hacer llamadas a OpenGL Utilizaremos los módulos SDL_image, SDL_gfx y SDL_ttf para el manejo de imágenes en diferentes formatos, funciones para manejo de gráficos y escritura de textos en pantalla
Subsistema de manejo de eventos Podemos controlar la entrada de datos del usuario por medio de una cola de eventos de la propia SDL El hardware que produce los eventos de este subsistema es únicamente el ratón y el teclado
Subsistema de audio La SDL permite el manejo de sonido en formato WAV, pero no permite de manera nativa la mezcla de sonidos, por lo que puede dificultar bastante el uso que se le pueda querer dar en un videojuego Nos centraremos en el módulo SDL_mixer, ya que permite el uso de muchos otros formato y sí permite de manera sencilla la mezcla de sonidos
Subsistema de manejo de threads La SDL proporciona funciones para manejar diferentes hilos de manera portable (a excepción de Mac OS anterior a Mac OS X). El aprovechamiento de estas funciones puede distar mucho del que se podría hacer en un Sistema Operativo concreto, pero aún así puede ser muy útil. Permite el uso de semáforos, mutex y condiciones (además de timers)
Subsistema de manejo de flujos con ficheros La SDL nos permite acceder a determinados tipos de ficheros de manera portable, independientemente de cómo estén almacenados (Big Endian, Little Endian)
Subsistema de timers La SDL proporciona funciones para poder cronometrar secciones de código Además, proporciona funciones que se ejecutan al de cierto tiempo (incluso repetidamente si así se requiere) en un hilo independiente
Subsistema de manejo de CD-ROM La SDL permite el manejo del CD-ROM para poder reproducir música mediante una serie de simples funciones
Subsistema para el manejo del Joystick Este subsistema de la SDL está dedicado al manejo de Joysticks, trackballs y hardware similar
Juegos que lo han utilizado: Comerciales: No comerciales: tuxracer ;-)
Instalación Debian Otros # apt-get install libsdl1.2-dev libsdl1.2debian http://www.libsdl.org/download-1.2.php hay binarios para GNU/Linux (rpms), Windows, BeOS, Mac OS (Classic), Mac OS X y QNX, así como los fuentes.
En Microsoft Windows, utilizaremos el Dev-Cpp http://www.bloodshed.net/devcpp.html Utiliza por defecto mingw32, pero puede utilizar otros compiladores del estilo GCC (cygwin, por ejemplo) En cygwin se puede instalar compilándo cada módulo que se quiera utilizar En mingw32 se puede utilizar diréctamente los binarios compilados con mingw32 o bien los binarios compilados con MSVC si el código estaba en C (no se podrá si estaba en C++) Las opciones de compilación y linkado serán exáctamente las mismas que en el GCC
Instalando SDL en Windows con el Dev- Cpp: 1º Descargar de http://www.libsdl.org/download-1.2.php el archivo preparado para mingw32. 2º Descomprimirlo. Copiar el contenido del directorio lib en el directorio C:\Dev-Cpp\lib\ 3º Copiar el contenido de la carpeta include en el directorio C:\Dev- Cpp\include\ 4º Copiar el archivo SDL.dll contenido en directorio bin, y adjuntarlo con cada programa para pasarlo a ordenadores donde no esté instalado, o meterlo diréctamente en el directorio C:\WINDOWS\System32\ Para otros módulos, el procedimiento es el mismo. En el directorio C:\Dev- Cpp\lib\ los programa-objeto que hay tienen extensión.a, pero acepta los.lib que estén en C para MSVC (para instalar todos los módulos de los que no encontremos el binario para mingw32 sin tener que compilarlos)
Uso en *nix: $ g++ miprograma.cpp -o miprograma `sdl-config cflags libs` Nosotros utilizaremos Anjuta como IDE en Debian GNU/Linux. Un programa de prueba con Anjuta y con Dev-Cpp viene explicado en archivos adjuntos. Nota: El uso de SDL con otros compiladores (MSVC, Borland...) viene explicado en la página web de la SDL
Además de la SDL en sí, recomendamos para el uso de lo aprendido en el cursillo instalar los siguientes módulos de la SDL: SDL_ttf SDL_gfx SDL_image SDL_mixer