PUCRS/FACIN
Curso
de Especialização
em Desenvolvimento de Jogos
Digitais
Computação
Gráfica 2D
Profs.
Márcio Sarroglia Pinho
Isabel Harb Manssour
Mapas de Tiles
O objetivo desta aula é criar um programa que monte uma tela com um mapa de Tiles
Utilize o Framework atualizado.
Carregando um Mapa de Tiles
Um mapa de tiles é uma imagem composta a partir de dois arquivos:
- Uma imagem com um conjunto de tiles
- Um mapa de posicionamento destes tiles
A imagem abaixo, por exemplo, é formada por um conjunto de 48 (8x6) tiles.
A partir desta imagem, um arquivo texto é usado para gerar uma cena.
Este arquivo contém uma matriz com os números dos tiles a serem
colocados em cada posição da tela.
Neste link você pode observar um arquivo com um exemplo de um mapa. Neste arquivo as duas primeiras linhas definem as dimensões do mapa de posicionamento e as outras linhas, definem quais tiles devem ser colocados em cada posição da tela.
Carregando um Mapa de Tiles
Copie o arquivo GameBasico-CTilesMap.cpp, coloque-o no diretório Source de nosso framework e compile o programa. A execução deve apresentar a animação de uma sprite.
Para carregar um mapa de tiles em nosso framework vamos utilizar a classe CTilesMap. Desta classe utilizaremos os métodos loadMap e loadTileMap, que carregarão, respectivamente, o arquivo de posicionamento e a imagem com tiles.
dicionando as linhas abaixo ao início do arquivo de teste.
Para utilizar esta classe, adicione as linhas abaixo ao arquivo recém
copiado e insira as linhas abaixo no início do fonte, logo após a
declaração da variável spriteCao.
#include "CTilesMap.h"
CTilesMap *Map = NULL;
A seguir, passaremos a carga do mapa de tiles, carregando primeiramente
o mapa de posicionamento e a seguir a imagem com tiles. Copie o trecho
de código abaixo e coloque-o no programa de testes, logo acima do
programa principal.
void CarregaTileMap() {
//cout << "Carrega TileMap....";
bool ret;
string nomeArq = BASE_DIR + "data/maps/LevelOne-TESTE.txt";
Map = new CTilesMap();
ret = Map->loadMap(nomeArq.c_str());
if (!ret) {
cout << "Arquivo de mapa ("<< nomeArq << ") não exsite." ;
return;
}
nomeArq = BASE_DIR + "data/maps/blocks2_.png";
ret = Map->loadTileMap(nomeArq.c_str(),
32, 32, // int w, int h,
2, 2, // int hSpace, int vSpace,
2, 2, // int xIni, int yIni,
18, 11, // int column, int row,
196); // int total
if (!ret) {
cout << "Arquivo de tiles ("<< nomeArq << ") não exsite." ;
return;
}
Map->printMap();
}
No programa principal, logo após a chamada da rotina CarregaSprite, acrescente a linha
CarregaTileMap();
A seguir, adicione a linha abaixo dentro da rotina Desenha, logo antes da linha spriteCao->draw(); que desenha a sprite do cachorro .
Map->draw();
Execute o programa e observe o resultado. Observe também na janela de console a exibição do mapa de posicionamento de tiles.
Substitua a rotina CarregaTileMap pelo código abaixo e teste novamente o programa.
void CarregaTileMap() {
cout << "Carrega TileMap...." << endl;
bool ret;
string nomeArq = BASE_DIR + "data/maps/desert.txt";
Map = new CTilesMap();
ret = Map->loadMap(nomeArq.c_str());
if (!ret) {
cout << "Arquivo de mapa ("<< nomeArq << ") não exsite." ;
return;
}
else cout << "Arquivo de mapa ("<< nomeArq << ") carregado." ;
nomeArq = BASE_DIR + "data/maps/tmw_desert_spacing.png";
ret = Map->loadTileMap(nomeArq.c_str(),
32, 32, // int w, int h,
1, 1, // int hSpace, int vSpace,
1, 1, // int xIni, int yIni,
8, 6, // int column, int row,
48); // int total
if (!ret) {
cout << "Arquivo de tiles ("<< nomeArq << ") não exsite." << endl;
return;
}
else cout << "Arquivo de tiles ("<< nomeArq << ") carregado." << endl;
Map->printMap();
cout << "Carrega TileMap (FIM)" << endl;
}
Exercício 1
A classe CTilesMap possui o método getTileNumber(int lin, int col) capaz
de informar o número do tile que está armazenado em uma dada posição do
mapa de posicionamento. Considere que o primeiro tile está na posição
(0,0).
Imprima uma parte qualquer do mapa de posicionamento.
Exercício 2
Escolha um dos tiles do mapa para representar um obstáculo ao
movimento do sprite e bloquei o movimento deste sprite quando houver
uma colisão entre eles.
Lembre-se que o sprite move-se em pixels. Para obter a posição do sprite, utilize os métodos getX() e getY().
O
posicionamento dos tiles, por sua vez é dado pelos índices no mapa de
posicionamento e a posição efetiva na tela depende de seu tamanho e de
sua posição(linha/coluna) no mapa de posicionamento.
Exercício 3
Crie um novo mapa de posicionamento de tiles através da ferramenta Tiled.
Para gera um mapa de posicionamento compatível com nosso
Framework, configure o editor para gerar mapas no formato CSV. A seguir
edite e salve um mapa. Abra o mapa e um editor de textos simples como o
Notepad ou o próprio Visual Studio e planeje como convertê-lo para o
formato do mapa suportado pelo Framework.
FIM.