Requisiti
- Volete percorsi multipli da A a B.
- Volete lavorare nello spazio della griglia, presumibilmente questo è lo spazio delle piastrelle per il vostro scroller laterale.
- Non vuoi attraversare percorsi o rovinerà la progressione del gioco.
- Volete che i percorsi sembrino ragionevolmente organici.
Diagrammi di Voronoi
I diagrammi di Voronoi sono grafici planari che riempiono lo spazio:
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 n
coordinate 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ì:
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 n
punti 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:
È 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.