TiledLayer e suas complicações

9 respostas
N

Quando eu instancio um TiledLayer:

TiledLayer tiledLayer = new TiledLayer(10, 10, imagem, 32, 32);

Até aí tudo bem. Mas tenho algumas dúvidas.

Qual a vantagem de usar tiles? Veja por exemplo: Tenho uma imagem que contém alguns tiles. Essa imagem tem 32 x 32 pixels. Se eu pretendo que cada tile tenha 16 x 16 basta eu fazer assim:

tiledLayer = new TiledLayer(2, 2, imagem, 16, 16);
Certo?

Mas duas linhas e duas colunas é muito pouco para quem vai fazer um cenário gigantesco. Então devo setar um número bem grande de colunas e linhas mesmo sabendo que não tem nenhum tile naquele espaço?

Ou eu estou confundindo as coisas?
Preciso de uma ajuda para entender esse TiledLayer direito.
Obrigado.

9 Respostas

M

Como você viu, o TiledLayer serve pra reutilizar pedaços de imagens. A maioria dos celulares tem capacidade de memoria bem pequeno, então imagine que você tenha um jogo com 10 fases, se tu vai colocar 10 imagens inteiras de cenários no seu jar vai ficar muito grande, então o que se faz é dividir uma imagem em várias partes e reutilizar pra vários cenários, construindo a imagem na hora de usar e depois eliminando ela. Realmente uma imagem com 4 celulas é bem pequeno e limita bastante o que tu pode construir com eles. Mas a lógica de como utilizar você sabe.
Veja estes exemplo:
http://www.j2medev.com/api/midp/javax/microedition/lcdui/game/TiledLayer.html
http://developers.sun.com/techtopics/mobility/midp/articles/game/

N

Mas a questão é essa:
Supondo que eu tenha uns 4 tiles que representam plataformas. Eu pretendo criar cenários gigantescos usando apenas esses 4 tiles.
A imagem que contém esses 4 tiles tem 32 x 32.
Na hora de instanciar o TiledLayer eu faço

TiledLayer tl = new TiledLayer(colunas, linhas, imagem, 16, 16);

Ou seja, cada tile tem 16 x 16.
Mas e quanto as colunas e linhas? Eu devo setar colunas e linhas com um grande valor para ter um grid bem grande, não é isso? Por exemplo, eu posso querer no TiledLayer 40 colunas e 10 linhas. Ou seja, meu cenário teria no máximo de largura 40 x 16 e máximo de altura 10 x 16.
Mas eu só tenho 4 tiles de 16 x 16, ou seja, só tenho 32 x 32 de imagens, e tive que setar as colunas e linhas do TiledLayer para 40 e 10.

É esse mesmo o raciocício ou estou me equivocando?
Obrigado.

M

Acho que entendi sua dúvida, assim: new TiledLayer(colunas, linhas, imagem, 16, 16); colunas e linhas é pra setar quantas linhas e colunas você quer no seu tiled, não interfere em nada no tamanho da imagem.
Ai o resto:
…imagem, 16, 16) vai acontecer isso: vai ser verificado a imagem ( que tem 32X32) e que você quer dividir em 16X16, então vai ser reconhecido que a imagem pode ser dividida em 4 partes.
As linhas e colunas iniciais não tem nada a ver em como você divide a imagem.

PS: Repare que se tu tiver uma imagem por exemplo de 32X31 e tentar dividir em 16X16 vai dar erro porque não fecha a divisão.

Com as quatro imagens divididas em 16x16 tu pode usar elas em quantas linhas e colunas tu quiser agora. Num tiled de 40X10 ou 100X234 etc…

N

Valeu.
Compreendi melhor agora.

Para finalizar supondo que eu tenha 10 x 10 no meu grid do TiledLayer.
então ficaria:

int map[] = {   
   0, 0, 3, 2, 0, 0, 0, 2, 0, 0,
   0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
   0, 2, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 3, 3, 0, 0, 0, 2, 1, 0,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   0, 0, 3, 0, 0, 0, 0, 2, 1, 0,
   0, 0, 0, 3, 0, 0, 0, 0, 0, 0,
   0, 0, 3, 0, 0, 0, 0, 1, 0, 0,
   0, 0, 0, 3, 0, 0, 0, 0, 0, 0
};

Como ficaria o código para usar o setCell()??
Já vi alguns exemplos usando o laço for para isso, mas não compreendi direito.

Obrigado!

M

TiledLayer tiledLayer = new TiledLayer(10, 10, imagem, 16, 16); for (int row=0; row<10; row++) { for (int col=0; col<10; col++) { tiledLayer.setCell(col,row,map[row][col]); } }

N
TiledLayer tiledLayer = new TiledLayer(10, 10, imagem, 16, 16); 
for (int row=0; row<10; row++) { 
          for (int col=0; col<10; col++) { 
             tiledLayer.setCell(col,row,map[row][col]); 
          } 
       }

Mas o meu vetor mapa[] é unidimensional. E você colocou um exemplo como se ele fosse bidimensional…
map[row][col]…
Esse código para o meu vetor mapa[] não dá certo.

Como adaptar esse código ao meu vetor?

M

Não é só colocar um contador ??:???:

TiledLayer tiledLayer = new TiledLayer(10, 10, imagem, 16, 16); int cont=-1; for (int row=0; row<10; row++) { for (int col=0; col<10; col++) { cont++; tiledLayer.setCell(col,row,map[cont]); } }
Mas acho que esta forma que eu fiz é a mais correta e utilizada, já que você vai trabalhar com linhas e colunas nada mais natural que ter um array de linhas e colunas.
Acho melhor adaptar sua matriz, já tá tudo identado, é so colocar as chaves.

N

Esse último exemplo está mais confuso ainda.
Você cria uma variável cont fora dos dois laços for, cria outro cont dentro do for interno e dentro do corpo desse mesmo for incrementa o cont novamente?

Desculpe, mas não entendi.

M

Isso ai já é lógica, vc tem que interpretar o algoritmo, mas vamos lá!!
Pra setar partes de Tiled você precisa dizer em qual linha e em qual coluna você quer colocar, sem problemas, você faz o looping pra ir passando em cada linha e coluna (os loopings col e row).
Mas pra setar na posição certa você tem que colocar um contador que vai do 0 ao 99 (10x10) sem reinicializar entre os loopings, pois tu ta usando um array de uma dimensão.
Por isso que eu disse que se tu colocar num mapa bidimensional fica mais facil de entender onde setar cada celula.
Ficou mais claro ??

Criado 30 de outubro de 2006
Ultima resposta 2 de nov. de 2006
Respostas 9
Participantes 2