Façon correcte de générer «aléatoirement» un terrain fluide

9

Je crée un simple jeu RTS de haut en bas. J'envisage de générer des cartes "au hasard" à la volée quand j'en ai besoin. Je prévois que tout cela fonctionne en «passes»:

  1. Remplissez le terrain avec de l'herbe
  2. Revenez en arrière et ajoutez quelques jets de gravier aléatoires
  3. Complétez le gravier
  4. Dessiner un paysage de montagne sur la deuxième couche
  5. Arrondir les montagnes
  6. etc.

Maintenant, regardez cette image ci-dessous:

entrez la description de l'image ici

J'ai créé cela à la main à l'aide de mon éditeur de carte, mais je prévois que ce sera essentiellement le résultat après, espérons-le, passer / étape 3.

Comment dois-je décider quand et où placer mon gravier pour qu'il soit au moins de forme irrégulière et suffisamment sporadique pour avoir l'air naturel?

Merci si tu peux! Toute aide est appréciée!

En note:

Chaque passe est essentiellement une itération sur toutes mes tuiles (la carte est divisée en 40x40 tuiles) similaire à ceci:

for (int x = 0; x <= GRIDMAX - 1; x++) {
    for (int y = 0; y <= GRIDMAX - 1; y++) {
        //Terrain(x, y, 0) = SomethingHere;
    }
}
Freesnöw
la source

Réponses:

5

Vous pouvez jouer avec Perlin Noise ( voir ma réponse StackOverflow pour une implémentation ), pour générer une carte de hauteur. À partir de la carte de hauteur, vous pouvez mapper certaines plages de hauteur sur différentes tuiles. Quelque chose comme:

  • Top 20% Neige
  • Gravier 20% suivant
  • 40% d'herbe
  • 20% d'eau

Vous devrez jouer avec les valeurs du générateur de bruit Perlin pour obtenir un terrain qui peut être généré et avoir fière allure.

Nick Banks
la source
5

Comme les autres l'ont dit, le bruit perlin devrait être une bonne source de données pour décider où placer différents types de tuiles. Je voudrais compléter cette idée et lier deux ressources supplémentaires qui devraient être utiles avec la troisième étape de votre liste de contrôle - arrondir les coins .

C'est un processus appelé auto-tuilage et ce n'est pas si difficile à mettre en œuvre. Il existe de nombreuses façons de le faire, mais la plupart d'entre elles reposent sur le calcul des informations d'adjacence pour chaque mosaïque afin de décider quel graphique doit être dessiné à cet emplacement.

Une façon très élégante de résoudre ce problème consiste à attribuer une valeur de drapeau unique à chaque direction de tuile adjacente et à disposer votre spritehseet de telle sorte que la valeur que vous obtenez en additionnant tous les drapeaux adjacents d'une tuile correspondra à la position correcte du tuile dans la feuille de sprites. Lisez cet article pour une description très claire de la technique.

Et voici une autre ressource qui décrit une autre variante de la technique.

David Gouveia
la source
Hé, juste pour vous le faire savoir, votre réponse a été extrêmement utile pour arrondir les coins. Merci beaucoup :) En fait, tout fonctionne maintenant (même les coins arrondis)!
Freesnöw
4

Essentiellement, vous pouvez utiliser la génération de bruit Perlin pour générer vos cartes. Vous devez échantillonner la carte de hauteur générée et affecter des blocs de gravier aux parties de la carte qui ont au-dessus d'une certaine hauteur.

Voici un excellent article de référence sur la façon de mettre en œuvre un tel système et les différents types de terrain que vous pourriez générer.

Les exemples comportent beaucoup plus d'étapes que vous n'en auriez besoin, mais le concept est le même.

En savoir plus sur la génération mondiale de type Minecraft

http://www.gamedev.net/blog/33/entry-2227887-more-on-minecraft-type-world-gen/

entrez la description de l'image ici

David Young
la source