Tengo objetos en mi juego que se mueven más rápido a 45 grados que a 90 grados.
Cada objeto tiene
- Posición del punto (x, y)
- Dirección Vector2D (x, y)
- Int velocidad
Y lo que hago durante una actualización es que la nueva posición se calcula como:
position.x += direction.x * speed
position.y += direction.y * speed
¿Cómo corrijo esto? Quiero que se mueva con la misma velocidad en cualquier ángulo.
Respuestas:
Esto se puede explicar con el Teorema de Pitágoras , que es la siguiente fórmula:
En su caso, cuando se mueve hacia la derecha, está usando (x: 1, y: 0) que nos da
Cuando se mueve hacia arriba y hacia la derecha, está usando (x: 1, y: 1) que nos da
Como puede ver, la longitud en diagonal es más larga que la longitud en los ejes cardinales.
Como otros han mencionado, simplemente debe normalizar su vector de dirección. Si usa XNA, se hace así:
fuente
Normalice su vector de dirección antes de usar.
Como lo explicó MindWorX, esto puede entenderse simplemente, si te preocupa que tus vectores de dirección puedan darte pena, asegúrate de que sean vectores unitarios (magnitud / longitud de 1).
Si está normalizado:
fuente
¿Cómo estás calculando tu dirección? Si 45 grados es
(1,1)
, entonces ciertamente será más rápido que 90 grados(1,0)
.Te sugiero que uses algo como esto:
Para obtener el ángulo en radianes, tendrás que multiplicar tus grados con
PI / 180
o incluso mejor, usarMathHelper
. P.ej.fuente
Jason
En lugar de tener tres atributos de objeto,
A menudo es mucho más fácil combinar la dirección y la velocidad en un vector de velocidad. Entonces solo tienes dos atributos,
Puesto de actualización
Cuando necesita actualizar la posición del objeto, es tan simple como:
¿Dónde
Δt
está su delta de tiempo, o diferencia de tiempo, o paso de tiempo?Actualización de posición y velocidad
También es muy fácil manejar la aceleración (como la gravedad). Si tiene un vector de aceleración, puede actualizar la velocidad y la posición juntas de la siguiente manera:
(Esta es básicamente la fórmula s = vt + ½at² de Física 101.)
Aplicando una velocidad
Si desea aplicar una velocidad dada en una dirección normalizada, puede establecer la velocidad de esta manera:
Derivando una velocidad
Y si necesita hacer lo contrario, derivando la velocidad y la dirección de un vector de velocidad dado, simplemente puede usar el teorema de Pitágoras o el
.Length()
método:Y una vez que se conoce la velocidad, la dirección normalizada se puede calcular dividiendo la velocidad por la velocidad (teniendo cuidado de evitar dividir por cero):
fuente