Manual-Tutorial creacion de un juego en C++ con librerias SDL
INTRODUCCION
Este manual va dedicado a aquellos que siempre han querido sentir las emociones de hacer un juego ( cutre) pero un juego. Para ello , hemos creado este manual, que esta basado en C++ y utilizaremos la librería SDL.La SDL es una librería bastante primitiva, casi todos los juegos actuales van con OpenGl o superirores, pero la programación se hace muy complicada.
Por ello y como somos amaters, lo mejor es empezar por una librería sencilla como SDL.Para ello vamos a necesitar:
· Un programa para programar en C++
· Bajarnos la librería SDL ( no os pongáis a crearla, no merece la pena)
· Tener mucha paciencia.
Este manual no te va a enseñar a programar en C++ ya que llevaría excesivas horas hacerlo pero si se recordaran algunas líneas de código.
Lo primero, es barjarnos una versión trial del Borland Builder C++ , que si tenemos una versión completa mejor que mejor.
Desde la pagina principal http://www.borland.com/downloads/index.html, yo la hice con la versión 5 y es la que aconsejo.
Despues nos descargamos una SDL, he modificado una sencilla para que no haya problemas.
http://www.megaupload.com/?d=ZG9YEC3I
Las librerías que os van a ir haciendo falta las teneis que bajar de cualquier web, entre ellas estas:
EMPEZANDO
Vamos a unir nuestro Borland Builder C++ 5 con la SDL
1) File/New Aplicattion Creamos una ventana VCL nueva
2) Proyect/Option/Directories Conditionals introducimos el path de include y el path de lib del .rar
3) En Advanced Linker le añadimos todas las DDLs que vayamos a usar
4) Guardamos y salimos
5) Nos vamos a la carpeta donde hayamos guardado y en la extensión bpr lo editamos con el bloc de notas:
-Od debe poner -02
-b- debemos poner –b
Estas líneas se encuentran por el medio casi tirando al final.Inicialización de la SDL
#include <SDLSDL.h> o #include <SDL.h>– Inicia lizar la librería y los subsistemas que nos interesen● if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_AUDIO) !=0){printf ("Error SDL : %s ",SDL_GetError());} |
● Parámetros disponibles (bit-wise OR para combinar)– SDL_INIT_VIDEO– SDL_INIT_AUDIO– SDL_INIT_CDROM– SDL_INIT_TIMER– SDL_INIT_JOYSTICK– SDL_INIT_EVERYTHING |
Con el primer cuadro hemos inicializado la SDL, con el Segundo cuadro son los parametros que debemos inicializar si vamos a utilizar los siguientes dispositivos ( No es necesario)
ESCRIBIENDO LINEAS DE CODIGO
SDL tiene muchísimos comandos y es imposible poder recoger todos en un manual , pero pondremos los mas importantes.Todos los juegos del mercado siguen la misma estructura en cuanto a código se refiere.
1. Inicialización de Gráficos
Es el primer paso. Aquí se van a inicializar tanto las librerías, sonidos, personajes, enemigos, niveles, colisiones, etc… para posteriormente llamarlas y hacer referencia a ellas. Siempre debe estar inicialiado primeramente.
2. Bucle principal del juegoLa parte mas importante y la mas complicada. Todo juego tiene un bucle principal. Se va a manejar los movimientos del personaje, las colisiones al chocar su disparo o puñetazo, la muerte del enemigo, el volver a continuar en la partida etc…
Debe ocupar pocas líneas de código y no hacerlo muy pesado
Por ejemplo:
While(¡Salir){
Pantalla->Durezas() /Gestion del mundo del juego. No poder sobrepasar montes etc..
Personaje->Movimiento() / Todas las acciones del personaje principal o del enmigo
Personaje->Colisiones() / Cuando un puño o disparo conecta con el enemigo
Enemigo->Muerte() / Si se ha producido colisión muere el enemigo, sino el personaje.}
3. Cierre de la SDL
SDL_Quit(); A Muy grandes rasgos , este es el esquema de un videojuego. Como os comento en las paginas de arriba, vienen completos manuales de SDL que tendréis que seguir en caso de que queráis hacer un juego, pero desde aquí os enseñare las partes mas primitivas de la SDL. La pantalla principal y el sonido.
Pantalla
Saber que siempre necesitamos 2 pantallas , por ello la primera línea de nuestro código será.
#include <SDL.h>
SDL_Surface * pantalla, * blanco, * vidas
Estamos creando un objeto de la clase SDL por cada ventana que vamos a utilizar, Asi una ventana será para la pantalla, otra que es necesaria para debajo de la pantalla, las vidas que será una ventana mas.
pantalla=InicializacionSDL(pantalla);
El objeto pantalla la inicializamos como la primera pantalla de la SDL.
Para cargar encima de pantalla ( la ventana principal donde va a ir nuestro juego), en este caso blanco debemos asignarle una imagen de nuestro pc.
blanco=IMG_Load("data/pantalla1.png")
Con esto dándole a ejecutar en nuestro programa, ya deberíamos de ver nuestra imagen.
Sonido
Hay muchas librerías de sonido en la SDL, pero he incluido la mixer, que me parece la más fácil de programar.
Si queremos meterle algún sonido habrá que inicializarlo tambien.
Mix_OpenAudio(22050,AUDIO_S16,2,4096);
Mix_VolumeMusic(opciones.get_vol_musica());
VolumeMusic gestiona el volumen de la música. Esta librería acepta WAV, MIDI e incluso MP3.
Y como veis son 2 lineas de código nada mas
Ahora os pondré un ejemplo inicial de la pantalla principal. Por supuesto no están incluidas las clases, pero se entiende con los nombres que hace cada clase.
#include "Iniciar.h"
int Iniciar()
{
SDL_Surface * pantalla, * blanco, * vidas, * durezas;
SDL_Surface * stage1;
int posVida=638; //Posicion de las vidas
int vivo=3;
bool salir,NivelCompletado = false; //boolean que indica salir del juego
Uint32 colorkey;
SDL_Event evento;
SDL_Rect src,origen,destino;
enjuto * personaje; //personaje=objeto enjuto
Topciones opciones;
const numMalos=3; //personaje enemigo
enemigo * malos[numMalos];
SDL_EnableKeyRepeat(10,10); // Sirve para controlar las frecuencia con la que se repite el boton pulsado
pantalla=InicializacionSDL(pantalla);
Mix_OpenAudio(22050,AUDIO_S16,2,4096); //Inicializar SDL_Mixer
Mix_VolumeMusic(opciones.get_vol_musica());//El volumen de la música
stage1=IMG_Load("data/STAGE1.jpg");
blanco=IMG_Load("data/pantalla1.png");
durezas =IMG_Load("data/enjutoDureza.png"); //Cargamos la dureza
SDL_LockSurface(durezas);
if (opciones.get_musica())//Si la música esta activa
Mix_PlayMusic(Mix_LoadMUS("Musica/nivel2.mid"), -1);
personaje = new enjuto(700,500,pantalla,blanco); // desde que coordenadas vamos a coger la imagen
malos[0] = new enemigo(200,190,pantalla,blanco);
malos[1] = new enemigo(520,320,pantalla,blanco);
malos[2] = new enemigo(720,64,pantalla,blanco)
personaje->Dibujar(); // Solo se dibuja una vez, aquí se dibuja todos los elementos
malos[0]->setDerecha(true);
malos[1]->setIzquierda(true);
malos[2]->setIzquierda(true);
while ((!salir)&&(!NivelCompletado)) // BUCLE PRINCIPAL
{
salir=personaje->accion(pantalla,durezas);
//Por cada imagen a dibujar, llamamos a su metodo dibujar que se encargará
//de actualizar su posición y el resto de variables pertinentes y dibujará en pantalla
//según lo hallado
for (int i=0;i<numMalos;i++)
{
malos[i]->accion();
if (personaje->Colision(malos[i]->getH(),malos[i]->getW(),malos[i]->getxActual(),malos[i]- >getyActual()))
{
if ((personaje->getFotogramaY()!=240) && (personaje->getFotogramaY()!=180))
{
personaje->setQuieto(true);
personaje->setMuerto(true);
eliminarVida(posVida,0,pantalla,blanco);
posVida=posVida+51;
personaje->Borrar();
personaje->setxActual(700);
personaje->setyActual(500);
puntos->muere_enjuto();
}
else
{
//Aqui va el metodo muerte de enemigo y su correspondiente destructor
if(vivo==1)
{
 
; NivelCompletado=true;
fichIntermedio.open("Ficheros/intermedio.txt");
fichIntermedio<<puntos->get_puntuacion()<<endl;
fichIntermedio.close();
}
puntos->matar_enemigo();
vivo–;
malos[i]->Borrar();
malos[i]->setyActual(2000);
}
}
if (posVida>740)
{
salir=true;
if (puntos->get_puntuacion()<0)
puntos->set_puntuacion(0); //Guardamos la puntuacion numerica en un fichero
fichGuardar.open("Ficheros/puntuaciones.txt",ios::app);
fichGuardar<<puntos->get_puntuacion()<<endl;
}
malos[i]->Borrar();
malos[i]->Dibujar();
}
personaje->Borrar();
personaje->Dibujar();
SDL_Flip(pantalla); //confirma
} // fin del bucle principal, comienzan los destructores.
SDL_UnlockSurface(durezas);
personaje->~enjuto(); // destruimos el objeto del personaje principal
malos[i]->~enemigo();
SDL_Quit();
Mix_HaltMusic();
Como hemos dicho, hay completas paginas en las que se puede mirar manuales de SDL, que sin duda tendreís que hacerlo si quereis hacer un juego. Estas son las mas aconsejadas por mi:
Página oficial SDL
triplew.libsdl.org
● Página oficial HGE
hge.relishgames.com
● Página oficial ClanLib
triplew.clanlib.org
● SDL API
triplew.libsdl.org/cgi/docwiki.cgi/SDL_20API
● Tutoriales SDL
gpwiki.org/index.php/C:SDL_tutorials
● Más tutoriales SDL
lazyfoo.net/SDL_tutorials/index.php