¿Cómo hago que una entidad se mueva en una dirección?

11

Tengo una Entityinstancia que se actualiza cada tic del juego. Asumamos que la entidad avanza constantemente. Me gustaría poder dar el ángulo de la entidad a una función que la haga moverse en esa dirección:

moveForward(90);debería hacer que se muevan hacia la derecha. Si declaro mi rotación como global int, entonces haciendo

moveForward(rotation);
rotation++;

lo haría trazar un pequeño círculo con su movimiento.

¿Cómo puedo hacer esto? Supongo que esto implica matemática vectorial; No sé ninguno, por lo que una breve explicación sería buena.

Shaun Wild
fuente

Respuestas:

16

Bueno, en el sentido más simple, tienes algo como esto.

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

Sin embargo, la velocidad es rápida que es el enemigo, y puede determinar cuánto deben moverse en la dirección xy cuánto se mueven en la dirección y tomando el pecado o cos del ángulo y multiplicándolo por la velocidad. Porque...

 sin(a) = x / speed

Entonces:

 x = speed * sin(a)

Y:

cos(a) = y / speed

Entonces:

y = speed * cos(a)

En su ejemplo moveForward(90)cedería speed * sin(90)o speed * 1en la dirección x y speed * cos(90)o0 en la dirección y (debería moverse hacia la derecha como especificó). Eso debería comenzar en el sentido básico.

Haciéndolo general:

moveForward(float angle)
{
    x += speed * sin(angle);
    y += speed * cos(angle);
}
Kevin DiTraglia
fuente
Ahh, eso es mucho más simple de lo que imaginaba, muchas gracias :)
Shaun Wild
Estoy bastante seguro de que necesita cambiar y's y x's. sin (alfa) = b / c.
jcora
@Bane coincide con el dibujo que hice SOH-CAH-TOA, el pecado es opuesto a la hipotenusa que en el dibujo es x / velocidad. Si el ángulo estuviera al otro lado del triángulo, se invertiría (y si eso es más práctico para el diseño del juego, podría cambiarlo, pero siento que todo es arbitrario).
Kevin DiTraglia
Estoy en mi teléfono móvil, así que fue bastante difícil de interpretar eso. Acabo de
leer
Ese es un triángulo muy bonito que tienes allí. +1
Bro Kevin D.
3

La otra respuesta es incorrecta a partir de ahora, para moverse correctamente a lo largo de un plano basado en una rotación, haga lo siguiente:

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

Sin embargo, recomendaría hacer una variable para cos / sin que actualice solo cuando cambie la rotación, por lo que no la calculará 4 veces por tic.

La strafeSpeed ​​se movería de lado a lado, la velocidad hacia adelante para avanzar a lo largo de su rotación.

editar: tesselode hace lo mismo excepto que no tiene movimiento de lado a lado.

teh8bits
fuente
2

Dijiste ticks de actualización, así que supongo que no tienes una velocidad de fotogramas variable. Si es así:

x + = velocidad * math.cos (ángulo)

y + = velocidad * math.sin (ángulo)

Si está utilizando una velocidad de fotogramas variable, también debe multiplicar por tiempo delta.

tesselode
fuente