Estoy buscando información sobre cómo las personas implementan el autotiling en sus juegos basados en mosaicos. Hasta ahora, siempre lo he improvisado con un montón de declaraciones "si ... más ..." codificadas, y ahora decidí que es hora de encontrar una solución más elegante. Busqué en Internet ejemplos de implementaciones de autotiling y debates sobre el tema, pero solo encontré tres artículos:
- 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 el último es completo y muy útil).
También he examinado varias implementaciones y documentación de bibliotecas, que lo implementan, por ejemplo, flixel: http://www.flixel.org/features.html#tilemaps
Lamentablemente, todas las soluciones que pude encontrar son exactamente tan improvisadas y desordenadas como lo que comencé, y casi nunca cubren todos los casos posibles.
Estoy buscando un ejemplo elegante de implementación de autotiling del que pueda aprender.
Llegué aquí buscando en Google este problema, leí los artículos vinculados y produje una solución relativamente compacta que genera el conjunto común de 47 mosaicos. Requiere un conjunto de fichas 2x3 para el material autotiled de esta manera:
Con una variante de un solo mosaico en la parte superior izquierda, esquinas interiores en la parte superior derecha y cuatro mosaicos de esquinas exteriores en la parte inferior (puede reconocer esta disposición de RPG Maker).
El truco consiste en dividir cada mosaico de mapa "lógico" en 4 medios mosaicos para renderizar. además, un medio mosaico en el conjunto de mosaicos solo puede estar en esa posición en un mosaico generado, por lo que un medio mosaico superior izquierdo solo se puede usar en una posición superior izquierda.
Estas restricciones significan que solo necesita verificar 3 vecinos de mosaico completo por medio mosaico, en lugar de los 8 mosaicos vecinos.
Implementé esta idea rápidamente para probarla. Aquí está el código de prueba de concepto (TypeScript):
Explicación:
A
es la parte superior izquierda del mosaico,B
es la parte superior derecha,C
es la parte inferior izquierda,D
es la parte inferior derecha.edges
contiene máscaras de bits para cada uno de estos, por lo que solo podemos obtener la información de vecino relevante.map*
son diccionarios que asignan estados vecinos a índices gráficos en la imagen del conjunto de mosaicos (0..24)._tile
es el mosaico destinado al autotiling.De todos modos, aquí están los resultados (con solo un mosaico, de todos modos):
fuente
Leí la mayoría de los enlaces y pasé algún tiempo para encontrar otra solución. No sé si es bueno o no, pero para simular el comportamiento del mosaico automático RPG Maker VX Ace (47 mosaicos) comencé a hacer algo como esto:
No soy un programador y no soy el mejor con algoritmos matemáticos y la solución 1, 2, 4, 8, 16, 32, 64, 128 que tampoco me gustó mucho.
Quizás mi enfoque es al menos mejor que eso.
fuente