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:
#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