jueves, 27 de agosto de 2015

Crear juego RPG en C++ y Allegro 4 (3)

Una nueva entrega del tutorial para crear tu propio juego RPG en C++ y Allegro.



En este tutorial prepararemos el código programado, en algo mas modular y organizado para facilitar futuras ampliaciones. Para ello vamos a crear algunas funciones y alguna que otra clase.

Si observamos el código que tenemos hasta el momento, vemos que la función main lo contiene todo, si siguiéramos programando de este modo llegaría un punto en el que sería muy difícil de encontrar un fallo, o algo que queramos modificar.  Para evitar que perdamos el control debemos poner comentarios para facilitar la búsqueda de cada uno de los procesos que realiza el juego, además de crear funciones modulares que nos permita tener el código de forma ordenada.

Ahora se añadirá un nuevo archivo al proyecto. Para los que tenga el Dev-C++ se colocará sobre el nombre de nuestro proyecto, pulsa con el boton derecho, y en el menú desplegable selecciona la opcion "Nuevo codigo fuente", para añadir otro archivo a nuestro proyecto el cual lo llamaremos "global.h"


En este archivo, se pondrá todas las variables que se quieran que sean global. 


Que es una variable Global ?

Una variable global puede ser modificada en cualquier parte del programa y cualquier parte del programa depende de ella. Es por ello que una variable global tiene un potencial ilimitado para crear dependencias. Sin embargo, en algunas ocasiones, las variables globales resultan muy útiles. Por ejemplo, se pueden usar para evitar tener que pasar variables usadas muy frecuentemente de forma continua entre diferentes subrutinas o funciones


Por tanto, en global.h pondremos lo siguiente:
// GLOBAL.H 

// Ancho y alto de la pantalla
const int PANTALLA_ANCHO = 800;
const int PANTALLA_ALTO  = 600;

// En este BITMAP dibujaremos todo
BITMAP *buffer;
// es el espacio en pixel que recorre el jugador al andar
const int desplazamiento=4;

// Copiar el buffer a la pantalla del juego (screen)
void pintar_pantalla()
{
    blit(buffer, screen, 0, 0, 0, 0, PANTALLA_ANCHO, PANTALLA_ALTO);
}

Se crean dos variables PANTALLA_ANCHO y PANTALLA_ALTO para guardar el tamaño de la pantalla y así facilitar su uso.
El BITMAP *buffer se pone de forma global pues será utilizado muchas veces y nos facilitará su uso. De igual forma se crea una función pintar_pantalla() para que sea mas legible nuestro código, esta función se encarga de volcar el contenido de buffer a la pantalla.

Como tenemos ahora global.h, este fichero o librería debemos incluirlo en el código principal. Y esto se hace mediante el comando #include "global.h"

En el archivo main.cpp, para que sea algo mas modular se separa lo que es la inicialización del Allegro y configuración de la resolución a una función llamada inicia_allegro().

void inicia_allegro()
{
 allegro_init();
 install_keyboard();
 
 set_color_depth(32);
 set_gfx_mode(GFX_AUTODETECT_WINDOWED, PANTALLA_ANCHO, PANTALLA_ALTO, 0, 0);
 
 buffer = create_bitmap(PANTALLA_ANCHO, PANTALLA_ALTO);     
}

Se crea una clase llamada player que se encarga de todo lo referente al usuario o jugador, como comprobar las teclas, pintar el personaje, etc.

// Esta clase se encarga del manejo del jugador
class player
{
    BITMAP *prota;  
 int x,y;
 int direccion;
 int animacion; 
          
    public:  
       player();    
       void pinta(); 
       void teclado(); 
};

player::player()
{
    prota  = load_bmp("personaje.bmp",NULL);            
 // inicializar vbles
 direccion = 0;
 animacion = 0;
 x = 10;
 y = 10;                
}

void player::pinta()
{
    masked_blit(prota, buffer, animacion*32, direccion*32, x, y, 32,32);  
} 

void player::teclado()
{
      int ax = x;
      int ay = y;
      // teclas control usuario
      if ( key[KEY_UP] )
      {
           y-=desplazamiento; 
           direccion = 3;              
      }
      if ( key[KEY_DOWN] )
      {
           y+=desplazamiento;
           direccion = 0;
      }
      if ( key[KEY_LEFT] )
      {
           x-=desplazamiento;
           direccion = 1;
      }
      if ( key[KEY_RIGHT] )
      {
           x+=desplazamiento;
           direccion = 2;
      }  
      if ( ax != x || ay != y )
      {
           // entra si a cambiado alguna de las variables x,y
           animacion++;
           if ( animacion > 2 ) animacion = 0;
      }                            
      
      // limites
      if ( x < 0 ) x = 0;
      if ( x > PANTALLA_ANCHO ) x = PANTALLA_ANCHO;
      if ( y < 0 ) y = 0;
      if ( y > PANTALLA_ALTO )  y = PANTALLA_ALTO;
} 

Esta clase si se quiere se puede poner en otro archivo aparte y de esta manera separamos todo lo referente al jugador.

Y con todo esto se consigue tener una función principal mas corta y sencilla de entender.

// programa principal 
int main()  
{ 
 inicia_allegro();
    
 player jugador; 
 bool salir;
 
 salir = false;
   
 while ( !salir )
 { 
          clear_to_color(buffer, 0xaaaaaa);
                    
          jugador.teclado();
          
          jugador.pinta();
          
       pintar_pantalla();
       
       rest(60);
       
       // tecla de salida
       if ( key[KEY_ESC] ) salir = true;
              
    }  
  
 destroy_bitmap(buffer);
 
 return 0;
}
END_OF_MAIN();

El programa sigue haciendo exactamente lo mismo pero internamente para seguir programando es mas fácil.

Recuerda añadir el include del nuevo archivo global.h al inicio, justamente debajo de la llamada a la libreria allegro, tal y como se muestra a continuación:


#include <allegro.h> 
#include "global.h"

En el caso que hayas decidido separar la clase player a otro archivo, deberás poner su correspondiente include, si por ejemplo se ha llamado el archivo player.h, debes poner #include "player.h"

5 comentarios:

  1. Al realizar esta parte del curso, me salta el siguiente error: el include de allegro.h no funciona ya que me dice quw no se encuentra ese fichero... ¿Alguna solución?

    ResponderEliminar
  2. Yo todavia, no termine de hacerlo modular, incluso cambie algunas partes del codigo, para evitarme evitarme pintar 3 imagenes[...] dentro de alguno de los llamados "modulos" debe estar cargada la libreria alegro.h, asi puede cargar. paso mucho tiempo desde que publicaste esto, espero haber sido de ayuda si no lo solucionaste aun. saludos

    ResponderEliminar
  3. Al intentar compilar el codigo tuve un error el cual me trabo por mucho tiempo, pero parece que solo es agregar END_OF_MAIN(); al final de la función main

    ResponderEliminar
  4. Oye una pregunta, como se hace par que el proyecto funcione con algún mando conectado a la PC

    ResponderEliminar

Antes de publicar un comentario

Todos los comentarios que se realicen en el blog son moderados.

Debido a esto es muy probable que tu comentario no aparezca de inmediato ya que previamente debe ser revisado para evitar un mal uso (SPAM).

Podrán realizar comentario cualquiera que tenga una cuenta de Google.

Related Posts Plugin for WordPress, Blogger...