Generazione del terreno per Platformer 2D basato su piastrelle


15

Attualmente sto lavorando su un platform 2D basato su piastrelle simile a Terraria in qualche modo, anche se ho difficoltà con la generazione del terreno. Ho fatto alcune nozioni di base, sebbene non risultino utili.

Ho provato alcune tecniche diverse come Perlin Noise e ho letto di altre come Midpoint Displacement, anche se non sono sicuro di quale sarebbe il migliore, o una combinazione di tecniche diverse per generare aree diverse. (Come Midpoint Displacement per la forma generale del terreno e Perlin Noise per le grotte.)

Ho trovato un'eccellente spiegazione di come potrei sovrapporlo con la libreria del rumore accidentale , sebbene sia in C ++, e non conosco abbastanza C ++ per compilarlo in una DLL che posso usare da C #. Ho provato a copiarlo in C #, anche se non so come unire due effetti insieme (il gradiente per la base generale e quindi il frattale per i dettagli).

Attualmente sto usando un frattale al plasma e i risultati sono estremamente vari. Ad esempio, può generare terreno in cui non vi è quasi alcuna superficie, oppure può generare terreno in cui non esiste alcuna superficie.

Un esempio di una mappa ok, sarebbe meglio con qualche miglioramento in più, però. (Il nero è solido, il bianco è aria):

Buona mappa

E un esempio di una terribile mappa. (Il nero è solido, il bianco è aria):

Mappa terribile

Fondamentalmente, quello che sto chiedendo è, quale sarebbe un modo migliore per generare il terreno o forzarlo per assicurarsi che ci sia una ragionevole quantità di superficie, con il tempo di generazione il più veloce possibile. O, in alternativa, come sarei in grado di ottenere lo stesso risultato della Libreria del rumore accidentale, ma in C #.

Qualsiasi esempio sarebbe molto apprezzato.


Ciao, mi chiedevo come hai fatto questo. Sto cercando di capire come generare mondi come questo e mi piacciono i risultati che stai ottenendo. Quale algoritmo stai usando perché non assomiglia al rumore perlin 2D e sicuramente non è il rumore perlin 1D.
G3tinmybelly,

Risposte:


8

Proverei ad attenermi al rumore di Perlin, ma aggiungendo un peso in base all'altezza, per garantire una certa densità media a determinate altitudini. Per citare parte del post di Notch sulla generazione del terreno di Minecraft :

Quindi ho passato il sistema in un sistema simile basato sul rumore Perlin 3D. Invece di campionare l '"altezza del suolo", ho trattato il valore del rumore come la "densità", dove qualsiasi cosa inferiore a 0 sarebbe aria e qualsiasi cosa superiore o uguale a 0 sarebbe terra. Per essere sicuro che lo strato inferiore sia solido e quello non lo sia, aggiungo semplicemente l'altezza (scostata dal livello dell'acqua) al risultato campionato.

In sostanza, stai prendendo una piccola fetta di terreno Minecraft. Quindi genera rumore Perlin 2D, ma ponderalo in modo tale che qualsiasi cosa al di sopra di un certo punto sia probabilmente aria, e qualsiasi cosa al di sotto di un certo punto sia probabilmente terra.

Questo ti darà un buon terreno, con alcuni strapiombi e caratteristiche interessanti, nonché alcune grotte e isole galleggianti. (Se non vuoi isole galleggianti, puoi testarle e rimuoverle manualmente.) Questo metodo non ti darà cose come tunnel, quindi vorrai un metodo per aggiungere quelle dopo la generazione del terreno, come un passeggiata casuale .


Non sono del tutto sicuro che sto usando Perlin Noise per il suo pieno potenziale. Dopo aver fatto esattamente come hai descritto, ha appena creato molte grotte, con molte isole galleggianti. Nessuna definizione effettiva del tipo di terreno. Usando un gradiente per pesare i risultati, ottengo questo risultato .
Dimensioni ombreggiate

@Shaded Dimensions - I parametri del rumore Perlin devono essere modificati. Hai un rumore molto variabile, quando quello che vuoi è un modello molto più fluido e ampio. Dai un'occhiata a freespace.virgin.net/hugo.elias/models/m_perlin.htm e prova a rovinare alcuni dei tuoi parametri. Prova una persistenza più bassa e meno ottave. (Questi termini possono variare, quindi leggi l'articolo.)
dlras2

Va bene, grazie per il link. Ho anche scoperto che il peso non funzionava come previsto dopo aver modificato alcuni parametri.
Dimensioni ombreggiate

Ok, ho modificato un po 'i parametri e ho qualcosa di abbastanza accettabile, almeno per ora. Ho anche rimosso le grotte di generazione proprio per questo test, poiché volevo prima eseguire il terreno reale. Questo è il risultato finale . Ho solo bisogno di aggiungere controlli per rimuovere quelle isole galleggianti. Grazie ancora.
Dimensioni ombreggiate

@Shaded Dimensions - Nice! Molto tempo, i buoni terreni derivano solo dall'ottimizzazione dei parametri e dalla sovrapposizione del rumore. Ci vorrà un po 'prima di ottenere qualcosa di cui sei molto contento, ma puoi sempre usare quello che hai ora e tornare per aggiungere ritocchi finali. In bocca al lupo!
dlras2,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.