O Mundo dos Jogos 2D
Tiles, Tilesets e Tilemaps
Leandro Tonietto
[email protected]
http://professor.unisinos.br/ltonietto/jed/pgr/tilemap.pdf
20-Abr-2012
Apresentação original feita pelo Prof. MSc. João Ricardo Bittencourt
([email protected]), em 23 Mar. 2007
Processamento Gráfico
Desenvolvimento de Jogos Digitais
UNISINOS
Sumário
1.
2.
3.
4.
Tiles
Tilesets
Tilemaps
Sprites
Revisão Paleta de Cores
n
Dimensão: 240x360
n
86400 pixels
n
Usa uma paleta com 256
cores
Tiles
n
Uma pequena porção de imagem
n
Metáfora: Azulejo, tijolo ou um carimbo
n
A cena é formada por uma coleção de tiles
n
Cada pixel do tile utiliza um índice da paleta
Tile
01123000112
00111000000
00111000011
33121111111
00311111100
n
Cada número é um indice da paleta!
Tileset
n
Coleção de tiles
n
Em geral organizados
em uma matriz ou
um vetor
n
Cada tile em um
tileset possui um
identificador (ID)
n Um código
numérico
Tileset
Tilemap
n
Uma imagem criada através da composição de
diversos tiles de um tileset.
n
Objetivo: economizar memória!
Tilemap
023400000
000000110
000000110
000001110
n
Cada número é um indice do tile no
tileset
Tilemap
023400000
000000110
000000110
000001110
1
1 (RGB)
2
2 (RGB)
3
3 (RGB)
4
Tileset
4 (RGB)
...
Tilemap
n
Cada número no tilemap é um indice do
tile no tileset
n
Cada pixel do tile no tileset é um índice
da paleta
Tilemap - Resolvido / cenário
0
1
2
3
Paleta com
4 cores
Tile
Tilemap
(cenário)
Tilemap - desenho sem otimização
///// Método para desenhar o tilemap
desenhaMapa(){
int px, py=0;
for (int y=0; y<map.rows; y++){
px=0;
for (int x=0; x<map.cols; x++){
desenhaTile(map.getTile(x,y), px, py);
px += tileWidth;
}
py += tileHeight;
}
glFlush();
}
Otimização:
Ao invés de fazer várias
chamadas glRasterPos e
glDrawPixels, podemos
otimizar o processo de
desenho criando uma
imagem que
representará o tilemap e
desenhar dentro dela os
tiles. Depois desenhamos
a imagem dentro do
método desenhaMapa()
///// Método para desenhar um tile por vez
desenhaTile(BYTE id, int px, int py){
Tile tile = tileSet.getTile(id);
int *pixels = new int[tileWidth*tileHeight];
for (int y=0; y<tileHeight; y++){
for (int x=0; x<tileWidth; x++){
pixels[x + y * tileWidth] = paleta[tile.getPixel(x,y)];
}
}
glRasterPosi(px, py);
glDrawPixels(..., pixels);
}
Tilemap
n
Cenário 1: Sem tilemap
n Imagem com 2000x1000
n Sistema de cor RGB (cada pixel com 24 bits)
n Imagem com 5,72 Mb
n
Cenário 2: Com tilemap, tileset e tiles
n Imagem com 2000x1000
n Uma paleta com 256 cores (0,75 Kb)
n Cada tile com as dimensões de 20x20 pixels
• Matriz 100x50 de bytes (ID do tile) (4,88Kb)
n Tileset com 50 tiles (19,53Kb - 20x20x50)
n Total: 25,16Kb (menor ~233 vezes)
Estratégias de Visão
n
Representação e Lógica
n A parte de estrutura de dados é feita com
classes para Tilemap, Tileset e Tile
n Porém, conforme o tipo de visão que
implementamos, algumas partes da
representação devem ser tratadas de
modo diferente:
• desenho da tilemap
• captura e tratamento de clique do
mouse
• movimentação do personagem na tela
Estratégias de Visão
n
Tipos de visualização e tratamento de input
n Regular:
• Tiles retangulares
• Normalmente, vista superior
• Fácil para desenhar e tratar input
n Isométrico:
• Tiles isométricos
• Vista isométrica, “de canto”, 2,5D
• Algoritmo mais complexo para captura
de mouse e movimentação do
personagem
Estratégias de Visão
n
Estrutura para representação
Sprite
n
“Fantasma”, espectro, ...
n
Animação clássica –
seqüencia de quadros que
serão exibidos conforme a
ação do jogador ou mudança
de estado de algum objeto
n
Cada vez que atualiza a tela
pinta um novo frame.
n
Usado para:
n Personagem principal,
inimigos, itens e artefatos
no cenário
TileStudio
n
Ferramenta livre e gratuita usada para editar
tiles, tilesets, tilemaps e sprites.
n http://tilestudio.sourceforge.net
n
Site com mais detalhes sobre tilemaps regulares
e isométricos:
n http://www.tonypa.pri.ee/tbw/tut02.html
Download

O Mundo dos Jogos 2D