sexta-feira, 10 de outubro de 2014

Tiled com Camada

Hj eu melhorei um pouco a logica do TilesMap, e agora criei uma rotina para tratar de camadas... Permitindo, assim... Mapas mais elaborados...
Novamente o programa que usei foi o  Tiled para fazer o mapa...






Primeiramente antes de sair programando, vou novamente definir o padrão da entrada... Exportando do Tiled... temos algo assim:




 [header]  
 width=13  
 height=10  
 tilewidth=64  
 tileheight=64  
 [tilesets]  
 tileset=../Pictures/Desenhos vetores/BLOCOS.png,64,64,0,0  
 tileset=../Pictures/Desenhos vetores/pipes.png,64,64,0,0  
 tileset=../Pictures/Desenhos vetores/Terreno.png,64,64,0,0  
 tileset=../Pictures/Desenhos vetores/simples1.png,64,64,0,0  
 [layer]  
 type=FUNDO  
 data=  
 338,338,338,338,338,338,338,338,338,338,338,338,338,  
 338,338,338,338,338,338,338,338,338,338,338,338,338,  
 338,338,338,338,338,338,338,338,338,338,338,338,338,  
 338,338,338,338,338,338,338,338,338,338,338,338,338,  
 338,338,338,338,338,338,338,338,338,338,338,338,338,  
 338,338,338,338,338,338,338,338,338,338,338,338,338,  
 338,338,338,338,338,338,338,338,338,338,338,338,338,  
 340,340,340,340,340,340,340,340,340,340,340,340,340,  
 340,340,340,340,340,340,340,340,340,340,340,340,340,  
 340,340,340,340,340,340,340,340,340,340,340,340,340  
 [layer]  
 type=MAIN  
 data=  
 0,0,0,0,0,0,0,0,0,0,0,0,0,  
 2,2,2,0,0,0,0,0,0,0,0,366,0,  
 0,0,2,0,0,0,0,0,0,0,0,0,0,  
 2,2,2,0,0,0,0,101,102,0,0,366,0,  
 2,0,0,0,0,0,0,107,108,0,0,0,0,  
 2,2,2,0,0,97,98,107,108,0,0,365,0,  
 0,0,0,0,0,103,104,107,108,0,364,363,364,  
 194,194,194,195,0,103,104,107,108,0,193,194,194,  
 200,200,200,201,0,103,104,107,108,0,199,200,200,  
 200,200,200,201,0,103,104,107,108,0,199,200,200  
 [layer]  
 type=SUPERIOR  
 data=  
 0,0,291,0,0,291,0,0,0,0,293,0,0,  
 0,0,0,0,293,0,0,293,0,0,0,0,0,  
 0,0,0,0,0,0,0,0,0,291,0,0,0,  
 0,0,0,0,0,293,0,0,0,0,0,0,0,  
 0,0,0,293,0,0,0,0,0,0,0,0,0,  
 0,0,0,0,0,0,0,0,0,0,0,0,0,  
 0,0,0,0,0,0,0,0,0,0,0,0,0,  
 0,0,0,0,0,358,358,358,358,0,0,0,0,  
 0,0,0,0,0,358,358,358,358,0,0,0,0,  
 0,0,0,0,0,358,358,358,358,0,0,0,0  
 [layer]  
 type=SUPERIOR 2  
 data=  
 0,0,312,0,0,0,0,0,0,0,0,0,0,  
 0,0,0,0,312,0,0,306,0,0,0,0,0,  
 0,0,0,0,0,0,0,0,0,0,0,0,0,  
 0,0,0,0,0,306,0,0,0,0,0,0,0,  
 0,0,0,306,0,0,0,0,0,0,0,0,0,  
 0,0,0,0,0,0,0,0,0,0,0,0,0,  
 0,0,0,0,0,0,0,0,0,0,0,0,0,  
 0,0,0,0,0,0,0,0,0,0,0,0,0,  
 0,0,0,0,317,317,317,317,317,317,0,0,0,  
 0,0,0,0,0,0,0,0,0,0,0,0,0  


O que eu modifiquei para:
 [FUNDO]  
 1  
 13 10 0 0  
 338 338 338 338 338 338 338 338 338 338 338 338 338   
 338 338 338 338 338 338 338 338 338 338 338 338 338   
 338 338 338 338 338 338 338 338 338 338 338 338 338   
 338 338 338 338 338 338 338 338 338 338 338 338 338   
 338 338 338 338 338 338 338 338 338 338 338 338 338   
 338 338 338 338 338 338 338 338 338 338 338 338 338   
 338 338 338 338 338 338 338 338 338 338 338 338 338   
 340 340 340 340 340 340 340 340 340 340 340 340 340   
 340 340 340 340 340 340 340 340 340 340 340 340 340   
 340 340 340 340 340 340 340 340 340 340 340 340 340  
 [PRINCIPAL]  
 13 10 0 0  
 0 0 0 0 0 0 0 0 0 0 0 0 0   
 2 2 2 0 0 0 0 0 0 0 0 366 0   
 0 0 2 0 0 0 0 0 0 0 0 0 0   
 2 2 2 0 0 0 0 101 102 0 0 366 0   
 2 0 0 0 0 0 0 107 108 0 0 0 0   
 2 2 2 0 0 97 98 107 108 0 0 365 0   
 0 0 0 0 0 103 104 107 108 0 364 363 364   
 194 194 194 195 0 103 104 107 108 0 193 194 194   
 200 200 200 201 0 103 104 107 108 0 199 200 200   
 200 200 200 201 0 103 104 107 108 0 199 200 200  
 [SUPERIOR]  
 2  
 13 10 0 0  
 0 0 291 0 0 291 0 0 0 0 293 0 0   
 0 0 0 0 293 0 0 293 0 0 0 0 0   
 0 0 0 0 0 0 0 0 0 291 0 0 0   
 0 0 0 0 0 293 0 0 0 0 0 0 0   
 0 0 0 293 0 0 0 0 0 0 0 0 0   
 0 0 0 0 0 0 0 0 0 0 0 0 0   
 0 0 0 0 0 0 0 0 0 0 0 0 0   
 0 0 0 0 0 358 358 358 358 0 0 0 0   
 0 0 0 0 0 358 358 358 358 0 0 0 0   
 0 0 0 0 0 358 358 358 358 0 0 0 0  
 13 10 0 0  
 0 0 312 0 0 0 0 0 0 0 0 0 0   
 0 0 0 0 312 0 0 306 0 0 0 0 0   
 0 0 0 0 0 0 0 0 0 0 0 0 0   
 0 0 0 0 0 306 0 0 0 0 0 0 0   
 0 0 0 306 0 0 0 0 0 0 0 0 0   
 0 0 0 0 0 0 0 0 0 0 0 0 0   
 0 0 0 0 0 0 0 0 0 0 0 0 0   
 0 0 0 0 0 0 0 0 0 0 0 0 0   
 0 0 0 0 317 317 317 317 317 317 0 0 0   
 0 0 0 0 0 0 0 0 0 0 0 0 0  


O arquivo de entrada tem as seguintes maracao [FUNDO], [PRINCIPAL] e [SUPERIOR]...  Estas marcação estão no arquivo e são ignoradas no programa... A camada principal so existe 1, ja as camadas superir e fundo pode existe mais de uma, ou ate mesmo nenhuma. No inicio da descrição da camada temos o seu tamanho e a sua coordenada de origem (que pretendo usar isso no futuro, ou simplesmente retirar kkk... )

O código pode ser baixado aqui:
https://drive.google.com/?tab=wo&authuser=0#folders/0Bw2jEGZIlh-4OV9xOUlhV0FjS0E





#include "mapa.h"

int main()
{
 tipo_allegro5 DATA;
 tipo_mapa mapa;

 //Inicializa o Allegro e cria uma janela 800 x 600
 allegro_inicializa(&DATA, 800, 600);
 al_clear_to_color(al_map_rgb(0, 0, 0)); //Limpa a tela


 inicializa_tipo_mapa(&mapa); //Inicializa a variavel mapa para que ela possar ser usada
 load_mapa(&mapa, "./level/level1.txt"); //Carrega o Mapa
 desenha_level_all(&mapa,0,0); // Desenha o Mapa na tela
 al_flip_display(); //Atualiza a tela
 al_rest(5); //Aguarde 5segundos
 free_tipo_mapa(&mapa); //Libera memoria do Mapa

 al_clear_to_color(al_map_rgb(0, 0, 0)); //Limpa a tela

 load_mapa(&mapa, "./level/level2.txt"); //Carrega o Mapa
 desenha_level_all(&mapa,0,0); // Desenha o Mapa na tela
 al_flip_display(); //Atualiza a tela
 al_rest(5); //Aguarde 5segundos
 free_tipo_mapa(&mapa); //Libera memoria do Mapa

 return 0;
}



#include "mapa.h"


//Inicializa a variavel
void inicializa_tipo_mapa (tipo_mapa *mapa)
{
 mapa->camada_fundo = NULL;
 mapa->camada_superior = NULL;
 mapa->num_camada_fundo = 0;
 mapa->num_camada_superior = 0;
}


void load_mapa(tipo_mapa *mapa, char endereco[100])
{
 int num_de_camadas;
 int num_tiles_vert;
 int num_tiles_horizontal;
 int x_inicial;
 int y_inicial;
 int i, j, k;
 FILE *level;
 int valor;

 add_tileset(mapa, "./imagem/tileset/64/BLOCOS.png", 0);
 add_tileset(mapa, "./imagem/tileset/64/pipes.png", 1);
 add_tileset(mapa, "./imagem/tileset/64/Terreno.png", 2);
 add_tileset(mapa, "./imagem/tileset/64/simples1.png", 3);

 //Abri o arquivo com o mapa
 level = fopen(endereco, "r");

 //Ler as camadas do fundo
 fscanf(level, "%*s"); //Ler a palavra [FUNDO] e nao salva
 fscanf(level, "%i", &num_de_camadas); //Ler o numero de camadas do fundo

 mapa->num_camada_fundo = num_de_camadas;
 if(num_de_camadas > 0)
 {
  mapa->camada_fundo = (tipo_tilemapa *) malloc (sizeof(tipo_tilemapa *) * num_de_camadas);

  for(k = 0; k < num_de_camadas; k++)
  {
   fscanf(level, "%i %i %i %i", &num_tiles_horizontal, &num_tiles_vert, &x_inicial, &y_inicial);
   //Aloca memoria para a camada principal;
   mapa->camada_fundo[k].mapa = (int *) malloc (sizeof(int) * num_tiles_vert * num_tiles_horizontal);
   mapa->camada_fundo[k].num_tiles_horizontal = num_tiles_horizontal;
   mapa->camada_fundo[k].num_tiles_vert = num_tiles_vert;

   //Ler os dados do mapa
   for(i = 0; i < num_tiles_vert; i++)
   {
    for(j = 0; j < num_tiles_horizontal; j++)
    {
     fscanf(level, "%i", &valor);
     valor--;
     mapa->camada_fundo[k].mapa[i * num_tiles_horizontal + j] = valor;

    }
   }
  }
 }

 //Ler as camada principal
 fscanf(level, "%*s"); //Ler a palavra [PRINCIPAL] e nao salva
 fscanf(level, "%i %i %*i %*i", &num_tiles_horizontal, &num_tiles_vert); //Ler o comprimento da camada principal;
 mapa->camada_principal.num_tiles_horizontal = num_tiles_horizontal;
 mapa->camada_principal.num_tiles_vert = num_tiles_vert;
 mapa->camada_principal.x_inicial  = 0; //A camada principal sempre começa no (0,0)
 mapa->camada_principal.y_inicial = 0;

 //Aloca memoria para a camada principal;
 mapa->camada_principal.mapa = (int *) malloc (sizeof(int) * num_tiles_vert * num_tiles_horizontal);
 if(!(mapa->camada_principal.mapa))
 {
  fprintf(stderr, "Erro ao alocar memorica para camada principal, total de memoria solicitada: %in", sizeof(int) * num_tiles_vert * num_tiles_horizontal);
  exit(-1);
 }

 //Ler os dados do mapa
 for(i = 0; i < num_tiles_vert; i++)
 {
  for(j = 0; j < num_tiles_horizontal; j++)
  {
   fscanf(level, "%i", &valor);
   valor--;
   mapa->camada_principal.mapa[i * num_tiles_horizontal + j] = valor;
  }
 }

 //Ler as camadas superiores
 fscanf(level, "%*s"); //Ler a palavra [SUPERIOR] e nao salva
 fscanf(level, "%i", &num_de_camadas); //Ler o numero de camadas do fundo

 mapa->num_camada_superior = num_de_camadas;
 if(num_de_camadas > 0)
 {
  mapa->camada_superior = (tipo_tilemapa *) malloc (sizeof(tipo_tilemapa *) * num_de_camadas);

  for(k = 0; k < num_de_camadas; k++)
  {
   fscanf(level, "%i %i %i %i", &num_tiles_horizontal, &num_tiles_vert, &x_inicial, &y_inicial);
   //Aloca memoria para a camada principal;
   mapa->camada_superior[k].mapa = (int *) malloc (sizeof(int) * num_tiles_vert * num_tiles_horizontal);
   mapa->camada_superior[k].num_tiles_horizontal = num_tiles_horizontal;
   mapa->camada_superior[k].num_tiles_vert = num_tiles_vert;

   //Ler os dados do mapa
   for(i = 0; i < num_tiles_vert; i++)
   {
    for(j = 0; j < num_tiles_horizontal; j++)
    {
     fscanf(level, "%i", &valor);
     valor--;
     mapa->camada_superior[k].mapa[i * num_tiles_horizontal + j] = valor;

    }
   }
  }
 }

 //Fecha o arquivo com o level
 fclose(level);

}

//Desenha o mapa na tela
void desenha_level_all (tipo_mapa *mapa, int x, int y)
{
 desenha_level_fundo(mapa, x, y);
 desenha_level_main(mapa, x, y);
 desenha_level_super(mapa, x, y);
}

void desenha_level_main(tipo_mapa *mapa, int x, int y)
{
 int i, j;

 int num_vert = mapa->camada_principal.num_tiles_vert;
 int num_horiz = mapa->camada_principal.num_tiles_horizontal;
 int * MAPA = mapa->camada_principal.mapa;
 int valor;
 for(i = 0; i < num_vert; i++)
 {
  for(j = 0; j < num_horiz; j++)
  {
   //Por padrão todos os tileset terão 96 tiles distribuido
   //em 6 colunas e 16 linhas. todos os tiles Serão quadrados 64x64

   valor = MAPA[i * num_horiz + j];

   if(valor < 0) continue;
   al_draw_bitmap_region(mapa->tileset[valor/96],64 * (valor%6) , 64 * ((valor%96)/6), 64, 64, j * 64 + x, i * 64 + y, 0);

  }
 }
}

void desenha_level_fundo(tipo_mapa *mapa, int x, int y)
{
 int i, j , k;
 int num_vert;
 int num_horiz;
 int * MAPA;
 int valor;


 for (k = 0; k < mapa->num_camada_fundo; k++)
 {
  num_vert = mapa->camada_fundo[k].num_tiles_vert;
  num_horiz = mapa->camada_fundo[k].num_tiles_horizontal;
  MAPA = mapa->camada_fundo[k].mapa;
  for(i = 0; i < num_vert; i++)
  {
   for(j = 0; j < num_horiz; j++)
   {
    valor = MAPA[i * num_horiz + j];
    if(valor < 0) continue;
    al_draw_bitmap_region(mapa->tileset[valor/96],64 * (valor%6) , 64 * ((valor%96)/6), 64, 64, j * 64 + x, i * 64 + y, 0);
   }
  }
 }
}

void desenha_level_super(tipo_mapa *mapa, int x, int y)
{
 int i, j , k;
 int num_vert;
 int num_horiz;
 int * MAPA;
 int valor;


 for (k = 0; k < mapa->num_camada_superior; k++)
 {
  num_vert = mapa->camada_superior[k].num_tiles_vert;
  num_horiz = mapa->camada_superior[k].num_tiles_horizontal;
  MAPA = mapa->camada_superior[k].mapa;
  for(i = 0; i < num_vert; i++)
  {
   for(j = 0; j < num_horiz; j++)
   {
    valor = MAPA[i * num_horiz + j];
    if(valor < 0) continue;
    al_draw_bitmap_region(mapa->tileset[valor/96],64 * (valor%6) , 64 * ((valor%96)/6), 64, 64, j * 64 + x, i * 64 + y, 0);
   }
  }
 }

}


void add_tileset (tipo_mapa *mapa, char endereco[100], int id)
{

 mapa->tileset[id] = al_load_bitmap(endereco);
 if(!(mapa->tileset[id]))
 {
  fprintf(stderr, "Falha ao carregar a imagem %sn", endereco);
  exit(-1);
 }
}


void free_tipo_mapa (tipo_mapa *mapa)
{
 int i;

 //Libera a memoria da camada do fundo
 if( mapa->num_camada_fundo > 0)
 {
  for(i = 0; i < mapa->num_camada_fundo; i++)
  {
   free(mapa->camada_fundo[i].mapa);
  }
  free(mapa->camada_fundo);
  mapa->camada_fundo = NULL;
  mapa->num_camada_fundo = 0;
 }

 //Libera a memoria da camada principal
 free(mapa->camada_principal.mapa);

 //Libera a memoria da camada fundo
 if( mapa->num_camada_superior  > 0)
 {
  for(i = 0; i < mapa->num_camada_superior; i++)
  {
   free(mapa->camada_superior[i].mapa);
  }
  free(mapa->camada_superior);
  mapa->camada_superior = NULL;
  mapa->num_camada_superior = 0;
 }

 //Libera a memoria do tileset
 for(i = 0; i < TOTAL_TILESET; i++)
 {
  if(mapa->tileset[i])
  {
   al_destroy_bitmap(mapa->tileset[i]);
  }
 }

}



#ifndef MAPA_H_
#define MAPA_H_

#include "allegro5.h"
#define TOTAL_TILESET 4

typedef struct tipo_tilemapa
{
 //Mapa
 int *mapa;
 int num_tiles_vert;
 int num_tiles_horizontal;

 //Posicao inicial
 int x_inicial;
 int y_inicial;

} tipo_tilemapa;

typedef struct tipo_mapa
{
 ALLEGRO_BITMAP *tileset[TOTAL_TILESET];

 //Mapas fixos
 tipo_tilemapa  camada_principal;
 int num_camada_fundo;
 tipo_tilemapa *camada_fundo;
 int num_camada_superior;
 tipo_tilemapa *camada_superior;

} tipo_mapa;

//Inicializa a variavel
void inicializa_tipo_mapa (tipo_mapa *mapa);

//Carrega um mapa
void load_mapa(tipo_mapa *mapa, char endereco[100]);

//Desenha o mapa na tela
void desenha_level_all (tipo_mapa *mapa, int x, int y);
void desenha_level_main(tipo_mapa *mapa, int x, int y);
void desenha_level_fundo(tipo_mapa *mapa, int x, int y);
void desenha_level_super(tipo_mapa *mapa, int x, int y);

//Libera a Memoria e volta para o estado inicial uma variavel do tipo_mapa
void free_tipo_mapa (tipo_mapa *mapa);

void add_tileset (tipo_mapa *mapa, char endereco[100], int id);



#endif /* MAPA_H_ */



Uma coisa que quero destacar aqui é o uso de funções para liberação de memoria... Enrolei essa postagem por um motivo não estou conseguindo imaginar a interação personagem e cenário kkk...

Nenhum comentário:

Postar um comentário

Related Posts Plugin for WordPress, Blogger...