2012-08-24 1 views
0

J'essaie de créer un générateur de cartes pour un jeu de cartes 2D (similaire à des jeux comme Civilization - J'aimerais pouvoir créer de petites îles, de grands continents, etc.). J'ai trouvé un article qui fait à peu près ce que je veux, mais il est écrit en flash. On dirait qu'il ya une fonction pratique pour générer une image bitmap de bruit de Perlin:Questions de base sur l'utilisation de Perlin Noise pour la génération de cartes de tuiles

class BitmapData 
function perlinNoise(
    baseX:Number, 
    baseY:Number, 
    numOctaves:uint, 
    randomSeed:int, 
    stitch:Boolean, 
    fractalNoise:Boolean, 
    channelOptions:uint = 7, 
    grayScale:Boolean = false, 
    offsets:Array = null): 

Ceci est utilisé dans l'article (mais j'utilise java). Donc maintenant je suis coincé à essayer d'implémenter le bruit perlin moi-même (en trouvant fondamentalement une mise en œuvre pure de Java et copiez/collez-le).

Je suis juste essayer de comprendre le principe de base derrière l'utilisation de bruit de Perlin - ma compréhension de base:

  1. définir la taille de la carte que vous voulez (dans mon cas environ 100 x 50 tuiles).
  2. Initialiser un objet bruit Perlin (paramétrage de paramètres comme la fréquence, etc. - pas très sûr de la façon dont ces paramètres affectent des choses comme la taille de l'île, etc, mais mettre de côté pour le moment).
  3. Effectuez une itération sur chaque pavé de ma carte et demandez une valeur à l'objet de bruit Perlin. La valeur retournée peut être interprétée comme une valeur de hauteur que je devine.
  4. Affectez maintenant un type de tuile basé sur la valeur de hauteur.

Le code d'itération pourrait ressembler à:

for (int x = 0; x < 100; x++) { 
    for (int y = 0; y < 50; y++) { 
     int height = perlin.getValue(x, y); 
     if (height < 5); // this tile is water 
     else if (height < 20); // this tile is shore 
     else if (height < 40); // this tile is hill 
     else // this tile is mountain 
    } 
} 

Est-ce généralement correct? Ce serait au moins un point de départ.

L'article (écrit en flash) qui fait ce que je cherche: http://www.nolithius.com/game-development/world-generation-breakdown

classe flash BitmapData qui a commodément une fonction de bruit Perlin construit en: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#perlinNoise()

Merci

Répondre

0

Étant donné l'initialisation appropriée, votre code d'itération devrait fonctionner aussi loin que je peux voir. C'est-à-dire: si vous voulez limiter le bruit Perlin 2D à l'eau, au rivage, à la colline et à la montagne.

This page a une explication utile des exemples de bruit Perlin et de pseudocode. Essentiellement, l'algorithme additionne les fonctions de bruit avec une fréquence croissante et une amplitude décroissante.