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:

http://www.libsdl.org/

 

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>– Inicializar 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

Deja un comentario