jueves, 27 de agosto de 2015

Crear juego RPG en C++ y Allegro 4

Aqui comienza el primer curso de crear tu juego, al estilo RPG maker, para ello se utiliza el lenguaje C++ y la librería Allegro Version 4.4.

Cual es el estilo RPG maker, pues para que se entienda mejor mirar la siguiente imagen ...




En  este primer tutorial, se hará el manejo del personaje principal. Para ello tendremos en cuenta:

  1. Se utilizará para la imagen del protagonista un character set del RPG Maker.
  2. Se utilizará las teclas del cursor para mover al personaje.


Que es un character set del RPG Maker ?


Se trata de una imagen, donde viene dibujado al personaje según las cuatro direcciones, abajo, izquierda, derecha y arriba. Y cada una de ellas tiene tres variantes para hacer una pequeña animación.

Para nuestro tutorial utilizaremos la siguiente imagen, pero si no os gusta o queréis utilizar otra podéis buscar mas en google.

Estas imágenes suelen venir en formato png, pero como el Allegro no trabaja con png, se debe transformar la imagen a BMP. Además para luego no tener problemas el color blanco de fondo se debe sustituir por el color rosa que es el que utiliza Allegro para las transparencia.


Esta imagen la guardaremos con el nombre de "personaje.bmp".



Programación

A continuación se explica paso a paso el programa utilizado.

 allegro_init();
 install_keyboard();
 
 set_color_depth(32);
 set_gfx_mode(GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0);

Se empieza inizializando la librería y definiendo el tamaño de la ventana que vamos a crear, en este ejemplo será de 800x600.

 BITMAP *buffer = create_bitmap(800, 600);
 BITMAP *prota  = load_bmp("personaje.bmp",NULL);
 
 bool salir;
 int x,y;
 
 // inicializar vbles
 x = 10;
 y = 10;
 salir = false;

Se inicializan las variables que se van a manejar en el programa. Dos imagenes BITMAP, una de ellas contendrá la imagen del personaje (prota) y la otra la utilizaremos para montarlo todo antes de volcarlo a la pantalla ( buffer ). Las variables x,y contienen la posición del personaje, que inicialmente se le da el valor de 10,10 respectivamente. 

El bucle principal se encarga de pintar el fondo, comprobar si el usuario a pulsado alguna tecla para mover al personaje, pinta al personaje y finalmente lo muestra por pantalla.

          clear_to_color(buffer, 0xaaaaaa);
          
          masked_blit(prota, buffer, 0,0, x, y, 32,32);
          
          // teclas control usuario
          if ( key[KEY_UP] )
          {
               y--;
          }
          if ( key[KEY_DOWN] )
          {
               y++;
          }
          if ( key[KEY_LEFT] )
          {
               x--;
          }
          if ( key[KEY_RIGHT] )
          {
               x++;
          }                              
          
          // limites
          if ( x < 0 ) x = 0;
          if ( x > 800 ) x = 800;
          if ( y < 0 ) y = 0;
          if ( y > 600 ) y = 600;          
          
          
       blit(buffer, screen, 0, 0, 0, 0, 800, 600);
       
       rest(10);
       
       // tecla de salida
       if ( key[KEY_ESC] ) salir = true;
              

clear_to_color(buffer, 0xaaaaaa);  
Borra el contenido de buffer, rellenandolo de un color gris (0xaaaaaa).

masked_blit(prota, buffer, 0,0, x, y, 32,32);  
Pinta la imagen prota sobre la imagen buffer, en la posición x,y dentro de la imagen buffer. Con un tamaño de la imagen prota de 32x32.

El apartado de teclas control usuario, se encarga de las teclas definidas para mover el personaje, para ello se modifican los valores de x,y. Siendo "x" para moverlo en horizontal y la "y" para moverlo en vertical, en este caso se utilizan las teclas del cursor.

El apartado limites, se encarga de establecer los limites de las variables x,y , que dependen del tamaño de la ventana que en este caso son 800,600. De esta forma se evita que se salga del campo de vision la imagen prota.

blit(buffer, screen, 0, 0, 0, 0, 800, 600);  
Vuelca el contenido de la imagen buffer sobre screen, que es la pantalla, con un tamaño que previamente sea definido, según el ejemplo es 800,600. Es justo en este momento en el que se muestra todo por pantalla.

rest(10);
Hace una pequeña pausa de 10 milisegundos.


CODIGO COMPLETO DEL EJEMPLO
 /*
  Name:     RPG
  Author:   Yadok - KODAYGAMES
  Date:     27/08/15 14:49
  Web:      http://devcpp-allegro.blogspot.com/
  Description: 
         Creacion de un juego al estilo RPG
         mas informacion en la web        
*/


#include <allegro.h>

int main() 
{ 
 allegro_init();
 install_keyboard();
 
 set_color_depth(32);
 set_gfx_mode(GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0);
 
 BITMAP *buffer = create_bitmap(800, 600);
 BITMAP *prota  = load_bmp("personaje.bmp",NULL);
 
 bool salir;
 int x,y;
 
 // inicializar vbles
 x = 10;
 y = 10;
 salir = false;
   
 while ( !salir )
 { 
          clear_to_color(buffer, 0xaaaaaa);
          
          masked_blit(prota, buffer, 0,0, x, y, 32,32);
          
          // teclas control usuario
          if ( key[KEY_UP] )
          {
               y--;
          }
          if ( key[KEY_DOWN] )
          {
               y++;
          }
          if ( key[KEY_LEFT] )
          {
               x--;
          }
          if ( key[KEY_RIGHT] )
          {
               x++;
          }                              
          
          // limites
          if ( x < 0 ) x = 0;
          if ( x > 800 ) x = 800;
          if ( y < 0 ) y = 0;
          if ( y > 600 ) y = 600;          
          
          
       blit(buffer, screen, 0, 0, 0, 0, 800, 600);
       
       rest(10);
       
       // tecla de salida
       if ( key[KEY_ESC] ) salir = true;
              
    }  
  
 destroy_bitmap(prota);
 destroy_bitmap(buffer);
 
 return 0;
}
END_OF_MAIN();


Si todo esta correcto, se tendrá un programa que muestra un personaje por pantalla que se puede mover con las teclas del cursor.


Si deseas descargar todo lo que se utiliza en este ejemplo pulsa aquí en el link

12 comentarios:

  1. oye tengo un error con la imagen no me carga las diferentes fases

    ResponderEliminar
  2. uso codeblocks y no me muestras las faces del personaje.bmp e intente bajar otra me sale una depuracion

    ResponderEliminar
  3. Tu código me da un error extraño: al ejecutar la sentencia "masked_blit" para imprimir el personaje, se "cuelga" el programa y deja de funcionar. No es problema de mi compilador, ya que tengo otro proyecto en allegro, y funciona perfectamente. Espero que me puedas dar una respuesta, me gustaría acabar este curso, parece muy interesante.

    ResponderEliminar
    Respuestas
    1. posiblemente que no encuentra la imagen "personaje.bmp"

      Eliminar
    2. Exactamente, era eso. Ayer me di cuenta de que tenía mal convertido el BMP... Se ve que cambiar la extensión funciona sólo a veces... XD Errores de novato :P

      Eliminar
  4. es porque en este ejemplo aun no se hace eso

    ResponderEliminar
  5. Saludos porfavor me podrias decir como puedo ver las capas de choque como muestras en tus videos.
    Muchas gracias por los tutoriales.

    ResponderEliminar
  6. en donde va el personaje.bmp (la direccion)

    ResponderEliminar
    Respuestas
    1. BITMAP *prota = load_bmp("personaje.bmp",NULL);

      Tal como viene en el programa, la imagen personaje.bmp debe encontrarse en la misma carpeta donde este el ejecutable.

      Eliminar
  7. Cómo le hago para que Allegro reconozca cualquier imagen bmp.
    Me descargué la imagen de un Muro, posteriormente la convertí a bmp, de 32*32 bits. Después voy a CodeBlocks y al ejecutar el programa me manda error, dice que Dejó de funcionar. Es problema con la imagen, ya que sólo sustituyo que imagen seleccione, por ejemplo ejemplo -> roca = load_bitmap("roca.bmp", NULL);
    roca.bmp si lo agarra, pero cambio a muro.bmp (Es la imagen que te comentaba) y me marca el error antes mencionado.
    Espero me puedas ayudad, gracias.

    ResponderEliminar
    Respuestas
    1. las imágenes que te descargas normalmente son jpg ya que ocupan poco, estas imágenes debes de transformarlas para ello debes abrirlas por ejemplo con el paint de windows, y luego le das a "guardar como" y seleccionas el formato BMP. Y de esta manera no debes de tener ningún problema.

      Eliminar
    2. Me manda el mismo error al compilar y ejecutar el código del RPG 1, la imagen está en BMP con su fondo magenta y todo.
      Gracias

      Eliminar

Related Posts Plugin for WordPress, Blogger...