Je souhaite générer de manière aléatoire une carte pour un jeu de sidecroller 2D en utilisant l'ensemble de tuiles suivant:
J'ai trouvé quelques excellents articles sur le processus de masquage de bit, par exemple: http://www.angryfishstudios.com/2011/04/adventures-in-bitmasking/ http://www.saltgames.com/2010/a-bitwise -méthode-pour-appliquer-des-tilemaps /
J'aime l'idée d'utiliser un bitmask / tilemask au lieu de faire une énorme clause if ou une instruction switch.
Cependant, j'ai du mal à visualiser l'ensemble du processus et aucun de ces articles ne parle de randomisation.
Mes tuiles s'emboîtent de plusieurs manières différentes, pas seulement dans un sens comme le semblent les tuiles des exemples que j'ai liés.
Par exemple, voici quelques exemples:
Étant donné que mes carreaux s'assemblent de différentes manières, je ne pense pas qu'un masque 8 bits fonctionnera. Par conséquent, je pensais utiliser un masque plus grand. Quelque chose comme char [8] ou char 4 .
Si quelqu'un pouvait montrer quelques pseudocodes / exemples de l'apparence de l'algorithme général, je l'apprécierais grandement.
Avez-vous envisagé d'utiliser une fonction de bruit 1D Perlin ou simplex? Il y a un certain nombre d'avantages à cela, notamment:
Infini (dans le domaine de la précision en virgule flottante), terrain non répétitif
Peut être généré en temps réel (même dans un shader, qui est rapide ), ou en avance et stocké dans des textures, comme dans votre exemple
Les bordures correspondent automatiquement car Perlin et simplex sont continus.
Bien que le terrain lui-même soit pseudo-aléatoire, il est assez facile d'appliquer une fonction d'enveloppe ou de simplement réduire le nombre d'octaves dans les zones où vous avez besoin de zones planes ou d'autres caractéristiques de terrain spécifiques dont vous avez besoin.
Voir ce lien pour une explication assez approfondie de la mise en œuvre de 1D Perlin.
Une enveloppe est essentiellement un champ ou une fonction scalaire qui est multiplié par la fonction de bruit avant d'enregistrer ou d'afficher votre sortie.
(Image initiale empruntée à l'article référencé ci-dessus.)
Dans cet exemple, la ligne rouge représente une fonction par morceaux définie comme
... qui peut être mieux défini en utilisant une fonction lisse. Dans ce cas, il redimensionne simplement les choses à 0 avant le plateau, puis remonte à 1 après.
Mise à jour
Voici un exemple de "terrain" simplex 3D de l'un de mes projets, avec un éclairage diffus + spéculaire appliqué, généré entièrement dans un tuyau shader vert + tess + frag. Pour votre situation, j'en prendrais une tranche verticale pour obtenir la pente du terrain.
Et une vue orthographique de haut en bas:
la source