Buena física de plataformas en 2D [cerrado]

76

Tengo un controlador de personaje básico configurado para un juego de plataformas en 2D con Box2D, y estoy empezando a modificarlo para tratar de que se sienta bien. Los motores de física tienen muchas perillas para ajustar, y no me queda claro, escribiendo con un motor de física por primera vez, cuáles debo usar. ¿Debería el salto aplicar una fuerza para varias garrapatas? Un impulso? Establecer directamente la velocidad? ¿Cómo evito que el avatar se pegue a las paredes sin eliminar toda su fricción (o elimino toda la fricción, pero solo en el aire)? ¿Debo modelar el personaje como una cápsula? ¿Una caja con esquinas redondeadas? ¿Una caja con dos ruedas? ¿Solo una gran rueda? ¡Siento que alguien debe haber hecho esto antes!

Parece que hay muy pocos recursos disponibles en la web que no sean "la primera física del bebé", que se cortaron donde espero que alguien ya haya resuelto los problemas. La mayoría de los ejemplos de motores de física para plataformas tienen controles de sensación de flotación, saltos en el aire o comportamiento fácilmente explotable cuando la penetración temporal es demasiado alta, etc.

Algunos ejemplos de lo que quiero decir:

  • Un pequeño toque de salto salta una corta distancia; Un largo toque salta más alto.
  • Patinaje corto al parar o invertir direcciones a alta velocidad.
  • Pararse de manera estable en pendientes (pero tal vez deslizarse hacia abajo al agacharse).
  • Velocidad analógica cuando se usa un controlador analógico.
  • Todas las otras cosas que separan a los buenos plataformas de los malos.
  • ¿Me atrevo a sugerir, plataformas móviles estables?

Realmente no estoy buscando "hey, haz esto". Obviamente, lo correcto depende de lo que quiero en el juego. Pero espero que alguien en algún lugar haya pasado por las posibilidades y haya dicho "bien, la técnica A sí presenta X bien, la técnica B sí hace bien Y, pero eso no funciona con C", o tiene algunos ejemplos más allá de "if (key = = espacio) character.impulse (0, 1) "

Josh
fuente

Respuestas:

25

Es bastante complicado implementar, digamos, física 'similar a Mario' usando un motor de física real.

La última vez que probé esto, usando Chipmunk, modelé al jugador como 2 círculos: un 'círculo corporal' encima de un 'círculo de pies'

El 'círculo de pies' tenía algo de fricción, no era hinchable y era bastante pequeño. El 'círculo del cuerpo' era más grande y sin fricción, para evitar pegarse a paredes / pendientes pronunciadas

El objeto estaba restringido para no permitir la rotación; simplemente se deslizaría

Si los 'pies' están tocando algo, o estaban dentro de los últimos fotogramas (para permitir la caída de pendientes), el jugador fue considerado como en el suelo (también puede haber tenido un control normal de superficie)

Ha pasado un tiempo desde que miré el código, pero el comportamiento fue similar a:

Cuando en el suelo:

  • Aplique 'gravedad adicional' (fuerza hacia abajo para ayudar a bajar pendientes)
  • Aplicar fricción al suelo (mayor cantidad de amortiguación horizontal)
  • Aplicar fuerza de movimiento izquierda / derecha, en función de los controles.
  • (Disminuya la fuerza de movimiento izquierda / derecha a medida que se aproxima a la velocidad máxima de carrera)
  • Si se presiona el salto, aplique el impulso hacia arriba

Cuando en el aire:

  • Aplicar resistencia al aire (pequeña cantidad de amortiguación horizontal)
  • Aplicar gravedad regular (o reducida)
  • Aplica fuerza de movimiento izquierda / derecha, si estás permitiendo el control en el aire

Debes tener un poco de cuidado al cambiar entre los dos estados; recuerda que cuando corras por una pendiente, puedes dejar el suelo por un par de cuadros; probablemente no quieras cambiar de estado / no permitir el salto en ese punto

Sin embargo, hay algunas otras cosas a tener en cuenta: las plataformas de 'salto hacia arriba' pueden ser difíciles de implementar, y cuando comienzas a hacer cosas divertidas (plataformas móviles, mundos giratorios, etc.), debes tener cuidado de asegúrese de que el jugador no pueda quedar atrapado / aplastado por ningún objeto en movimiento 'impulsado por la animación'.

bluescrn
fuente
Sé que esta es una respuesta bastante antigua, pero tengo algunas preguntas al respecto. 1) ¿Cómo resuelve el "mantener la misma velocidad en cualquier pendiente del terreno en que se encuentre?" 2) Si está usando un pequeño círculo para los pies y un círculo más grande para el cuerpo, ¿no se colgaría el jugador en los bordes algunas veces? Estoy realmente interesado en tu enfoque.
Notbad
18

Honestamente, no creo que usar un motor de física sea el enfoque correcto para algo de ese tamaño de dominio con requisitos súper estrictos.

Solo escríbelo todo tú mismo. Obtendrá resultados mucho mejores diciendo "mueva el personaje hacia arriba por x unidades en esta forma de parábola cuando mantenga presionado el botón de salto durante la longitud y" que tener un montón de botones para ajustar.

Tétrada
fuente
Lo he hecho varias veces en el pasado. Funciona hasta cierto punto, pero siempre terminas desechando algo más porque es "demasiado difícil" hacer la física correctamente con un controlador hacky. En este juego en particular, espero involucrar algunas mecánicas de resorte / cuerda para el movimiento del jugador, y eso cruzó al reino de "Prefiero cortar un motor de física real" en lugar de "Prefiero cortar una caja agente de mudanzas".
3
Prefiero hackear un motor de caja, al menos no puede volverse inestable, mientras que un motor de física tiende a explotar si le aplicas demasiadas fuerzas porque necesitas restringir los movimientos a las especificaciones exactas (y las restricciones del motor de física no existen). t rígido, solo pueden tratar de cumplir tanto). Además, la aplicación de fuerzas para resolver un problema no deseado tiende a influir en todo lo demás, lo que lleva al infierno de los retocadores.
Kaj
10

Escribí una serie de artículos sobre cómo construir un juego de plataformas desde cero utilizando tecnologías modernas e incluye cómo manejé la física simple:

http://www.wildbunny.co.uk/blog/2011/12/14/how-to-make-a-2d-platform-game-part-2-collision-detection/

Sin embargo, si desea algo más de alta tecnología, es completamente posible abordar esto utilizando un motor de física completo. Aquí hay una técnica que puede usar (de Little Big Planet) que hace que el personaje del jugador sea una parte completamente integrada del motor de física:

En lugar de aplicar impulsos o establecer velocidades para mover al jugador como "entradas externas" al motor de física, puede desarrollar una restricción que controle al personaje.

Por lo tanto, esta restricción tendrá la velocidad y dirección deseadas por el jugador como entrada (del juego) y modelará cosas como la fuerza y ​​velocidad máximas del jugador. La restricción intentará mover al jugador de acuerdo con sus entradas (y obedeciendo los máximos), y debido a que es una restricción, aplicará una fuerza igual y opuesta sobre el objeto en el que el jugador está parado, permitiendo así al jugador pararse en plataformas móviles y para afectar las cosas sobre las que se mueve.

Hacer cosas como esta significa que puede hacer que el jugador sea totalmente capaz de lidiar con situaciones como estar debajo de una gran pila de cajas o saltar a través de varias plataformas en movimiento porque ahora es una parte central del motor de física.

¡Espero que ayude!

Saludos, Paul.

salvaje
fuente
6

Esta pregunta ha tenido una discusión significativa en los foros de Box2D. Si lees las discusiones sobre el movimiento del personaje, el salto o el juego de plataformas, encontrarás todos los problemas posibles. Sin embargo, el problema se volvió lo suficientemente complicado como para actualizar el sistema de filtrado de colisiones y crear un ejemplo de Test Bed únicamente para mostrar cómo se debe hacer.

código_deft
fuente