Come posso generare casualmente terreno di scorrimento laterale basato su piastrelle 2D?


11

Voglio generare casualmente una mappa per un gioco a scorrimento laterale 2D usando il seguente set di tessere: inserisci qui la descrizione dell'immagine

Ho trovato alcuni grandi articoli sul processo di bitmasking, ad esempio: http://www.angryfishstudios.com/2011/04/adventures-in-bitmasking/ http://www.saltgames.com/2010/a-bitwise -Metodo-tilemaps per-applicazione-/

Mi piace l'idea di usare una maschera di bit / piastrella invece di fare un'enorme clausola if o un'istruzione switch.

Tuttavia, ho problemi a visualizzare l'intero processo e nessuno di questi articoli parla di randomizzazione.

Le mie piastrelle si incastrano in più modi diversi, non solo in un modo come sembrano le piastrelle negli esempi che ho collegato.

Ad esempio, ecco solo alcuni esempi:

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Dato che le mie piastrelle si incastrano in molti modi diversi, non penso che una maschera a 8 bit funzionerà. Pertanto, stavo pensando di usare una maschera di bit più grande. Qualcosa come char [8] o char 4 .

Se qualcuno potesse mostrare alcuni pseudocodici / esempi di come apparirebbe l'algoritmo generale, lo apprezzerei molto.

Risposte:


3

Sì, la dimensione della maschera aumenterebbe con l'aumentare del numero di opzioni: il tuo link http://www.saltgames.com/2010/a-bitwise-method-for-applying-tilemaps/ seconda parte spiega l'idea principale.

In sostanza, dovresti enumerare X possibilità per ogni "bordo" tra le tessere; nel tuo esempio particolare sembra che la "parte superiore / inferiore della piastrella" possa essere (1) bianca (2) coperta o (3) semicoperta - che coincide casualmente con l'esempio "trinario" riportato nell'articolo.

Ma le maschere ti aiuterebbero solo a limitare le possibilità delle tessere a quelle che possono essere disegnate, di per sé non è un metodo che mostra come generare le mappe effettive in modo sensato.

Il tuo particolare set di tessere in realtà è piuttosto restrittivo: descrive solo una singola superficie che sale / scende e in qualsiasi punto di partenza a "livello intero" hai solo poche scelte valide. Ad esempio, dopo la tessera # 2 sono possibili solo le tessere # 1 o # 8. Potresti semplicemente spostarti da sinistra a destra, facendo un elenco di quali (poche) tessere possono venire dopo la tessera precedente e scegliendo casualmente una di esse.


Penso che questa sia la risposta che sto cercando, tuttavia è ancora un po 'nuvoloso. Puoi ottenere un po 'più di dettagli, in testo o pseudocodice, su come funzionerebbe l'ultima parte della tua spiegazione? "Potresti semplicemente spostarti da sinistra a destra, facendo un elenco di quali (poche) tessere possono venire dopo la tessera precedente e scegliendone una a caso."
erebel55,

1
Per ogni tipo di tessera, fai un elenco di quali tessere sono consentite dopo: ci sono così poche tessere che possono essere fatte rapidamente manualmente. L'altezza cambierà, riempi tutto sotto la nuova tessera con # 10s.
Peteris,

Ah, allora stai dicendo di usare questo metodo invece del bitmasking?
erebel55,

1
Sì, il bitmasking è utile se tutto il contenuto 2d è significativo, ma le tue mappe sembrano essere a livello singolo, una superficie orizzontale di altezza variabile.
Peteris,

Questo ha senso, le "montagne" saranno di varie altezze e scorreranno l'una nell'altra. Quindi essenzialmente sarà una montagna continua a cambiare altezze man mano che avanzi. Un po 'come un'onda coseno / seno che ha magnitudini casuali in punti diversi. Devo spostarmi da sinistra a destra o dall'alto verso il basso durante la generazione della mappa?
erebel55,

6

Hai mai pensato di utilizzare una funzione Perlin 1D o simplex? I vantaggi sono numerosi, tra cui:

  1. Infinito (nel regno della precisione in virgola mobile), terreno non ripetitivo

  2. Può essere generato in tempo reale (anche in uno shader, che è veloce ) o in anticipo e archiviato in trame, come nel tuo esempio

  3. I bordi si abbinano automaticamente poiché sia ​​Perlin che simplex sono continui.

  4. Sebbene il terreno stesso sia pseudo-casuale, è abbastanza facile applicare una funzione di inviluppo o semplicemente ridurre il numero di ottave in aree in cui sono necessarie aree piane o altre caratteristiche del terreno specifiche di cui hai bisogno.

Vedi questo link per una spiegazione abbastanza approfondita dell'implementazione di 1D Perlin.

Una busta è fondamentalmente un campo scalare o una funzione che viene moltiplicata per la funzione noise prima di salvare o visualizzare l'output.

inserisci qui la descrizione dell'immagine

(Immagine iniziale presa in prestito dall'articolo di cui sopra.)

In questo esempio, la linea rossa rappresenta una funzione a tratti definita come

x < 0.3 : y = (0.3-x)/0.3)
x < 0.5 : 0
x < 0.7 : (x - 0.5) / 0.2
else    : 1

... che può essere meglio definito usando una funzione regolare. In questo caso, ridimensiona le cose fino a 0 prima dell'altopiano, quindi esegue il backup di 1 in seguito.

Aggiornare

Ecco un esempio di "terreno" 3D simplex da uno dei miei progetti, con l'illuminazione diffusa + speculare applicata, generata interamente all'interno di un tubo shader vert + tess + frag. Per la tua situazione, ne toglierei una fetta verticale per ottenere la pendenza del terreno.

inserisci qui la descrizione dell'immagine

E una vista ortografica dall'alto verso il basso:

inserisci qui la descrizione dell'immagine


Questa è una tecnica per generare le stesse immagini di piastrelle stesse?
erebel55,

1
@ erebel55 Sì. Puoi usare una funzione 2D per decidere dove (in base al tuo esempio) mettere diversi figli di piante all'interno dell'immagine e anche per generare il terreno in pendenza. L'ho usato in 3D con grandi risultati.
3Daveva il

Sembra un metodo interessante, non sono sicuro di voler percorrere questa strada poiché ho già creato le mie immagini.
erebel55,

@ erebel55 sì, nessun motivo per lanciare roba esistente se funziona per te.
3Daveva il

Beh, non ho ancora fatto funzionare la generazione casuale, ma spero di;) Ti ho dato un voto positivo per questo metodo pensato, poiché era interessante e potrei usarlo un po 'di tempo in futuro. Grazie
erebel55,
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.