Finora abbiamo esaminato i comportamenti di ricerca, fuga, arrivo e vagabondaggio. In questo tutorial, tratterò il ricerca e il eludere comportamenti che fanno seguire o evitare il bersaglio ai tuoi personaggi.
Nota: Sebbene questo tutorial sia scritto usando AS3 e Flash, dovresti essere in grado di utilizzare le stesse tecniche e concetti in quasi tutti gli ambienti di sviluppo di giochi. Devi avere una conoscenza di base dei vettori di matematica.
Una ricerca è il processo di seguire un obiettivo che mira a prenderla. È importante notare che la parola "cattura" fa la differenza qui. Se qualcosa sta solo seguendo un bersaglio, tutto ciò che deve fare è ripetere i movimenti del bersaglio e, di conseguenza, sarà sul suo percorso.
Quando insegue qualcosa, l'inseguitore deve seguire l'obiettivo, ma deve anche prevedere dove sarà l'obiettivo nel prossimo futuro. Se è possibile prevedere (o stimare) dove sarà il target entro pochi secondi, è possibile regolare la traiettoria corrente per evitare rotte non necessarie:
Come descritto nei primi tutorial, il movimento viene calcolato utilizzando l'integrazione di Eulero:
posizione = posizione + velocità
Come diretta conseguenza, se la posizione e la velocità del personaggio corrente sono note, è possibile prevedere dove si troverà entro il prossimo T
aggiornamenti di gioco. Supponendo che il personaggio si muova in linea retta e la posizione che vogliamo prevedere è tre aggiornamenti in anticipo (T = 3
), la posizione futura del personaggio sarà:
posizione = posizione + velocità * T
La chiave per una buona previsione è il giusto valore per T
. Se il valore è troppo alto, significa che l'inseguitore finirà per inseguire un fantasma. Se T
è troppo vicino allo zero, significa che l'inseguitore non sta effettivamente perseguendo l'obiettivo, ma lo sta solo seguendo (nessuna previsione).
Se la previsione viene calcolata per ogni frame di gioco, funziona anche se il target cambia costantemente direzione. Ogni aggiornamento di una nuova "posizione futura" viene generato in base al vettore di velocità corrente del personaggio (che guida anche la direzione del movimento).
Il comportamento di inseguimento funziona più o meno allo stesso modo di cercare, l'unica differenza è che l'inseguitore non cercherà l'obiettivo stesso, ma la sua posizione nel prossimo futuro.
Supponendo che ogni personaggio nel gioco sia rappresentato da una classe chiamata Boid
, il seguente pseudo-codice implementa l'idea di base dietro il comportamento di inseguimento:
ricerca di funzioni pubbliche (t: Boid): Vector3D T: int = 3; futurePosition: Vector3D = t.position + t.velocity * T; return seek (futurePosition);
Dopo il calcolo della forza di inseguimento, deve essere aggiunto al vettore di velocità proprio come tutte le precedenti forze di governo:
aggiornamento della funzione pubblica (): void steering = inseguimento (obiettivo) direzione = troncato (sterzo, max_force) governo = sterzo / velocità di massa = troncato (velocità + sterzata, max_speed) posizione = posizione + velocità
La figura seguente illustra il processo:
L'inseguitore (il personaggio in basso) cercherà la posizione futura del bersaglio, seguendo una traiettoria descritta dalla curva arancione. Il risultato finale sarà:
Il comportamento inseguimento usando T = 30
. Fare clic sulla demo per mostrare i vettori di forza. L'obiettivo cerca il mouse.
C'è un problema quando il valore di T
è costante: la precisione dell'inseguimento tende ad essere scarsa quando l'obiettivo è vicino. Questo perché quando l'obiettivo è vicino, l'inseguitore continuerà a cercare la predizione della posizione del bersaglio, che è T
cornici "via".
Questo comportamento non avverrebbe mai in una vera ricerca perché l'inseguitore saprebbe che è abbastanza vicino all'obiettivo e dovrebbe smettere di prevedere la sua posizione.
C'è un semplice trucco che può essere implementato per evitarlo e migliorare drasticamente la precisione dell'inseguimento. L'idea è molto semplice; invece di un valore costante per T
, uno dinamico è usato:
T = distanceBetweenTargetAndPursuer / MAX_VELOCITY
Il nuovo T
è calcolato in base alla distanza tra i due personaggi e alla velocità massima raggiungibile dal target. In parole semplici, il nuovo T
si intende "quanti aggiornamenti l'obiettivo ha bisogno di passare dalla sua posizione attuale alla posizione di inseguitore".
Più lunga è la distanza, maggiore è la distanza T
lo sarà, quindi l'inseguitore cercherà un punto molto più avanti rispetto all'obiettivo. Più breve è la distanza, più basso T
sarà, nel senso che cercherà un punto molto vicino al bersaglio. Il nuovo codice per tale implementazione è:
ricerca della funzione pubblica (t: Boid): Vector3D var distance: Vector3D = t.position - position; var T: int = distance.length / MAX_VELOCITY; futurePosition: Vector3D = t.position + t.velocity * T; return seek (futurePosition);
Il risultato finale è:
Il comportamento inseguimento usando una dinamica T
. Fare clic sulla demo per mostrare i vettori di forza. L'obiettivo cerca il mouse.
Il comportamento di eludere è l'opposto del comportamento di inseguimento. Invece di cercare la posizione futura del bersaglio, nel comportamento di eludere il personaggio fuggirà da quella posizione:
Il codice per evadere è quasi identico, solo l'ultima riga è cambiata:
public function evade (t: Boid): Vector3D var distance: Vector3D = t.position - position; var updatesAhead: int = distance.length / MAX_VELOCITY; futurePosition: Vector3D = t.position + t.velocity * updatesAhead; return flee (futurePosition);
Il risultato finale è il seguente:
Questo tutorial descrive l'inseguimento e il comportamento di eludere, che sono grandiosi per simulare una varietà di modelli, come un gruppo di animali che cercano di fuggire da un cacciatore.
Spero che tu abbia apprezzato questi suggerimenti finora e possa iniziare a utilizzare tutti quei comportamenti, combinandoli per creare modelli ancora migliori! Tieniti aggiornato seguendoci su Twitter, Facebook o Google+.