Comment puis-je générer de manière aléatoire un terrain 2D avec défilement latéral basé sur des tuiles?

11

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: entrez la description de l'image ici

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:

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

É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.

erebel55
la source

Réponses:

3

Oui, la taille du masque augmenterait avec un nombre croissant d'options - votre propre lien http://www.saltgames.com/2010/a-bitwise-method-for-applying-tilemaps/ la deuxième partie explique l'idée principale.

En substance, vous devez énumérer X possibilités pour chaque «bordure» entre les tuiles; dans votre exemple particulier, il semble que le "haut / bas de la tuile" puisse être (1) blanc (2) couvert ou (3) à moitié couvert - ce qui correspond par coïncidence à l'exemple "trinaire" donné dans l'article.

Mais les masques ne vous aideraient qu'à limiter les possibilités de tuiles à celles qui peuvent être dessinées, en soi, ce n'est pas une méthode qui montre comment générer les cartes réelles de manière sensée.

Votre jeu de tuiles particulier est en fait assez restrictif - il ne décrit qu'une seule surface montante / descendante, et à tout point de départ de "niveau entier", vous n'avez que quelques choix valides. Par exemple, après la tuile # 2, seules les tuiles # 1 ou # 8 sont possibles. Vous pouvez simplement vous déplacer de gauche à droite, faire une liste des (peu) tuiles qui peuvent venir après la tuile précédente, et choisir au hasard l'une d'entre elles.

Peter est
la source
Je pense que c'est la réponse que je cherche, mais elle est encore un peu trouble. Pouvez-vous obtenir un peu plus de détails, sous forme de texte ou de pseudocode, sur le fonctionnement de la dernière partie de votre explication? "Vous pouvez simplement vous déplacer de gauche à droite, en faisant une liste de laquelle (peu) de tuiles peuvent venir après la tuile précédente, et en choisissant une au hasard."
erebel55
1
Pour chaque type de tuile, ayez une liste des tuiles autorisées après cela - il y a si peu de tuiles, cela peut être fait rapidement manuellement. La 'hauteur' changera, remplissez tout en dessous de la nouvelle tuile avec # 10s.
Peteris
Ah donc vous dites d'utiliser cette méthode au lieu du bitmasking?
erebel55
1
Oui, le masquage de bit est utile si tout le contenu 2D est significatif, mais vos cartes semblent être à un seul niveau, une surface horizontale de hauteur variable.
Peteris
Cela a du sens, les "montagnes" seront de hauteurs variables et se jetteront les unes dans les autres. Donc, essentiellement, ce sera une montagne continue de changer de hauteur à mesure que vous avancerez. Un peu comme une onde cosinus / sinus qui a des amplitudes aléatoires à différents points. Dois-je me déplacer de gauche à droite ou de haut en bas lors de la génération de la carte?
erebel55
6

Avez-vous envisagé d'utiliser une fonction de bruit 1D Perlin ou simplex? Il y a un certain nombre d'avantages à cela, notamment:

  1. Infini (dans le domaine de la précision en virgule flottante), terrain non répétitif

  2. 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

  3. Les bordures correspondent automatiquement car Perlin et simplex sont continus.

  4. 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.

entrez la description de l'image ici

(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

x < 0.3 : y = (0.3-x)/0.3)
x < 0.5 : 0
x < 0.7 : (x - 0.5) / 0.2
else    : 1

... 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.

entrez la description de l'image ici

Et une vue orthographique de haut en bas:

entrez la description de l'image ici

3Dave
la source
Ceci est une technique pour générer les images de tuiles réelles elles-mêmes?
erebel55
1
@ erebel55 Oui. Vous pouvez utiliser une fonction 2D pour décider où (sur la base de votre exemple) placer différents enfants de plantes dans l'image, et également pour générer le terrain en pente. Je l'ai utilisé en 3D avec d'excellents résultats.
3Dave
Cela ressemble à une méthode intéressante, je ne suis pas sûr de vouloir suivre cette voie car j'ai déjà créé mes images.
erebel55
@ erebel55 ouais, aucune raison de jeter des trucs existants si ça marche pour vous.
3Dave
Eh bien, je n'ai pas encore fait fonctionner la génération aléatoire, mais j'espère;) Je vous ai donné un vote favorable pour cette méthode, car elle était intéressante et je pourrai l'utiliser dans le futur. Merci
erebel55