Actualmente tengo algo como:
float deltaX = point0.getX() - point1.getX();
float deltaY = point0.getY() - point1.getY();
Y cada 0.01 segundos actualizo la posición de mis objetos de esta manera:
object.setPosition(object.getX()-deltaX/100,object.getY()-deltaY/100);
Entonces esto mueve mi objeto del punto 0 al punto 1 en 1 segundo. Lo que necesito es tener los 2 puntos, para poder mover el objeto desde el punto 0, mirando (en la dirección de) punto 1 con una velocidad constante. Por lo tanto, cuando tengo un punto más cercano a mi punto inicial, el objeto se moverá hacia él con la misma velocidad que si tuviera un punto más alejado. Cualquier sugerencia es apreciada. Gracias.
game-mechanics
movement
Fofole
fuente
fuente
Respuestas:
Usaré algunas estructuras de álgebra lineal, ya que es más fácil describir las operaciones de esa manera. En caso de que no sepa cómo implementar estas operaciones vectoriales, le daré una explicación rápida al final.
Entonces, digamos que comienza con estos valores:
start
yend
marca los puntos finales del movimiento,speed
es cuántos píxeles debe mover por segundo yelapsed
es la velocidad a la que actualizará la posición de su objeto (algunos motores ya le proporcionan ese valor ):Lo primero que querrá calcular es la distancia entre ambos puntos y un vector normalizado que contiene la dirección de principio a fin. Además, debe "ajustar" la posición del objeto al
start
punto. Este paso se realiza solo una vez, al principio:Luego de su método de actualización se pasa el objeto mediante la adición de una multiplicación de
direction
,speed
yelapsed
en su posición. Después de eso, para verificar si el movimiento ha terminado, puede ver si la distancia entre el punto inicial y la posición actual del objeto es mayor que la distancia inicial que calculó. Si eso es cierto, ajustamos la posición del objeto al punto final y dejamos de moverlo:Referencia rápida de operaciones vectoriales
Representación
Suma / Resta
Multiplicar por escalar (flotante)
Longitud / distancia
Normalizar
Eso debería ser suficiente para convertir el código anterior en operaciones regulares si no tiene una
Vector
clase disponible para usted.Ejemplo de conversión
fuente
Vector2 start;
conviertefloat startX, startY;
. Y puede calcular fácilmente la distancia manualmente, como explico al final. Es decirfloat dX = bX - aX; float dY = bY - aY; float distance = Math.sqrt(dx*dx+dy*dy);
.Crea un vector y normalízalo. Advertencia, algunos pseudocódigos con números incorrectos por delante:
Esto le dará un vector como:
Ahora normalice el vector y recibirá esto :
Desde aquí es el mismo movimiento que con tu delta.
fuente
Copiado y pegado de mi respuesta a: Obtener puntos en una línea entre dos puntos
En pseudocódigo:
fuente