Cómo implementar una trayectoria de movimiento de curva en juegos 2D

En respuesta a A2A:

Para hacer que el boomerang siga una curva predefinida, solo busque cualquier fórmula de spline en wikipedia. Esos son muy fáciles de implementar.

Sin embargo, si desea hacer que el boomerang regrese en movimiento suave, la opción mucho más fácil sería simplemente acelerar el boomerang hacia el jugador una vez que comience a regresar.

Básicamente, almacene la velocidad del boomerang como un vector, calcule la dirección del boomerang al jugador, normalícela y escale según la aceleración deseada. Luego use ese vector para acelerar el boomerang, hasta alcanzar la velocidad máxima.

Tendrás tu boomerang chase player sin splines.

El problema aquí es que este movimiento puede ser explotado por el jugador: al saltar sobre el boomerang que regresa, será posible mantenerlo en movimiento durante mucho tiempo. Entonces, usa el temporizador en el boomerang (para destruirlo) o haz que desaparezca después de golpear un obstáculo.

Si bien estoy de acuerdo con las respuestas basadas en spline en la mayoría de los casos, hay algunas alternativas interesantes. Enseño programación y robótica (a menudo juegos) a los grados 2–6 y no creo que pueda enseñarles sobre splines. No obstante, a menudo necesitan un camino curvo de varios tipos. A veces, estos pueden ser aproximados, a menudo de una manera muy razonable, entremezclando operaciones muy básicas. Por ejemplo, si comenzaste a caminar y un pie iba más lejos que el otro cada vez, estarías haciendo una aproximación de un círculo (y se lo demuestro a la clase).

Entonces, programando en Scratch, Bitsbox, Blockly, Javascript, Swift o lo que sea, tu personaje podría estar haciendo un ciclo de movimientos y rotaciones que se repite rápidamente. Si usan parámetros constantes, obtendrás círculos de varios tipos, pero ¿qué pasa si cambian de alguna manera durante cada iteración o incluso interactúan entre sí o tienen un componente aleatorio? Muy pronto obtendrás espirales, patrones lissajous y cosas mucho más complejas.

No estoy de acuerdo con las otras respuestas. Si bien creo que tienen un punto, que no debería reinventar la rueda si no es necesario, también creo que una respuesta de “usar un complemento o biblioteca para todo ” es bastante inútil. Implementar su propio sistema spline y comprender las matemáticas no es demasiado difícil y puede ser un gran paso de aprendizaje. Es gratificante en sí mismo y le dará otra herramienta en su caja de herramientas.

Hay muchas formas de crear una curva. Podrías hacerlo completamente en una sola ecuación, usando un montón de senos y cosenos. Sin embargo, un sistema de spline es más flexible e intuitivo.

Las splines están diseñadas con una lista de puntos de control.

Lo que queremos es una función que, dado un tiempo en la ruta de movimiento en el rango de cero a uno, devuelva una posición en la curva.

Vector2D getPointOnCurve (const float t);

La forma de hacerlo es multiplicar primero t por el número de puntos en la lista menos 1.

Digamos que hay 6 puntos de control, y queremos obtener el punto en el centro de la spline, es decir, cuando t = 0.5

Multiplicar 0.5 por (6–1) nos dará 2.5

Ahora dividimos ese valor en las partes enteras y fraccionarias.

i = 2, f = 0.5

Para una spline cúbica, necesitamos 4 puntos de control en los índices i-1, i, i + 1 e i + 2 (recuerde que los índices comienzan desde 0). Si los valores están fuera del rango de la lista, puede sujetarlos para una spline abierta o envolverlos para una spline en bucle.

Entonces, en este ejemplo, dado que i = 2, solo necesitamos mirar los vértices de control segundo, tercero, cuarto y quinto.

Ahora, la parte fraccional, f, es 0.5. Esto se usará en las ecuaciones para calcular las contribuciones de cada uno de esos 4 puntos que usamos.

No voy a entrar en las matemáticas, puedes encontrarlo en cualquier lugar, pero básicamente necesitas conectar el valor de f en algunos polinomios de tercer orden para obtener el peso de cada uno de los 4 puntos de control. Luego, sumas sus contribuciones ponderadas y tienes tu punto final en la curva.

Lea este tutorial para ver cómo se derivan las ecuaciones y cómo usarlas.

No tenga miedo de implementar cosas como esta usted mismo. Es un gran ejercicio de aprendizaje de alcance limitado y lo hará un poco mejor y más seguro en programación y matemáticas.

“¿Cómo se implementan las rutas de movimiento de una curva en juegos 2D?”

Con interpolación spline.

Aunque la matemática detrás de la interpolación spline no es terrible, es el tipo de cosas que es bueno usar una biblioteca existente probada de manera confiable que usted sabe que es buena y eficiente.

Esta es una gran parte de la razón por la que no sugiero que los principiantes intenten hacer un juego con algo a un nivel tan bajo como C ++ y SDL.

¿Por qué no estás usando un motor de juego robusto en lugar de huesos básicos?

El usuario de Quora agregó este gran bit adicional en los comentarios, y sentí que debía destacarse directamente en la respuesta.

no es solo acertar con las matemáticas, está sentado frente a una pantalla a las 3 AM preguntándose por qué va demasiado rápido en la dirección equivocada (y luego intentando otra estrategia de depuración) cuando podría estar trabajando en el juego real

Esto es exactamente por qué “No inventado aquí” es algo muy malo. El mundo está lleno de excelentes herramientas, úsalas.

Haz una fórmula para la x, y del sprite.