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.