¿Cómo manejo las plataformas móviles en un juego de plataformas?

15

No quiero usar box2d ni nada, solo quiero plataformas móviles simples (arriba-abajo, izquierda-derecha, diagonales y circulares). Mi pregunta es manejar el orden de actualización / jerarquía de control para que el jugador permanezca fijo en la plataforma de manera sólida, sin rebotar ni tambalearse.

Iain
fuente

Respuestas:

16

Mi solución sería tratar cada entidad física en el mapa del juego como un nodo de árbol , y el mapa en sí como el nodo raíz . Los nodos pueden contener otros nodos. Cada nodo está contenido (directa o indirectamente) dentro del nodo del mapa.

Por ejemplo, digamos que tu personaje está parado en una plataforma. El nodo de la plataforma contiene el nodo del personaje. Entonces, cada vez que la plataforma se mueve, los nodos que contiene (en este caso el personaje) también se moverán.

Para que esto suceda, cada nodo debe tener una posición (x, y) relativa al nodo padre . Por ejemplo, tu personaje podría estar ubicado en (1,0) en relación con la plataforma, que a su vez podría estar ubicado en (10,10) en relación con el mapa del juego. De esa manera, si la plataforma se mueve, tu personaje se moverá implícitamente.

En este árbol jerárquico, la posición de cada nodo es igual a la suma de su posición más las posiciones de cada uno de sus nodos principales. Digamos que queremos obtener la posición del personaje en el mapa. Calculamos:

(posición del personaje) + (posición del nodo principal) + (posición del nodo raíz) = (1,0) + (10,10) + (0,0) = (11,0)

OK, todo este tiempo tu personaje ha estado parado en la plataforma. ¿Qué hay de saltar? Bueno, en el momento en que salta, lo separas de la plataforma y lo unes al nodo que contiene la plataforma ; en este caso, el mapa (nodo raíz).

Cuando aterrice de nuevo, conéctelo al nodo en el que aterrizó.

revs jSepia
fuente
1
También usaría la velocidad x e y del nodo para afectar al jugador. Ejemplo 1: la plataforma se mueve muy rápido y se detiene, el jugador tiene un impulso ascendente y se lanza. Ejemplo 2: la plataforma se mueve hacia abajo un poco más lento que el jugador que cae a una velocidad mortal. La plataforma debería ser segura para aterrizar en lugar de SPLUT
AttackingHobo
ese es un enfoque interesante, pero parece un cambio bastante completo en mi motor solo para permitir que las plataformas se muevan. ¿Tal vez si creo objectOnPlatform como un componente que puedo para cualquier objeto que solo temporalmente da este efecto?
Iain
10

Sugeriría tratar esto como un problema de pseudo-física y resolverlo usando la fricción del suelo.

Ya estás usando la gravedad para mantener al personaje en el suelo, esto maneja las situaciones donde las plataformas se mueven hacia arriba y hacia abajo. Para manejar el movimiento hacia la izquierda y hacia la derecha, el suelo debe ejercer una gran fricción sobre el personaje. Típicamente este nivel de fricción sería 1.0, o 100%.

Si el personaje está parado, entonces su velocidad es 0, y en su lugar heredan el 100% de la velocidad de la plataforma debido a la fricción. Algo como lo siguiente:

character_velocity = friction * platform_velocity

El beneficio de este enfoque es que se presta fácilmente a mecánicas de plataformas adicionales, como ser capaz de superar la fricción en pendientes pronunciadas, permitiendo que su personaje se deslice. También te permite reducir fácilmente la fricción para crear hielo sobre el que se deslizará el personaje.

También es más fácil lidiar con problemas como paredes bajas que pueden derribar a su jugador de una plataforma en movimiento. Si simplemente trata al personaje como hijo de una plataforma principal, existe una buena posibilidad de que no interactúe muy fácilmente con el resto de su detección de colisión sin mucho trabajo.

Soviut
fuente
0

Puede arreglar la posición del jugador no "absoluto en el nivel" sino "relativo a la plataforma", y luego tener una función que le dé su posición real. Aunque no me gusta esto.

Probablemente sería mejor (y más simple) unir al jugador a la plataforma para que cuando la plataforma se mueva + x / + y, el jugador se mueva tanto.

o0 '.
fuente