2011-01-16 16 views
25

Sto sviluppando un motore di piastrelle 2D e in questo momento sto lavorando ad algoritmi di generazione di mappe.Generazione mappa tile 2D

Ho provato quelli di base generalmente coinvolti nella generazione semplice heightmap come

  • generazione collina
  • rumore Perlin
  • diamante quadrato

ma ottengo sempre lo stesso problema: questo tipo di algoritmi sembra adatto quando si tratta di mappe di tessere che hanno anche un componente di altezza ma questo non è il mio caso.

Io fondamentalmente sono gli sprite come l'erba, mare, deserto e così via, ma non deve essere collocato all'interno della mappa in base a un'altezza generato ma qualcosa di simile

  • Tutto parte dal mare
  • isole sono posto al centro della mappa (questo è dove gli algoritmi che ho provato non sono riusciti per lo più)
  • deserto sono generati (che dovrebbe essere come macchie casuali in tutto)
  • montagna e colline catene hanno deposto le uova (che dovrebbe essere come i serpenti)

Che tipo di approccio dovrei provare?

Ho risolto i problemi relativi ai sottocomponenti (come deserti, colline e montagne) sviluppando algoritmi specializzati per fare ciò che mi serviva (ad esempio la montagna parte da un punto e poi segue una direzione con possibilità di svolta) ma sto fallendo con la generazione delle isole base (che potrebbero essere personalizzabili per essere solo una pangea o molti gradi di dimensioni).

solo per darvi un'idea pratica quello che sto cercando è qualcosa come l'algoritmo di civiltà:

alt text

+1

Al momento di chiedere, non credo che questo esistesse. Al giorno d'oggi, c'è http://gamedev.stackexchange.com/ – Hooked

risposta

14

[generazione collina, Perlin, piazza diamante] ... questo tipo di gli algoritmi sembrano adatti quando si tratta di mappe di tessere che hanno anche un componente di altezza ma questo non è il mio caso.

Ma è il tuo caso. Le montagne sono più alte delle pianure e le pianure sono più alte dell'acqua.

     ___/ 
        ___/ ___ Mountain cutoff 
       ___/ 
     ______/ 
    ____/ ___ Water cutoff 
__/ 

È possibile quantizzare i dati in modo che, se è tra una serie di livelli, è considerato come un tipo di piastrelle, mentre quando si è in un intervallo diverso, è un diverso tipo di piastrella. Sarai buttare fuori alcuni dettagli, ma otterrai comunque contorni che corrispondono al tipo di rumore che stai generando.

Probabilmente ci vorrà un bel po 'di tweaking, e ti richiederà di generare altre caratteristiche del terreno (oltre a montagne insuperabili) te stesso, ma dovrai modificare molto con qualsiasi soluzione di generazione di contenuti.

+6

Se vuoi maggiori informazioni sugli algoritmi procedurali di generazione di contenuti, tecniche, esperienze, ecc, ho recentemente [trovato questa pagina wiki] (http://pcg.wikidot.com/categoria-PCG-algoritmi). Sembra una grande risorsa e copre gli algoritmi di hightmap che hai citato nella tua domanda. Non è il mio sito, né sono coinvolto con loro in alcun modo - sembra semplicemente fantastico, quindi volevo collegarlo :) –

15

Ho usato un approccio che altri hanno definito come utilizzare "formiche" per creare il terreno casuale.Una descrizione dell'approccio utilizzato:

Innanzitutto, ho generato una tilemap utilizzando una matrice rettangolare bidimensionale (x, y) di una classe di tile specializzata. La classe di tessere contiene le informazioni relative alle tessere come il punto di divisione e il tipo di terreno.

Quindi ho creato una speciale classe "ant", che può essere pensata come un'entità invisibile che fa "passi" attorno alla tilemap. Ogni volta che la formica si sposta su una nuova tessera, il tipo di terreno sottostante viene cambiato. La formica può muoversi in 8 direzioni e cambia direzione, ogni volta che ha spostato una tessera. La direzione che prende dopo ogni passaggio è casuale.

Espongo una quantità fissa o casuale di formiche con una quantità di vita fissa o casuale. La vita è la quantità di tessere che può attraversare/salire prima di essere rimossa.

Per poter controllare quale tipo di terreno è più comune, creo una matrice "tipo terreno". Questo array contiene un elenco dei tipi di terreno (in pratica solo un int). Per ottenere un bilanciamento uguale tra tutti i tipi di terreno, aggiungi solo uno di ciascun tipo di terreno alla matrice del tipo di terreno. Se si desidera che un determinato tipo di terreno sia più comune, aggiungere ulteriori voci all'array, con quel particolare tipo di terreno.

Quindi quando la formica deve determinare quale terreno modificare, si esegue una ricerca nell'array del tipo di terreno utilizzando un numero intero casuale come indice dell'array.

Ci vuole un po 'di regolazione dei parametri (quantità di formiche, tempo di vita della formica, matrice del tipo di terreno), ma sto raggiungendo alcuni terreni davvero buoni finora.

Potrebbe essere ulteriormente migliorato utilizzando tipi più sofisticati di classi di formiche, ad esempio attraversate in modelli specializzati ecc. Per creare isole credibili in un oceano, probabilmente si vorrebbe modificare il comportamento della formica in modo da avere alcuni vincoli in termini di quale modo di muoversi (in modo da non ottenere a caso lunghi "picchi" di terra, piccole isole molto disperse, ecc.).

Il seguente è un esempio di tilemap di una foresta, che viene generato proceduralmente da una piccola app realizzata utilizzando l'approccio ant. Spero che questo possa farti strada!

si può ottenere la fonte della app (VB.NET) a Github

Procedurally generated 2D tile map of a forest section

+1

+1; Questo è un approccio interessante, in qualche modo simile a [Cellular Automata] (http://pcg.wikidot.com/pcg-algorithm:cellular-automata). Sembra che in pratica avresti una distribuzione casuale con il raggruppamento, il che a prima vista sembra quello che vorresti. Non penso che con questo approccio possiate ottenere sfumature uniformi, specialmente se confrontato con il rumore di Perlin, anche se ritengo che potrebbe essere molto più convincente per alcuni tipi di piastrelle (ad es. Alberi). Per quanto riguarda la "tabella dei numeri", è simile alla mia risposta per [come appesantire un PRNG] (http://stackoverflow.com/questions/3966809). –