PUCRS/FACIN
Curso de Especiali
zaçã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:
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() 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.