Seguire un percorso in modo fluido


9

Attualmente sto realizzando un gioco di difesa della torre 2d con una corsia statica e predeterminata che i nemici seguono (cioè le torri non possono bloccare il percorso e la ricerca del percorso non è il problema che sto cercando di risolvere).

Sto cercando di capire come far sì che le unità seguano questa corsia in modo fluido . Ho due idee approssimative su come farlo, ma mi piacerebbe qualche input su quale sia probabilmente più facile da implementare / la tecnica più standard. O ovviamente se avessi un modo totalmente diverso che non ho preso in considerazione, mi piacerebbe anche saperlo.

Waypoint: la mia prima idea è stata quella di definire il percorso come una serie di waypoint codificati. Le unità userebbero quindi un algoritmo di base "cercare" di guida (come questo ) per spostarsi su ciascun waypoint lungo il percorso in successione. Tuttavia, mi sono chiesto se potrebbe essere difficile impedire alle unità di deviare troppo dalla corsia che voglio che seguano. Mi chiedo se l'incapacità di girare abbastanza bruscamente potrebbe indurli a "scivolare" fuori dalla corsia desiderata. Immagino che potrei essere in grado di impedirlo, sebbene consentendo l'applicazione di una forza di governo relativamente forte?

Curve di Bezier: la seconda soluzione che ho considerato è quella di definire il percorso con una curva di Bezier e ad ogni passo il calcolo del punto lungo la curva è (dt * velocità) lontano dalla posizione corrente dell'unità. Sospetto che questa tecnica renderebbe molto più semplice definire con precisione il percorso che le unità seguiranno, ma non so esattamente come procedere per implementarlo. Eventuali suggerimenti?

Inoltre, ciò non cambierà le risposte di nessuno, ma anche le unità devono poter viaggiare a velocità costante lungo il percorso. Inoltre, sto programmando questo gioco in Python usando il framework Pyglet.

Se qualcosa sulla domanda non è chiaro, per favore fatemelo sapere.

Modifica: Anche per quanto valga, sto cercando di replicare il comportamento di movimento dei nemici nella Rush del Regno .


Rilevante: gamasutra.com/view/feature/131505/… Che tipo di densità / dimensione dell'unità rispetto alle tessere stai usando?
scimmia,

Dò un'occhiata a quell'articolo! In realtà non sto usando tessere, ma solo coordinate continue per designare la posizione. Ci sarà solo un'immagine di sfondo statica che mostra al giocatore dove si sposteranno le unità.
Pwnosaurus,

Ho anche trovato. gamedev.stackexchange.com/questions/26543/… A * funziona su mappe non grid. Potrebbe essere un percorso del nodo nel regno che si curva in modo simile.
scimmia

C'è qualcosa che può far sì che i nemici abbandonino il sentiero e debbano tornare ad esso? Lo chiedo perché la tua proposta sulla curva di Bezier suggerisce che non esiste, nel qual caso non c'è motivo per cui non puoi precompilare i dati arbitrari sull'intero percorso e non è necessaria alcuna logica "AI".
Kevin Reid,

Risposte:


8

Consentitemi di presentarvi il famoso articolo di Craig Reynolds su Steering Behaviors For Autonomous Character . Se non l'hai letto, dovresti, ti aiuterà a riflettere su questo tipo di problemi, in particolare dai un'occhiata alla sezione sul pathfinding .

inserisci qui la descrizione dell'immagine

L'idea del documento di Reynolds è che è possibile utilizzare forze semplici che si combinano per produrre una navigazione realistica e improvvisativa nell'ambiente. I movimenti non si basano sulla pianificazione del percorso o sui calcoli globali, ma utilizzano invece informazioni locali, come le forze dei vicini, che li rendono semplici da comprendere e implementare, ma producono comunque schemi di movimento molto complessi.

Il bello dell'approccio è che puoi combinare insieme molti comportamenti. Quindi, ad esempio, i tuoi personaggi possono avere sia un comportamento di ricerca del percorso sia un comportamento di separazione (per evitare che si aggreghino troppo), che possono essere combinati come somma ponderata.

Un altro vantaggio dell'uso dei comportamenti di guida è che esistono diverse implementazioni open source esistenti in una varietà di lingue (ad es. Opensteer ).


AGGIORNAMENTO: ho dato un'occhiata a Kingdom Rush, e penso che potrei aver frainteso ciò che intendevi per "senza intoppi". Ho pensato che significasse più realistico, ma penso che quello che cerchi sia più come se i personaggi fossero su un binario del treno. Inoltre, leggendo più attentamente, vedo che uno dei tuoi requisiti è che "le unità devono essere in grado di viaggiare a velocità costante lungo il percorso". I comportamenti di guida non ti daranno una velocità costante di movimento, ma lo faranno semplici indicazioni stradali combinate con waypoint. (Vale a dire, non usare il comportamento "cerca" per raggiungere il waypoint, invece è sufficiente determinare il vettore di direzione e far spostare l'unità alla massima velocità verso quel waypoint.) Utilizzare più waypoint per rendere più uniforme la rotta.


2

La soluzione in questo articolo Gamasutra potrebbe essere quello che stai cercando. L'idea di base è quella di proiettare i raggi su un waypoint che è due passi avanti rispetto al waypoint attuale "facendo un passo" il raggio di una frazione della lunghezza di una cella e ad ogni "passo" del raggio controllando se il volume di collisione del giocatore si scontra con qualcosa nella posizione a gradino del raggio. Se il raggio arriva fino al waypoint che è due passi avanti, allora puoi sbarazzarti del waypoint intermedio. puoi quindi continuare lo stesso processo fino al waypoint "obiettivo" ... quindi se il tuo percorso può essere realizzato da una linea retta verso l'obiettivo, una linea retta verso l'obiettivo è la rotta che il tuo personaggio prenderà. ecco l'articolo: http://www.gamasutra.com/view/feature/131505/toward_more_realistic_pathfinding.

Contiene anche grandi cose sul raggio di sterzata e comportamenti di svolta più naturali e simili ...

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.