El primer Escenario (3)

La última entrega de la creación del escenario.



mijuego.h


En este archivo se pondrá lo mas importante que es nuestro juego.

/*
   mijuego.h
   
*/

BITMAP *fondo;
BITMAP *choque;
BITMAP *alto;

player jugador;


// carga todo lo necesario antes de empezar el juego
void carga_juego()
{
    jugador.inicia();
    // cargamos imagenes del primer escenario
    fondo  = load_bmp("casa.bmp",NULL);
    choque = load_bmp("casa-choque.bmp",NULL);
    alto   = load_bmp("casa-sup.bmp",NULL);     
}


// actualiza el estado del juego
void actualiza_juego()
{
    int ax,ay;
    ax = jugador.getx();
    ay = jugador.gety(); 
    jugador.teclado(); 
    
    // comprobar si colisiona con el mapa
    bool choca = false;
    int px = jugador.getx()-160;
    int py = jugador.gety()-160+16;    
    for ( int ci=0; ci < 32; ci++)
    {
        for (int cj=0; cj < 16; cj++)
        {

            if ( getpixel( choque, px+ci, py+cj) == 0xff0000 ){
                 choca = true;
                 ci = 32;
                 cj = 16;
            }
            if ( getpixel( choque, px+ci, py+cj) == 0x00ff00 ) salir = true;
        }
    }    
    if ( choca ){
         // vuelve al estado anterior
         jugador.posiciona( ax,ay );
    }
        
}



// Se encarga de pintar todo sobre el buffer   
void pinta_juego()
{
    blit( fondo, buffer, 0,0, 160, 160, 480,325);  
    jugador.pinta();     
    masked_blit( alto, buffer, 0,0, 160, 160, 480,325); 
}   


Como ya se explicó al principio, se declaran las variables fondo, choque, alto para almacenar las imagenes, y se crea una variable jugador del tipo player.

La función carga_juego se encarga de cargar las imágenes que se van a utilizan para nuestro escenario e inicializar al jugador.

La función actualiza_juego se encarga de llamar a la función jugador.teclado() para actualizar la posición del jugador y a continuación comprueba si colisiona con el mapa. En el caso de colisionar vuelve al estado anterior.

Y aquí acaba todo, si no ha habido ningún problema deberías tener a tu personaje paseando por el primer escenario tal y como se muestra en el siguiente vídeo.

Las imágenes que se utilizan para este ejemplo las puedes descargar  haciendo click aquí o en la sección de descargas.



SHARE
    Blogger Comment

8 comentarios:

  1. amigo todo corre al 100. solo que tengo unas duditas, espero me puedas resolver. en el codigo en la seccion "comprobar si colisiona con el mapa" porque los "-160", "-160+16".
    en los ciclos for por que las condiciones tiene que ser menores de 32 y 16

    ResponderEliminar
    Respuestas
    1. Hola, esos valores vienen dado según se muestran por pantalla. Como el mapa es pequeño se centra, y para ello se le ha sumado 160 a cada eje. Por eso cuando queremos situar el personaje que tiene una posición x,y con respecto a la pantalla, se realiza esa resta. Con respecto al 32 y 16, es el tamaño del personaje que se recorre para comprobar los choques. Si quieres mas información mira las siguientes páginas:
      FPS
      Escenarios

      Eliminar
  2. Esta genial tu tutoriales. Muchisisimas gracias por leer comentarios y por resolver mi problema con adfly. Una para que se utilizan las variables px,py,cj,ci?

    ResponderEliminar
    Respuestas
    1. Las variables px y py, tienen la posición absoluta del personaje sobre el escenario, esto se debe a que las posiciones x,y del jugador son respecto a la pantalla. Y las variables ci y cj se utilizan para recorrer el espacio ocupado por el personaje para comprobar si colisiona con algo.

      Eliminar
  3. Hola Koday !! Esta GENIAL el blog, estoy haciendo tu juego para un trabajo final de la materia Programacion II en la facultad.
    Tengo algunos problemas.
    1) Lo estoy haciendo en Codeblocks y me costo bastante adaptar los Headers.
    2) Dentro de la casa anda todo perfecto, una vez que sale de la casa me anda todo desfazado. Creo que el problema está en la imagen choque, porque es como que la casa me la ha movido para abajo y parece no estar centrada como lo están las imagenes de arriba. Estoy mirando el codigo y no se donde podría estar el problema. Además vengo haciendo un copiar pegar de casi todo salvo con algunos parametros que le cambie para agregar mi propio personaje (pero no toque nada estructural del juego). Es medio raro.
    Tendrías alguna idea de que podría ser ??
    Te puedo mandar el código por mail para que lo mires ?? :D
    Un abrazo desde Argentina!

    ResponderEliminar
    Respuestas
    1. La diferencia entre el mapa de la casa y el exterior es el tamaño. Como la imagen de la casa es pequeña se centra en pantalla, en cambio la de exterior es mas grande que la pantalla y por ello tiene desplazamiento. Estoy viendo que todos tienen el mismo problema, lee los comentarios anteriores que todos hacen referencia al mismo problema.

      Eliminar
  4. Buenas. Lo primero queria agradecerte tu trabajo, ayudas a muchos a aprender.
    Tengo un par dudas:
    1. ¿Debemos separar los archivos crear un personaje, animacion del personaje, //programa principal, global.h y player.h y llamarlos desde el programa principal?

    2. ¿Se puede ejecutar bien el codigo sin necesidad de usar rpg maker? Por ejemplo en visual studio.

    Gracias de antemano

    ResponderEliminar
    Respuestas
    1. Hola, lo de separar archivos es una forma de trabajar modular para facilitar el manejo y reutilización del código. Con esto es mas fácil luego encontrar un fallo o error ya que todo lo referente a un mismo tema ( player.h, etc.) esta separado.

      Con respecto a lo segundo, lo único en lo que se utiliza RPG Maker es como referencia de donde se ha obtenido las imágenes, pero tu puedes usar las imágenes de otro programa o incluso hacerlas tu mismo, solo que sigue el formato del RPG maker, es decir, la distribución de las imágenes ( 4 filas para la dirección, 3 columnas para animación ).

      El código esta programado para C++.

      Eliminar