Modo corretto per "casualmente" generare terreno scorrevole


9

Sto creando un semplice gioco RTS top down. Ho in programma di generare "casualmente" mappe al volo quando ne ho bisogno. Ho in programma tutto lavorando su "passaggi":

  1. Riempi il terreno con tutta l'erba
  2. Torna indietro e aggiungi alcuni spruzzi casuali di ghiaia
  3. Completa la ghiaia
  4. Disegna Mountain Landscape sul secondo strato
  5. Completa le montagne
  6. ecc ecc.

Ora dai un'occhiata a questa immagine qui sotto:

inserisci qui la descrizione dell'immagine

L'ho creato a mano usando il mio editor di mappe, ma ho in programma che questo sia fondamentalmente il risultato dopo aver sperato di passare / passaggio 3.

Come dovrei decidere quando e dove posizionare la mia ghiaia in modo che sia almeno irregolare e abbastanza sporadica da sembrare naturale?

Grazie se puoi! Qualsiasi aiuto è apprezzato!

Come nota a margine:

In pratica, ogni passaggio è che sto ripetendo tutte le mie tessere (la mappa è divisa in tessere 40x40) simile a questa:

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

Risposte:


5

Puoi giocare con Perlin Noise ( vedi la mia risposta StackOverflow per un'implementazione ), per generare una mappa di altezza. Dalla mappa di altezza, è possibile mappare determinati intervalli di altezza su tessere diverse. Qualcosa di simile a:

  • Top 20% di neve
  • Prossimo 20% di ghiaia
  • Prossimo 40% di erba
  • Ultimo 20% di acqua

Dovrai giocare con i valori del generatore di rumore Perlin per ottenere un terreno che può essere generato e avere un bell'aspetto.


5

Come altri hanno già detto, il rumore del perlin dovrebbe essere una buona fonte di dati per decidere dove posizionare diversi tipi di piastrelle. Vorrei integrare quell'idea e collegare due risorse aggiuntive che dovrebbero essere utili con il terzo passo nella tua lista di controllo - arrotondare gli angoli .

Questo è un processo chiamato auto-piastrellatura e non è poi così difficile da implementare. Esistono molti modi diversi per farlo, ma la maggior parte di essi si basa sul calcolo delle informazioni di adiacenza per ogni riquadro al fine di decidere quale elemento grafico deve essere disegnato in quella posizione.

Un modo molto elegante per risolvere questo problema è assegnare un valore di bandiera univoco a ciascuna direzione di tessera adiacente e disporre il proprio spritehseet in modo tale che il valore ottenuto sommando tutte le bandiere adiacenti di una tessera corrisponda alla posizione corretta del tessera nel foglio di calcolo. Leggi questo articolo per una descrizione molto chiara della tecnica.

Ed ecco un'altra risorsa che descrive un'altra variante della tecnica.


Ehi, solo per farti sapere, la tua risposta è stata estremamente utile fino a arrotondare gli angoli. Grazie mille :) In realtà tutto ora funziona (anche gli angoli arrotondati)!
Freesnöw,

4

In sostanza, puoi utilizzare la generazione del rumore Perlin per generare le tue mappe. Dovresti campionare la mappa di altezza generata e assegnare blocchi di ghiaia a parti della mappa che hanno sopra una certa altezza.

Ecco un eccellente post di riferimento su come implementare un tale sistema e diversi tipi di terreno che potresti generare.

Gli esempi hanno molti più passaggi del necessario, ma il concetto è lo stesso.

Altro su gen di tipo Minecraft

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

inserisci qui la descrizione dell'immagine

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.