Estoy haciendo un juego espacial simple en JavaScript, pero ahora me he topado con un muro con respecto a los vectores.
La vista del juego es de arriba hacia abajo en una cuadrícula 2D. Cuando el usuario hace clic en la cuadrícula, la nave espacial volará a ese lugar.
Entonces, si tengo dos conjuntos de puntos:
{ x : 100.2, y : 100.6 }; // the ship
{ x : 20.5, y : 55.95 }; // the clicked coordinates
Si el bucle del juego funciona a 60 iteraciones por segundo, y la velocidad deseada del barco es de 0.05 puntos por tic (3 puntos por segundo), ¿cómo calculo el nuevo conjunto de coordenadas para el barco para cada tic del bucle del juego?
ps No quiero tener en cuenta la inercia o los múltiples vectores que afectan a la nave, solo quiero que la nave se detenga, haga lo que esté haciendo (es decir, vuele en una dirección) y se mueva a las coordenadas cliqueadas a una velocidad estática.
fuente
goal_dist
en tuif
condición?LERP - Interpolación lineal
Di esta respuesta para un problema similar hace unos días, pero aquí vamos:
La interpolación lineal es una función que le da un número entre dos números, según el progreso. En realidad, podrías obtener un punto entre dos puntos.
La gran fórmula: cómo calcularla
La fórmula general de LERP viene dada por
pu = p0 + (p1 - p0) * u
. Dónde:Cómo obtener porcentaje
Quizás se pregunte, "¿Cómo puedo obtener este porcentaje?". No te preocupes Es así: ¿Cuánto tiempo tomará el punto para viajar para que el vector de inicio termine? Ok, divídalo por el tiempo que ya pasó. Esto te dará el porcentaje.
Mira, algo como esto:
percentage = currentTime / finalTime;
Vectores calculadores
Para obtener un vector resultante, todo lo que necesita hacer es aplicar la fórmula dos veces, una para el componente X y otra para el componente Y. Algo como esto:
Calcular tiempo variable
Es posible que desee tener sus puntos para viajar a una velocidad de 0.5 puntos, ¿sí? Entonces, digamos, se viajará una distancia más larga en un tiempo más largo.
Puedes hacerlo de la siguiente manera:
Obtenga la longitud de la distancia Para ello, necesitará dos cosas. Obtenga el vector de distancia, luego transfórmelo en un valor de longitud.
distancevec = final - start;
distance = distancevec.length();
Espero que sepas vectores de matemáticas. Si no lo hace, puede calcular la longitud de un vector con esta fórmula
d = sqrt(pow(v.x, 2) + pow(v.y, 2));
.Obtenga el tiempo que tomará y actualice la hora final. Este es fácil. Como desea que en cada tic se obtenga una longitud de 0.5, solo tenemos que dividir y obtener cuántos ticks tenemos.
finalTime = distance / 0.5f;
Hecho.
AVISO: Quizás, esta no sea la velocidad prevista para usted, pero esta es la correcta. entonces tienes un movimiento lineal, incluso en movimientos diagonales. Si desea hacer x + = 0.5f, y + = 0.5f, entonces lea un libro de matemáticas de vectores y vuelva a verificar sus planes.
fuente
progress
como se indica en esta respuesta, debe estar en el0..1
rango. Just do:progressLeft = 1.0 - progress;
Esto se puede hacer calculando la normalidad de la dirección y luego calculando la posición actual a través de la ecuación paramétrica
Donde t es el tiempo transcurrido desde que el barco comenzó a viajar en la dirección deseada. También puede realizar esto por actualización a través de
Y solo calcula esto en cada cuadro / física / etc. actualizar hasta que el barco llegue a su destino.
fuente