Choisissez la tuile en fonction des tuiles adjacentes


10

Je travaille sur un éditeur de carte en mosaïque et je dois choisir automatiquement les tuiles en fonction des tuiles adjacentes. Par exemple, lorsque vous placez une tuile route, à côté d'une autre tuile route, les deux doivent être orientées de manière à former une route continue. S'il y a d'autres routes autour d'elles, nous devrons peut-être utiliser des tuiles d'angle ou d'intersection.

Quelqu'un peut-il recommander des algorithmes pour ce faire? Le jeu utilise une carte en mosaïque carrée à 8 directions.


Ne pouvez-vous pas simplement examiner toutes les 8 tuiles environnantes chaque fois que l'utilisateur pose une nouvelle tuile et orienter la nouvelle tuile en conséquence? Bien sûr, vous devrez stocker des informations supplémentaires sur chaque tuile, telles que l'orientation et le type.
XiaoChuan Yu

J'examine toutes les tuiles environnantes, mais je ne savais pas comment gérer toutes les combinaisons de tuiles. Par exemple, vous avez le choix entre sept carreaux (horizontal, vertical, quatre coins et une croix). J'ai pensé à utiliser des instructions de commutation compliquées, mais cela ne me convenait pas.
alekop

Réponses:


18

C'est peut-être ainsi que cela se fait généralement. Vous avez votre liste de tuiles différentes qui représentent une tuile route dans toutes leurs orientations possibles. De gauche à droite, aux quatre coins, de haut en bas, peu importe. Vous allez maintenant indexer toutes ces tuiles avec un octet chacune. 8 bits, un pour chaque direction. Cela peut être dans une table de hachage ou par nom de fichier ... mais vous voulez le faire.

Vous avez donc ceci:

entrez la description de l'image ici

Le code d'octet pour la tuile ci-dessus est 00000000 . Ensuite, votre tuile qui va de gauche à droite (ou de droite à gauche) est comme ceci:

entrez la description de l'image ici

Le code d'octet de cette tuile est 10001000 , ou 136. Comme autre exemple, regardons une intersection à trois voies:

entrez la description de l'image ici

Le code d'octet de cette tuile est 10101000 .

Vous voyez probablement où je vais. Vous définissez des positions de bits dans l'octet représentant les connexions. C'est bien mieux que d'essayer de faire une grosse chaîne if / else que j'ai vue auparavant. Lorsque vous cherchez à placer une tuile, examinez les tuiles autour d'elle et créez un octet en cours de route. Définissez 1 pour les tuiles qui ont des routes (ou tout ce que vous cherchez à connecter) et 0 pour les tuiles qui n'en ont pas. Lorsque vous avez terminé, vous aurez le code d'octet pour la tuile exacte dont vous avez besoin.

Notez que lors de la création des actifs, vous pouvez en réutiliser beaucoup en tournant simplement et en lui affectant le code d'octet correct.

EDIT : images mises à jour pour être moins merdiques. Oui, c'est mieux qu'avant.


Très agréable! Simple et efficace. La seule chose que je ne comprends pas, c'est comment vous obtenez ces bitmasks. Par exemple, comment obtenez-vous un masque binaire de 17 à partir des numéros 3 et 7?
alekop

Tant pis, je vois ce que tu fais. Vous définissez les bits 3 et 7, mais vous comptez à partir de la gauche, au lieu de la droite.
alekop

Oh wow, c'est embarrassant. J'ai mon endianisme mélangé. C'était un accident, je vais arranger ça!
MichaelHouse

Super, maintenant mon commentaire n'a plus de sens! : p Je plaisante, merci pour votre réponse. C'est exactement ce que je cherchais.
alekop

1
Bonne explication. J'ai un article de blog couvrant la même technique avec une résolution de code et de mosaïque réelle: kitsu.github.io/2016/07/18/roguelike-project-05
kitsu.eb

3

Je vous recommande de jeter un œil à cette page pratique pour plus d'informations, car elle aborde en détail tous les aspects de ce que vous faites, ainsi que quelques optimisations potentielles: http://www.angryfishstudios.com / 2011/04 / aventures-dans-le-masquage /

Le tldr est que vous interrogez chaque cellule adjacente et stockez la combinaison dans un champ binaire / octet, puis la passez à travers une carte qui convertit un nombre de 0 à 255 en une valeur de 0 à 47, ce qui correspond à une image unique.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.