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