Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Procedural Content Generation

Creare un sistema di Dungeon a caverne precedurale

by
Difficulty:IntermediateLength:LongLanguages:

Italian (Italiano) translation by Chip (you can also view the original English article)

Per molti, la generazione procedurale è un concetto magico che è appena fuori dalla loro portata. Solo i veterani dello sviluppo di giochi sanno come costruire un gioco che può creare i propri livelli ... giusto? Può sembrare magia, ma la PCG (generazione di contenuti procedurali) può essere appresa dagli sviluppatori principianti di giochi. In questo tutorial, vi mostrerò come generare proceduralmente un sistema di grotte per dungeon.


Che cosa andremo a vedere

Ecco una demo SWF che mostra il tipico aspetto di un livello che questa tecnica può generare:


Fare clic sul file SWF per generare un nuovo livello.

Imparare le basi di solito significa un sacco di ricerche su Google e sperimentazione. Il problema è che ci sono pochissime semplici guide su come iniziare. Per avere un riferimento, ecco alcune ottime fonti di informazione su questo argomento che ho studiato:

Prima di entrare nei dettagli, è una buona idea prendere in considerazione come stiamo per risolvere il nostro problema. Qui ci sono alcuni pezzi facili da assimilare che useremo per mantenere questa cosa semplice:

  1. Casualmente inserire il contenuto creato nel mondo del gioco.
  2. Verificare che si trovi in un posto che ha un senso.
  3. Verificare che il contenuto sia raggiungibile dal giocatore.
  4. Ripetere questi passaggi fino a quando il vostro livello viene creato piacevolmente.

Una volta che avremo lavorato attraverso i successivi esempi, dovreste avere le competenze necessarie per sperimentare il PCG nei vostri giochi. Emozionante, eh?


Dove piazziamo i contenuti del gioco?

La prima cosa che ci accingiamo a fare è posizionare casualmente le stanze di un livello sotterraneo generate proceduralmente.

Per capire meglio è una buona idea avere una conoscenza di base di come funzionano le mappe di tile. Nel caso abbiate bisogno di una rapida panoramica oppure un ripasso, controlla questo tutorial di tile map. (E' basata su Flash, ma, anche se non si ha familiarità con Flash, è sempre buona per comprendere l'essenza delle mappe tile.)

Creazione di una stanza da collocare nel vostro livelleo Dungeon

Prima di iniziare dobbiamo riempire la mappa con le tile. Tutto quello che dovete fare è iterare in ogni punto nella mappa (idealmente una matrice 2D) e posizionare la tile.

Abbiamo anche bisogno di convertire le coordinate dei pixel di ogni rettangolo nelle coordinate della nostra griglia. Per passare dalla coordinata pixel alla posizione della griglia, dividete la coordinata pixel per la larghezza della tile. Per passare dalla coordinata griglia a quella pixel, moltiplicate la coordinata della griglia per la larghezza della tile.

Per esempio, se vogliamo mettere nell'angolo in alto a sinistra della nostra stanza a (5, 8) sulla nostra griglia e abbiamo una larghezza delle tile di 8 pixel, avremmo bisogno di mettere quell'angolo a (5 * 8, 8 8 *) o (40, 64) in coordinate pixel.

Creiamo una classe Room; che potrebbe apparire così in codice Haxe:

Abbiamo i valori della larghezza di ogni stanza, altezza, posizione punto centrale, e le posizioni dei quattro angoli, ed una funzione che ci dice se questa stanza si interseca con un'altra. Si noti inoltre che tutto, tranne per i valori x e y è espresso con valori del sistema di coordinate della griglia. Questo perché rende tutto più facile se si accede a piccoli numeri ogni volta che usiamo i valori ambientali.

Ok, abbiamo il riquadro di ciascuna stanza piazzata. Ora come facciamo proceduralmente a generare e piazzare una stanza? Bene, grazie al generatore di numeri casuali interno, questa parte non è troppo difficile.

Tutto quello che dobbiamo fare è fornire valori casuali di x e y per la nostra stanza entro i limiti della mappa, e dare valori di larghezza e altezza sempre casuali in un intervallo prestabilito.

procedural-content-room-placement

Ha senso il posizionamento cauale?

Dal momento che stiamo usando posizioni e dimensioni casuali per le nostre stanze, siamo costretti a sovrapporci con stanze già create mentre riempiamo il dungeon. Beh, abbiamo già creato un semplice metodo intersects() per occuparci di questo problema.

Ogni volta che tentiamo di collocare una nuova camera, dobbiamo semplicemente chiamata intersects() su ciascuna coppia di stanze su tutta la lista. Questa funzione restituisce un valore booleano: true se le stanze sono sovrapposte e false altrimenti. Possiamo usare questo valore per decidere cosa fare con la stanza che abbiamo appena cercato di piazzare.

procedural-content-intersection-diagram
Andiamo a rivedere la funzione intersects(). Si può vedere come i valori x e y si sovrappongono e restituiscono true.

La chiave qui è il boleano failed; è impostato dal valore di ritorno di intersects(), e quindi è true se (e solo se) le vostre stanze si sovrappongono. Una volta che interrompiamo il loop, controlliamo la variabile failed e, se è falsa, siamo in grado di scavare la nuova stanza. In caso contrario, abbiamo appena scartato la stanza e riproviamo finché non avremo raggiunto il massimo numero di stanze.


Come dovremmo gestire il contenuto non raggiungibile?

La stragrande maggioranza dei giochi che utilizzano la generazione procedurale dei contenuti si sforzano di generare il massimo raggiungibile dal giocatore, ma altri ritengono che questo non sia necessariamente la migliore decisione progettuale. E se tu avessi alcune stanze della prigione dove il giocatore potrebbe arrivare solo raramente, ma che potrebbe sempre vedere? Questo potrebbe aggiungere una dinamica interessante al vostro dungeon.

Naturalmente, non importa come la si pensa, probabilmente è sempre una buona idea fare in modo che il giocatore possa sempre progredire nel gioco. Sarebbe piuttosto frustrante avere un livello del dungeon con l'uscita completamente bloccata.

Considerando che la maggior parte dei giochi mira al 100% dei contenuti raggiungibili, non possiamo che attenerci a quello.

Gestiamo questa raggiungibilità

A questo punto, dovremmo avere una mappa di tile funzionante e dovremmo avere il codice capace di creare un numero variabile di stanze di varie dimensioni. Guardate; avete già alcune stanze del dungeon generate proceduralmente ed intelligentemente!

Ora l'obiettivo è quello di collegare ogni stanza in modo da poter camminare attraverso il nostro dungeon e alla fine raggiungere una uscita che porti al livello successivo. Possiamo realizzarlo scavando dei corridoi tra le stanze.

Avremo bisogno di aggiungere una variabile point al codice per tenere traccia del centro di ogni stanza creata. Ogni volta che creiamo e piazziamo una stanza, si determina il suo centro e lo colleghiamo al centro della stanza precedente.

Prima, implementiamo i corridoi:

Queste funzioni agiscono quasi nello stesso modo, ma una scava in orizzontale e l'altra in verticale.

procedural-content-corridor-diagram-1

Collegare la prima stanza alla seconda richiede un vCorridor e hCorridor.

Abbiamo bisogno di tre valori per far questo. Per i corridoi orizzontali abbiamo bisogno del valore iniziale x, del valore finale x e il valore y corrente. Per i corridoi verticali abbiamo bisogno dei valori di inizio e fine y con il valore corrente di x.

Dal momento che ci stiamo muovendo da sinistra a destra abbiamo bisogno dei due valori x corrispondenti, ma solo un valore y dato che non saremo in movimento su o giù. Quando ci muoviamo verticalmente avremo bisogno dei valori y. Nel ciclo for all'inizio di ogni funzione, iteriamo dal valore iniziale (x o y) al valore finale fino a scavare l'intero corridoio.

Ora che abbiamo il codice corridoio, possiamo cambiare la nostra funzione placeRooms() e chiamare le nostre nuove funzioni corridoio:

procedural-content-corridor-diagram-2

Nell'immagine qui sopra è possibile seguire la realizzazione del corridoio dalla prima alla quarta stanza: rosso, verde, poi blu. È possibile ottenere alcuni risultati interessanti a seconda del posizionamento delle stanze - per esempio, due corridoi uno accanto all'altro fanno un corridoio largo due.

Abbiamo aggiunto alcune variabili per il monitoraggio del centro di ogni stanza e abbiamo attaccato le stanze tra loro con i corridoi rispetto ai loro centri. Ora ci sono più stanze e corridoi non sovrapposti che mantengono l'intero livello sotterraneo collegato. Non male.

procedural-content-room-connection

Abbiamo finito con il nostro Dungeon, giusto?

Abbiamo fatto molta strada nel costruire il vostro primo livello dungeon generato proceduralmente, e spero che avrete capito che la PCG non è affatto una qualche bestia magica impossibile da domare.

Siamo andati dal posizionare in modo casuale i contenuti intorno al vostro livello dungeon con semplici generatori di numeri casuali e poi con pochi intervalli predeterminati per mantenere il vostro contenuto della giusta dimensione e nella giusta posizione. Poi, abbiamo scoperto un modo molto semplice per determinare se il vostro posizionamento casuale aveva un senso controllando le stanze sovrapposte. Infine, abbiamo parlato un po' sul merito di mantenere i nostri contenuti raggiungibili e abbiamo trovato un modo per garantire che il giocatore poesse raggiungere ogni stanza della vostro dungeon.

I primi tre dei quattro passi del nostro processo graduale sono finiti, il che significa che abbiamo gli elementi basilari che costruiscono un grande dungeon per il vostro prossimo gioco. Il passo finale è davanti a voi: è necessario iterare quello che avete imparato a creare più contenuti generati proceduralmente per una rigiocabilità infinita.

C'è sempre da imparare

Il metodo per scavare semplici livelli dungeon in questo tutorial graffia solo la superficie del PCG e ci sono altri semplici algoritmi che si possono facilmente raccogliere.

La mia sfida per voi è quella di iniziare a sperimentare con l'inizio del vostro gioco che avete creato qui e di fare qualche ricerca in più sui metodi per modificare i vostri dungeon.

Un ottimo metodo per la creazione di livelli di grotte è quello di usare gli automi cellulari, che hanno infinite possibilità di personalizzazione di livelli dungeon. Un altro ottimo metodo per imparare è il Partizionamento di Spazi Binario (BSP), che crea i livelli dei dungeon con un aspetto a griglia.

Spero che questo vi abbia fornito un buono spunto per iniziare con la generazione procedurale dei contenuti. Assicuratevi di fare commenti qua sotto con tutte le domande che avete, mi piacerebbe vedere alcuni esempi di ciò che state creando con la PCG.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.