Come faccio a muovere un'entità in una direzione?


11

Ho Entityun'istanza che viene aggiornata ad ogni tick di gioco. Supponiamo che l'entità si muova costantemente in avanti. Vorrei poter dare l'angolo dell'entità a una funzione che la fa muovere in quella direzione:

moveForward(90);dovrebbe farli spostare a destra. Se ho dichiarato la mia rotazione come globale int, allora lo faccio

moveForward(rotation);
rotation++;

gli farebbe tracciare un piccolo cerchio con il suo movimento.

Come posso fare questo? Presumo che ciò implichi la matematica vettoriale; Non ne conosco nessuno, quindi una breve spiegazione sarebbe utile.

Risposte:


16

Beh, nel senso più semplice hai qualcosa del genere.

   y  |\
      | \
   m  |  \         s
   o  |   \        p
   v  |(a) \       e
(y)e  |angle\      e
   m  |      \     d
   e  |       \
   n  |        \
   t  |         \
      |__________\
      x movement
        (x)

La velocità è comunque alta quanto il nemico è, e puoi determinare di quanto devono muoversi nella direzione x e di quanto si muovono nella direzione y prendendo il peccato o il cos dell'angolo e moltiplicando per la velocità. Perché...

 sin(a) = x / speed

Così:

 x = speed * sin(a)

E:

cos(a) = y / speed

Così:

y = speed * cos(a)

Nel tuo esempio moveForward(90)produrrebbe speed * sin(90)o speed * 1nella direzione xe speed * cos(90)o 0nella direzione Y (Si dovrebbe spostarsi a destra come specificato). Questo dovrebbe iniziare nel senso fondamentale.

Rendendolo generale:

moveForward(float angle)
{
    x += speed * sin(angle);
    y += speed * cos(angle);
}

Ahh, è molto più semplice di quanto immaginassi, grazie mille :)
Shaun Wild

Sono abbastanza sicuro che devi cambiare y e x. sin (alfa) = b / c.
jcora,

@Bane corrisponde al disegno che ho fatto SOH-CAH-TOA, il peccato è opposto rispetto all'ipotenusa che nel disegno è x / speed. Se l'angolo fosse dall'altra parte del triangolo sarebbe invertito (e se fosse più pratico ai fini della progettazione del gioco, potrei cambiarlo, ma mi sento tutto arbitrario).
Kevin DiTraglia,

Sono sul mio cellulare, quindi è stato piuttosto difficile interpretarlo. Ho appena sfiorato le formule ...
jcora,

È davvero un bel triangolo che ci sei arrivato. +1
Fr. Kevin D.,

3

L'altra risposta è sbagliata fin d'ora, per spostarsi correttamente lungo un piano in base a una rotazione si procede come segue:

posX += Math.cos(rotation) *  forwardSpeed + Math.sin(rotation) * strafeSpeed;
posY -= -Math.cos(rotation) * strafeSpeed + Math.sin(rotation) * forwardSpeed;

Tuttavia, ti consiglio di creare una variabile per cos / sin che aggiorni solo quando la rotazione cambia, quindi non la stai calcolando 4 volte per tick.

StrafeSpeed ​​si sposterà da un lato all'altro, forwardSpeed ​​per avanzare lungo la rotazione.

edit: tesselode fa la stessa cosa, tranne per il fatto che non ha movimenti da un lato all'altro.


2

Hai detto tick di aggiornamento, quindi suppongo che tu non abbia un frame rate variabile. Se è così:

x + = speed * math.cos (angolo)

y + = velocità * math.sin (angolo)

Se stai usando un frame rate variabile, devi anche moltiplicare per delta time.

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.