Generazione di mappe casuali


63

Sto avviando / avviando un gioco RPG piastrellato 2D in Java e voglio implementare la generazione di mappe casuali. Ho un elenco di tessere diverse, (terra / sabbia / pietra / erba / ghiaia ecc.) Insieme a tessere acqua e tessere percorso, il problema che ho è che non ho idea di dove iniziare a generare una mappa in modo casuale.

Dovrebbe avere sezioni di terreno (come una parte di essa sarà sabbia, parte di terra, ecc.) Simile a come Minecraft è dove hai diversi biomi e si trasformano perfettamente l'uno nell'altro. Infine, avrei anche bisogno di aggiungere percorsi casuali in questo, andando anche in diverse direzioni su tutta la mappa.

Non sto chiedendo a nessuno di scrivermi tutto il codice o niente, solo per favore, portami nella giusta direzione.

tl; dr - Genera una mappa di tessere con biomi, percorsi e assicurati che i biomi entrino perfettamente l'uno nell'altro.

Risposte:


68

Tra le molte altre domande correlate sul sito, c'è un articolo spesso collegato per la generazione di mappe: Polygonal Map Generation for Games puoi trarre alcune buone strategie da quell'articolo, ma non può davvero essere usato così com'è.

Pur non essendo un tutorial, c'è un articolo su come vengono generate le mappe del mondo della fortezza nana. Fondamentalmente si generano più strati di rumore, per altezza, umidità, temperatura, salinità. Quindi useresti qualcosa del genere:

inserisci qui la descrizione dell'immagine

O questo

inserisci qui la descrizione dell'immagine

per generare biomi in base agli strati di rumore prodotti in precedenza. In genere ciò fornisce una transizione abbastanza regolare tra biomi e le transizioni sono logiche. Modifico anche le mappe di umidità e temperatura in base all'altitudine. Ciò genera naturalmente una "linea di legname" e produce montagne rocciose con calotte innevate.

Sto usando questa strategia il mio gioco e produce mappe come questa molto rapidamente:

inserisci qui la descrizione dell'immagine

Inoltre, puoi vedermi scorrere alcune altre mappe all'inizio di questo video .

Ed eccone un altro per iniziare:

Come posso creare un "mondo" casuale in un motore a tessere?

Come posso identificare le aree caratteristiche in un mondo generato proceduralmente?

Come posso creare un solido rumore piastrellabile per la generazione di mappe?


Mentre quel link di Generazione poligonale di mappe per i giochi è un articolo molto carino, non penso che sia molto adatto a questa domanda perché a) non è una griglia tilemap eb) non ha biomi - la trama del terreno è in base all'altezza.
Tapio,

@Tapio Hai ragione, ho aggiornato con ulteriori informazioni.
MichaelHouse

@ Byte56 Grazie, tutto ciò mi dà un punto di partenza! :)
Tom O

@ Byte56 Ho notato che hai menzionato la mia domanda un paio di anni fa, quindi l'ho aggiornato con il codice funzionante!
Nick Badal,

1
A proposito, il progetto di generazione della mappa poligonale è stato creato per un gioco che aveva una mappa a tessere che non mostrava le altezze. Le altezze e i poligoni sono lì per generare i biomi ma non sono effettivamente mostrati nel gioco.
dal

29

Mentre le altre risposte qui sono davvero buone per generare i tipi di paesaggi statici che potrebbero funzionare per questa specifica esigenza. Ci sono altri metodi che le persone che incontrano questa domanda potrebbero cercare se vogliono creare paesaggi che cambiano nel tempo o sembrano molto più realistici, puoi seguire questa tecnica.

A differenza delle altre risposte, inizi questo con una mappa completamente vuota. Inizia con quello che considereresti essere il livello del mare. Usa Perlin Noise per aggiungere una leggera variazione, se hai 256 possibili elevazioni, non variare più di 3-5 in entrambe le direzioni. Questo crea i primi pochi miliardi di anni del tuo paesaggio senza dover eseguire una simulazione per così tanto tempo.

Tettonica a zolle

Dividi la mappa lungo linee rette o curve per creare lastre, più dettagliate sono le forme delle lastre, più interessante sarà il tuo paesaggio. Tienili grandi. Dai a ogni piatto una direzione, velocità. In un determinato arco di tempo, sposta le piastre in modo graduale attorno alla mappa, trascinando con sé tutte le tessere sopra di esse.

Quando due piastre si incrociano, fai una scelta di quale andrà oltre e quale andrà sotto, questa scelta può essere casuale. Le piastrelle su piastre indicate sotto vengono immediatamente ridotte in altezza di 5 gradini. Una volta che una piastra è stata designata sopra o sotto, tutte le future interazioni con le piastre seguiranno queste regole:

  • Quando una piastra designata attraversa una piastra non designata, la piastra non designata diventa del tipo opposto. (Quindi le piastre UD diventano sotto quando si attraversa un over.)
  • Laddove una lastra sovrastante si trova su una lastra sottostante, tutte quelle tessere si spostano su 0-1 gradini di elevazione e le tessere seguono il percorso della lastra sopra.
  • Laddove una piastra sopra attraversa una piastra sopra, tutte quelle tessere si spostano di 1-2 gradini e le tessere nella regione di attraversamento non vanno più alla deriva.
  • Laddove una sotto-piastra attraversa una sotto-piastra, tutte le tessere nell'area con elevazione maggiore del segno del 66% per entrambe le piastre nella regione di attraversamento si spostano di 1-3 passi (come se per attività vulcanica, questo produrrà isole per un tempo sufficiente ) e le piastrelle in quest'area smettono di andare alla deriva.

Tutte le piastre che si incrociano lentamente del 20% della loro velocità attuale ad ogni passo. Per un maggiore realismo, aggiungi una variazione casuale da -10% a 10% nella direzione del movimento ad ogni passo.

Dopo aver eseguito il numero desiderato di passaggi. Probabilmente 5-10 sono molti. Tutte le tessere in cui non sono presenti piastre devono essere eliminate al livello più basso esistente.

Grande o piccolo?

Questa mappa può essere utilizzata così com'è o può essere espansa per creare una mappa molto più grande suddividendola in blocchi di piastrelle 4X4 (celle) ed espandendo quelle sezioni in base alle loro singole elevazioni. Tratta l'elevazione di ogni cella come un punto e crea una gradazione uniforme nella mappa più grande tra quei punti. Quindi, se la mappa più grande è 40X40 anziché 4X4, e il punto (0,0) era 10 e il punto (0,1) era 1, le tessere sulla mappa più grande tra di loro sarebbero 10,9,8,7,6 , 5,4,3,2,1 di altezza. È possibile aggiungere ulteriore rumore Perlin per smussare le pendenze. Nel complesso questa tecnica di ridimensionamento è simile all'algoritmo Diamond Square .

acqua

Simulare fiumi e laghi, oceani e falde acquifere. Preferisco usare gli automi cellulari .

Le altezze diventano float o range int estesi per consentire un tracciamento più fine. Le celle d'acqua hanno valori di saturazione, diciamo nell'intervallo 1-256. Le mappe dovrebbero iniziare in modo uniforme. Dovrai giocare con i numeri per le dimensioni delle tue singole mappe, tuttavia generalmente seguirai regole come queste:

  • Se una cella vicina è più satura, aumenta la saturazione e aumenta l'altezza.
  • Se una cella vicina è meno satura, diminuisci la saturazione e perde altezza.

Fai questo controllo per ogni cella vicina. Esegui un numero sufficiente di passaggi. Se lo desideri, puoi aggiungere la temperatura a questa simulazione modificando la quantità di saturazione persa / guadagnata di quella temperatura. Puoi anche cambiarlo in base all'elevazione. Dovrebbero formarsi laghi e fiumi naturali. Alcuni cadranno nell'oceano. (L'oceano probabilmente non si riempirà di alcuna metrica, ma designerai qualsiasi cosa sotto il livello del mare da riempire comunque alla fine dell'acqua).

È possibile conservare i dati di temperatura e saturazione da utilizzare, come nelle altre risposte, per creare biomi. Dovrebbero essere MOLTO più precisi e interessanti. Con biomi nevosi ai poli e caldi nel mezzo (se si utilizza un elenco graduale graduale di temperature).

Puoi anche simulare il vento, e quindi i cambiamenti di temperatura in base alle quote. È possibile spostarsi avanti e indietro tra l'esecuzione della simulazione della temperatura e la simulazione dell'acqua, se lo si desidera. Tuttavia, non ho creato nulla usando i cambiamenti di temperatura, quindi non commenterò come farlo.

Paesaggi in evoluzione

Se si mantengono in giro le simulazioni di terra, acqua e calore e si riducono drasticamente i loro effetti e si interrompe anche il movimento delle piastre, è possibile continuare a modificare tutte queste metriche nel tempo. Non eseguirò i calcoli molto spesso, ma puoi ottenere una mappa del mondo che risponde ai cambiamenti in questo modo.

Conclusione

Mentre questi tipi di tecniche sono molto più coinvolti, producono effetti molto più realistici e in evoluzione. Prendilo per quello che vale?


15

Puoi usare Perlin Noise per la generazione del terreno, ecco come funzionano i biomi in Minecraft. Come puoi vedere usa una mappa di calore in combinazione con una mappa di pioggia per creare i biomi.

Biomi da Minecraft

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.