Estou procurando informações sobre como as pessoas implementam o autotiling em seus jogos baseados em blocos. Até agora, eu sempre o improvisei com várias frases "if ... else ..." codificadas e agora decidi que era hora de encontrar uma solução mais elegante. Pesquisei na Internet exemplos de implementações de autotiling e discussões sobre o tópico, mas criei apenas três artigos:
- http://www.codeproject.com/Articles/106884/Implementing-Auto-tiling-Functionality-in-a-Tile-M
- http://blog.rpgmakerweb.com/tutorials/anatomy-of-an-autotile
- http://web.archive.org/web/20130927193449/http://www.squidi.net/mapmaker/musings/m091016.php
(Especialmente o último é abrangente e muito útil.)
Também observei várias implementações e documentação de bibliotecas que a implementam, por exemplo, flixel: http://www.flixel.org/features.html#tilemaps
Infelizmente, todas as soluções que eu pude encontrar são exatamente tão improvisadas e aleatórias quanto as que eu comecei, e quase nunca cobrem todos os casos possíveis.
Estou procurando um exemplo elegante de implementação de autotiling que eu possa aprender.
Cheguei aqui pesquisando esse problema no Google, lendo os artigos vinculados e produzindo uma solução relativamente compacta que gera o conjunto comum de 47 peças. Requer um conjunto de peças 2x3 para o material autotiled como este:
Com uma variante de peça única no canto superior esquerdo, cantos internos no canto superior direito e quatro peças de canto externas na parte inferior (você pode reconhecer esse arranjo no RPG Maker).
O truque é dividir cada bloco de mapa "lógico" em quatro meios-blocos para renderização. além disso, um meio lado a lado no conjunto de peças só pode estar nessa posição em um lado esquerdo gerado, portanto, um lado lado esquerdo superior pode ser usado apenas na posição superior esquerda.
Essas restrições significam que você só precisa verificar três vizinhos de bloco inteiro por meio bloco, em vez dos oito blocos vizinhos.
Eu implementei essa ideia rapidamente para testá-la. Aqui está o código de prova de conceito (TypeScript):
Explicação:
A
é a parte superior esquerda do bloco,B
é a parte superior direita,C
é a parte inferior esquerda,D
é a parte inferior direita.edges
mantém máscaras de bits para cada uma delas, para que possamos pegar apenas as informações relevantes dos vizinhos.map*
são dicionários que mapeiam estados vizinhos para índices gráficos na imagem do conjunto de peças (0..24)._tile
é o bloco destinado ao autotiling.Enfim, aqui estão os resultados (com apenas um bloco, de qualquer maneira):
fonte
Eu li a maioria dos links e passei algum tempo para encontrar outra solução. Não sei se é bom ou não, mas para simular o comportamento de blocos automáticos do RPG Maker VX Ace (47 blocos), comecei a fazer algo assim:
Não sou programador e não sou o melhor em algoritmos matemáticos e na solução 1, 2, 4, 8, 16, 32, 64, 128 também não gostei muito.
Talvez minha abordagem seja pelo menos melhor que isso.
fonte