Je cherche des informations sur la façon dont les gens implémentent le tuilage automatique dans leurs jeux basés sur des tuiles. Jusqu'à présent, je l'ai toujours improvisé avec un tas de déclarations codées en dur "si ... sinon ...", et maintenant j'ai décidé qu'il était temps de trouver une solution plus élégante. Je suis allé chercher sur Internet des exemples d'implémentations et de discussions sur le sujet, mais je n'ai trouvé que trois articles:
- 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
(Surtout le dernier est complet et très utile.)
J'ai également examiné diverses implémentations et documentation de bibliothèques, qui l'implémentent, par exemple flixel: http://www.flixel.org/features.html#tilemaps
Malheureusement, toutes les solutions que j'ai pu trouver sont exactement aussi improvisées et aléatoires que ce que j'ai commencé et ne couvrent presque jamais tous les cas possibles.
Je cherche un exemple élégant d'implémentation de tuilage automatique dont je pourrais tirer des leçons.
Je suis arrivé ici en recherchant moi-même ce problème sur Google, en lisant les articles liés et en produisant une solution relativement compacte qui génère l'ensemble commun de 47 tuiles. Il nécessite un jeu de tuiles 2x3 pour le matériau autotiled comme ceci:
Avec une variante à une seule tuile en haut à gauche, des coins intérieurs en haut à droite et quatre tuiles de coin extérieur en bas (vous pouvez reconnaître cet arrangement de RPG Maker).
L'astuce consiste à diviser chaque tuile de carte "logique" en 4 demi-tuiles pour le rendu. en outre, une demi-tuile dans le jeu de tuiles ne peut être dans cette position que dans une tuile générée, donc une demi-tuile en haut à gauche ne peut être utilisée que dans une position en haut à gauche.
Ces restrictions signifient que vous n'avez besoin de cocher que 3 voisins de tuiles complètes par demi-tuile, au lieu des 8 tuiles voisines.
J'ai rapidement mis en œuvre cette idée pour la tester. Voici le code de preuve de concept (TypeScript):
Explication:
A
est la partie supérieure gauche de la tuile,B
est en haut à droite,C
est en bas à gauche,D
est en bas à droite.edges
contient des bitmasks pour chacun d'entre eux, nous pouvons donc saisir uniquement les informations de voisinage pertinentes.map*
sont des dictionnaires mappant les états voisins aux index graphiques dans l'image de jeu de tuiles (0..24)._tile
est la tuile ciblée pour le tuilage automatique.Quoi qu'il en soit, voici les résultats (avec une seule tuile, de toute façon):
la source
J'ai lu la plupart des liens et j'ai mis du temps à trouver une autre solution. Je ne sais pas si c'est bon ou pas, mais pour simuler le comportement de tuile automatique de RPG Maker VX Ace (47 tuiles), j'ai commencé à faire quelque chose comme ceci:
Je ne suis pas un programmeur et je ne suis pas le meilleur avec les algorithmes mathématiques et la solution 1, 2, 4, 8, 16, 32, 64, 128 que je n'aimais pas beaucoup non plus.
Peut-être que mon approche est au moins meilleure que ça.
la source