Já tem um tempo que fiz esse programa, e foi a ultima coisa q eu fiz... Estou tentando pensar em uma lógica que consegue juntar os cenários e os objetos. Mais esta difícil =/...
Bom... A minha ideia de TileMap é o seguinte: Existe um conjunto de tiles (que pode esta em uma imagem ou separados) e um arquivo com os dados de onde deve posicionar os tiles.
Para fazer o arquivo que contem os dados onde cada Tiles vão ficar... Eu usei o programa Tiled
E exporto para o formato .txt. O que sai um arquivo assim:
[header]
width=10
height=7
tilewidth=64
tileheight=64
[tilesets]
tileset=../workspace/TilesMap/BLOCOS.png,64,64,0,0
tileset=../workspace/TilesMap/pipes.png,64,64,0,0
tileset=../workspace/TilesMap/Terreno.png,64,64,0,0
[layer]
type=Camada de Tiles 1
data=
1,0,0,2,0,0,107,108,0,0,
1,0,2,2,0,0,107,108,1,1,
1,0,0,2,0,0,113,114,1,1,
1,0,2,2,2,0,0,0,1,1,
193,194,194,194,194,195,97,98,1,1,
199,200,200,200,200,201,103,104,1,1,
199,200,200,200,200,201,103,104,1,1
Modifiquei um pouco (na verdade muito) para facilitar minha vida...
10 7 64
1 0 0 2 0 0 107 108 0 0
1 0 2 2 0 0 107 108 1 1
1 0 0 2 0 0 113 114 1 1
1 0 2 2 2 0 0 0 1 1
193 194 194 194 194 195 97 98 1 1
199 200 200 200 200 201 103 104 1 1
199 200 200 200 200 201 103 104 1 1
Bom os 2 primeiros números representam o numero de tiles horizontais e verticais. O terceiro numero representa o tamanhos dos tiles (é so um pq eu definir que os tiles serão todos quadrados), e na sequencia estão os dados do mapa.
Uma duvida natural seria: Como existe mais de um tileset (é esse o termo?), qual seria a ordem dos números? A Resposta é bem simples, é a ordem que eu add os tileset no Tiled. No caso do nosso exemplo a ordem foi: BLOCOS, pipes, Terreno. Essa ordem é muito importante... Por isso que essa ordem foi mantido ao abrir os arquivos da imagem no programa.
add_tileset(mapa, "BLOCOS.png", 0); add_tileset(mapa, "pipes.png", 1); add_tileset(mapa, "Terreno.png", 2);
Outro detalhe que padronizei é que cada tileset tera dimensão 384 x 1024 (para tiles de tamanho de dimensão 64x64)... Com base nisso podemos fazer um simples calculo para calcular o numeros de tiles que tem em um tileset... (384/64) * (1024/64) = 96... Guarde esse numero pois ele vai aparecer no codigo =P
Mais uma coisa vou usar congruência modular e o Tiled usa 0 para definir espaço vazio, vou diminuir 1 unidade desses valores... E usar -1 para espaço vazio... Isso vai facilitar e muito a logica do código... Sem mais enrolacao o codigo pode ser baixado aqui:
(o arquivo level1.txt é diferente do exemplo mostrado)
main.c:
#include "mapa.h" int main() { tipo_allegro5 DATA; //Inicializa o Allegro e cria uma janela 640 x 480 tipo_mapa mapa; allegro_inicializa(&DATA, 640, 480); load_mapa(&mapa, "level1.txt"); desenha_level(&mapa,0,0); al_flip_display(); al_rest(3); return 0; }
mapa.h:
#ifndef MAPA_H_ #define MAPA_H_ #include "allegro5.h" #define TOTAL_TILESET 3 typedef struct tipo_tilemapa { int *mapa; int tamanho_tiles; int num_tiles_vert; int num_tiles_horizontal; } tipo_tilemapa; typedef struct tipo_mapa { ALLEGRO_BITMAP *tileset[TOTAL_TILESET]; tipo_tilemapa camada_principal; } tipo_mapa; //Carrega um mapa void load_mapa(tipo_mapa *mapa, char endereco[100]); //Desenha o mapa na tela void desenha_level(tipo_mapa *mapa, int x, int y); void add_tileset (tipo_mapa *mapa, char endereco[100], int id); #endif /* MAPA_H_ */
mapa.c
#include "mapa.h" void load_mapa(tipo_mapa *mapa, char endereco[100]) { int num_tiles_vert; int num_tiles_horizontal; int tiles_tamanho; int i, j; FILE *level; int valor; add_tileset(mapa, "BLOCOS.png", 0); add_tileset(mapa, "pipes.png", 1); add_tileset(mapa, "Terreno.png", 2); //Abri o arquivo com o mapa level = fopen(endereco, "r"); //Ler o tamanho do tilemap fscanf(level, "%i %i", &num_tiles_horizontal, &num_tiles_vert); mapa->camada_principal.num_tiles_horizontal = num_tiles_horizontal; mapa->camada_principal.num_tiles_vert = num_tiles_vert; //Ler o tamanho dos tiles fscanf(level,"%i", &tiles_tamanho); mapa->camada_principal.tamanho_tiles = tiles_tamanho; //Aloca memoria para o mapa mapa->camada_principal.mapa = (int *) malloc (sizeof(int) * num_tiles_vert * num_tiles_horizontal); //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; } } //Fecha o arquivo com o level fclose(level); } //Desenha o mapa na tela void desenha_level(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]; printf("%i ", valor); if(valor < 0) continue; al_draw_bitmap_region(mapa->tileset[valor/96],64 * ((valor%96)%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 %s\n", endereco); exit(-1); } }
Nenhum comentário:
Postar um comentário