Come prendere in considerazione la gravità quando si sposta l'IA


9

Sto realizzando un gioco 2D. Al momento c'è un elicottero in volo, controllato dal giocatore. È controllato usando i tasti freccia: SU, SINISTRA e DESTRA.

È la velocità lungo l'asse y dy, e la velocità lungo l'asse x è dx.

La sua fisica è la seguente:

Ogni volta che SU non viene premuto , dyaccelera in accelerazione costante, indefinitamente verso il basso. (Gravità). dxrimane nel suo valore attuale.

Quando si preme SU , dyaccelera in accelerazione costante da qualsiasi cosa sia attualmente, fino a 4 (verso l'alto, fino a raggiungere la velocità 4). dxrimane nel suo valore attuale.

Quando si preme SINISTRA , dxaccelera in accelerazione costante, da qualunque cosa sia attualmente, fino a -4 .

Quando si preme DESTRA , dx accelera in accelerazione costante, da qualunque cosa sia attualmente, fino a 4 .

(Quando si preme SINISTRA o DESTRA e SU non viene premuto contemporaneamente, come ho detto: dydiventa sempre più piccolo, perché la gravità influisce sull'elicottero)

Tutto ciò fa sì che l'elicottero segua spesso archi in aria, piuttosto che linee rette.

Questo crea fisica che sembra abbastanza realistica.

La mia domanda è:

L'elicottero avversario, un'intelligenza artificiale, dovrebbe muoversi usando lo stesso sistema fisico.

Diciamo che l'IA vuole arrivare da dove si trova attualmente, al punto B.

inserisci qui la descrizione dell'immagine

Se non ci fosse gravità e nessuna accelerazione graduale nel gioco, sarebbe facile. Disegnerei semplicemente un vettore dalla posizione dell'IA al punto B e farei in modo che l'IA lo seguisse.

Ma poiché c'è gravità e accelerazione graduale, l'IA non può mai muoversi in linea retta (quasi). quale sarebbe il modo migliore per portare l'IA al punto B, nel modo più efficiente possibile nel tempo?

Come posso prendere in considerazione la gravità quando si sposta l'IA verso una destinazione specifica?

(Se è più facile da spiegare, si prega di considerare il punto B sullo stesso livello sull'asse y dell'IA e non in diagonale rispetto ad esso.)

Grazie


Puoi disabilitare la fisica sull'intelligenza artificiale mentre è in movimento? In tal caso, è possibile disabilitarlo mentre si sta spostando verso il punto e abilitarlo quando lo raggiunge.
Zhafur,

@Zhafur Questo renderà irrealistico il movimento dell'IA, o almeno una differenza rispetto a come appare il movimento del giocatore. Voglio che il movimento dell'IA appaia uguale al movimento del giocatore.
user3150201

Risposte:


4

tl; dr:

TimeToStop.x = CurrentSpeed.x / Accelaration.x;

if (TimeToStop.x * CurrentSpeed.x >= 1.99 * DistanceFromTarget.x)
    slow_down_x(); // CurrentSpeed += Acc.x * direction;
else
    speed_up_towards_target_x(); // CurrentSpeed += Acc.x * direction;

Lo stesso con y. Ricorda di limitare la velocità in modo che sia compresa tra zero e la velocità massima. Se il nemico ha una velocità molto lenta ad un certo punto e sta cercando di fermarsi, potrebbe iniziare a muoversi nella direzione opposta. Non consentirlo. Fermalo se rallenta e la sua velocità è inferiore a 1 * Acc.

Versione lunga: se non ci sono ostacoli, il movimento sull'asse y è completamente irrilevante per (e non influenza) il movimento sull'asse x. Quindi la domanda che descrivi può essere suddivisa in due domande separate.

  1. Spostandoci sull'asse x
  2. E ci si sposta sull'asse y.

CS.xe CS.ysono la nostra velocità attuale sugli assi xey.

TS.x& TS.yÈ il tempo che ti ci vorrebbe fermare solo in verticale o in orizzontale considerando la tua velocità attuale nell'asse pertinente.

D.xe D.ysono la distanza su ciascun asse.

tl; dr: continui ad accelerare (se possibile [a meno che tu non abbia raggiunto la velocità massima]) sull'asse x fino a raggiungere un punto in cui è vera la seguente condizione:

if (TS.x * CS.x >= 1.99 * D.x) hit_the_breaks_on_x();

Lo stesso con y.


2

Un approccio che ho usato per un problema simile era prima disegnare un vettore sul bersaglio, quindi confrontarlo con la direzione della velocità corrente.

Quindi, prendi l'angolo segnato tra il vettore di velocità e il vettore di destinazione e applica una spinta relativa alla dimensione del vettore.

Pertanto, se l'angolo a tra il vettore di velocità rosso e il vettore di destinazione verde è negativo, applicare una spinta positiva, altrimenti non applicare alcuna spinta e lasciare che la gravità lo risolva.inserisci qui la descrizione dell'immagine

Nota che dovrai trattare i quattro quadranti in cui il bersaglio potrebbe essere in modo diverso (come se il bersaglio fosse stato nell'angolo in alto a sinistra un angolo positivo avrebbe richiesto l'applicazione della spinta).

Inoltre, assicurarsi di applicare la quantità di spinta relativa alla deviazione dalla velocità target.

Tecnicamente questo non sta prendendo in considerazione la gravità, sta compensando lo stato attuale e significa che l'elicottero AI potrebbe non volare in linea retta rispetto al bersaglio ma vacillerà un po '. Questo potrebbe non funzionare per il tuo gioco.


1
Grazie. Diverse domande al riguardo: 1- "... applica una spinta relativa alla dimensione del vettore " . Intendevi forse "dimensioni dell'angolo " ? 2- Per "angolo segnato" intendi positivo o negativo - giusto? In tal caso, un angolo è positivo se si trova sopra la linea marrone e negativo se è al di sotto della linea marrone. Giusto? 3- Se capisco correttamente, ciò che vuoi dire è: ogni fotogramma, ottieni l'angolo tra il vettore di velocità corrente e il vettore corrente rispetto al bersaglio. Quindi aggiungere / sottrarre da dx e dy di conseguenza. È corretto?
user3150201

@ user3150201 Sì sulla domanda dell'angolo. Sì sulla domanda firmata / non firmata, atan2 può darti l'angolo firmato tra due vettori. Sembra che tu abbia capito il mio punto, mi scuso se non sono stato chiaro.
nato il

1

Potresti semplicemente ricalcolare il movimento di ogni X frame. Supponendo che non si inseriscano troppi frame, ma abbastanza da non influire sulle prestazioni, la gravità su un elicottero non dovrebbe essere abbastanza forte da vedere davvero cambiare la traiettoria. Inoltre, penso che un giocatore potrebbe muoversi nello stesso modo, adattandosi alla gravità mentre si muove e non averlo pianificato.

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.