Come posso generare un percorso di prigione lineare (relativamente)?


8

Stiamo sviluppando un concetto per uno scroller laterale d'azione. Ciò di cui abbiamo bisogno è un modo per generare una mappa (relativamente) diritta. Con questo intendo qualcosa come ...

inserisci qui la descrizione dell'immagine

È chiaro che questa mappa segue un percorso semplice, anche se si discosta leggermente. Con ciò, implementeremo anche percorsi vaganti - scorciatoie o passaggi segreti. In modo che, forse, per passare dalla terza area cerchiata alla quarta, avresti il ​​percorso principale e un passaggio segreto che è pieno di nemici più forti, ma è più veloce e ha ricompense più elevate.

Qui abbiamo raggiunto un vicolo cieco. Stiamo esplorando alcune opzioni ma non abbiamo davvero fatto alcun progresso. Quale approccio possiamo usare per generare questo tipo di percorso Non siamo vincolati dai linguaggi di programmazione, poiché finora abbiamo sperimentato Java, C # e C ++. Allo stesso modo, non abbiamo dipendenze attuali su motori di gioco specifici.


11
Aggiungerei che non è chiaro quale sia il risultato finale che stai cercando. La "mappa" che mostri è una vista dall'alto verso il basso di una regione. Stai sviluppando uno scanner laterale 2D. Come sono correlati i 2?
Vaillancourt

Ho rimosso la frase "migliore" dalla tua domanda, in quanto non è davvero utile. Ho anche rimosso i tuoi tre approcci suggeriti, che sono tutte risposte potenzialmente valide. In genere è meglio se non includi potenziali soluzioni nella tua domanda poiché il confronto delle soluzioni fornite non è generalmente una query che consideriamo sull'argomento qui (ma chiedendo come risolvere il problema in assenza di qualsiasi pregiudizio di soluzione esistente di solito). Ho anche ripulito alcune delle chiacchiere sui commenti che ritengo siano state eliminate dalle modifiche.

1
Quella linea assomiglia quasi esattamente a quella che ho ottenuto quando ho iniziato con una linea retta e vi ho aggiunto del rumore perlin (o simplex) (diverse ottave). Potrebbe essere un'area da esplorare (stavo creando un tempo dinamico che variava il lampo)
Richard Tingle

Risposte:


15

Requisiti

  1. Volete percorsi multipli da A a B.
  2. Volete lavorare nello spazio della griglia, presumibilmente questo è lo spazio delle piastrelle per il vostro scroller laterale.
  3. Non vuoi attraversare percorsi o rovinerà la progressione del gioco.
  4. Volete che i percorsi sembrino ragionevolmente organici.

Diagrammi di Voronoi

I diagrammi di Voronoi sono grafici planari che riempiono lo spazio:

inserisci qui la descrizione dell'immagine

Una cosa bella di loro è come puoi usarli per creare percorsi organici. Se tracciate una linea retta da centro a centro, otterrete un percorso piuttosto imprevedibile (leggi: non ortogonale).

Come creare un diagramma Voronoi da utilizzare con un sistema basato su piastrelle

Crea una mappa di dimensioni ragionevoli, ad esempio 128x128. Genera ncoordinate della griglia casuali (x, y) nella mappa e popola ognuna con un ID / colore univoco. Crea un elenco per quel colore e aggiungi quella cella iniziale ad esso; fallo per ogni colore.

Ora hai questi punti di colore unicamente fluttuanti nel vuoto, ma devi creare intere isole di colore attorno a loro, con il risultato finale che appare così:

inserisci qui la descrizione dell'immagine

Per fare ciò dobbiamo vedere quale colore possiede ciascuna cella della mappa (cella = pixel nell'immagine sopra). Attraversiamo ogni cella della mappa, controllando quale dei nostri npunti di colore iniziale è più vicino ad essa (tramite pitagora). Quella cella entra nell'elenco associato a quell'id / colore univoco ... di seguito denominato celle isole Voronoi AKA (nel diagramma sopra, gruppi di pixel con lo stesso colore).

Ora dovresti avere un diagramma quantizzato di Voronoi. Il prossimo passo è analizzare l'adiacenza di ciascuna isola ad altre isole. Imposta un nodo semplice e una struttura dei bordi in modo da poter memorizzare un grafico (il nodo è solo l'id, l'elenco per quell'id e un elenco vuoto di bordi; edge è solo il nodo iniziale e finale). Per ogni isola identificata in modo univoco, creare un nodo e aggiungere bordi per collegarlo a ciascuna isola a cui è adiacente.

Una volta che hai il diagramma completo (grafico), arrivi alla parte divertente: usa il grafico per trovare catene di isole e facendo in modo che tutte le celle in ogni isola della catena abbiano lo stesso ID, stai scolpendo una delle i tuoi percorsi. Supponiamo che un'isola con tutte le celle con ID 503 sia situata accanto a un'isola con ID 657. Puoi sostituire tutte le 503 celle con un ID 657, creando così un'isola più grande di 657 adiacenti.

Ad esempio: il rosso è il percorso 1, il blu è il percorso 2, il magenta è entrambi:

inserisci qui la descrizione dell'immagine

È possibile utilizzare qualsiasi algoritmo grafico esistente (incluso A *) per generare i percorsi dall'inizio alla fine. Ottenere un percorso tortuoso è un caso di non usare sempre il passo ottimale verso l'isola obiettivo.

Infine, è banale restringere le isole se si desidera percorsi più stretti o utilizzare una mappa più grande con molte più isole per ottenere una risoluzione più fine.

Un passaggio finale facoltativo per l'individuazione del percorso

O puoi usare il grafico di alto livello che hai creato insieme alle celle / piastrelle sottostanti per eseguire il runtime A *, O puoi fare Hill climbing sulle celle / piastrelle sottostanti per un movimento migliore:

Al centro (o qualsiasi altra coordinata) della tua isola obiettivo, puoi posizionare una cella di influenza. Questa influenza può pompare "profumo" come in Collaborative Diffusion . Questo profumo si diffonderà lungo il percorso fino a quella che era l'isola di partenza, diventando sempre più debole man mano che procede. Ora per un'entità all'inizio, passiamo semplicemente da una cellula con un profumo più basso a una con un profumo più alto, ogni volta avvicinandoti all'obiettivo, nello stesso modo in cui un cane opera. Ogni percorso è approssimativamente lineare, ciò consente di evitare l'uso di A * in fase di esecuzione. Oppure puoi fare lo stesso con il grafico delle isole, ma in questo modo è un po 'più complesso perché probabilmente vorrai navigare le tue entità a livello di riquadro. Quindi il primo modo è forse migliore. In entrambi i casi ti consentirà di raggiungere l'obiettivo con costi di elaborazione bassi.


Ho creato un generatore di mappe usando Voronoi e Perlin Noise in Java, forse può esserti utile come punto di partenza: github.com/dragondgold/Map-Generator
Andres
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.