Hay una cosa que me ha estado desconcertando, y es cómo implementar un salto 'falso impulso' en un juego de plataformas. Si no sabes de lo que estoy hablando, piensa en los saltos de Mario, Kirby y Quote de Cave Story. ¿Qué tienen en común? Bueno, la altura de tu salto está determinada por cuánto tiempo mantienes presionado el botón de salto.
Sabiendo que los 'impulsos' de estos personajes se construyen no antes de su salto, como en la física real, sino más bien mientras están en el aire , es decir, puedes levantar el dedo a la mitad de la altura máxima y se detendrá, incluso si con desaceleración entre él y el punto final; Es por eso que simplemente puede tocar para un salto y mantenerlo presionado para un salto largo, estoy fascinado por cómo mantienen sus trayectorias como arcos.
Mi implementación actual funciona de la siguiente manera:
Mientras se presiona el botón de salto, la gravedad se apaga y la coordenada Y del avatar se reduce por el valor constante de la gravedad. Por ejemplo, si las cosas caen en unidades Z por tic, aumentará las unidades Z por tic.
Una vez que se suelta el botón o se alcanza el límite, el avatar desacelera en una cantidad que haría que cubriera X unidades hasta que su velocidad alcance 0; una vez que lo hace, acelera hasta que su velocidad coincide con la gravedad; siguiendo el ejemplo, podría decir que acelera de 0 a Z unidades / tic mientras aún cubre X unidades.
Sin embargo, esta implementación hace saltos demasiado diagonales, y a menos que la velocidad del avatar sea más rápida que la gravedad, lo que lo haría demasiado rápido en mi proyecto actual (se mueve a aproximadamente 4 píxeles por tic y la gravedad es de 10 píxeles por tic, a un framerate de 40FPS), también lo hace más vertical que horizontal. Aquellos familiarizados con los juegos de plataformas notarán que el salto en arco del personaje casi siempre les permite saltar más lejos, incluso si no son tan rápidos como la gravedad del juego, y cuando no lo hace, si no se juega bien, demostraría ser Muy contrario a la intuición. Lo sé porque podría dar fe de que mi implementación es muy molesta.
¿Alguien ha intentado alguna vez en mecánicas similares, y tal vez incluso tuvo éxito? Me gustaría saber qué hay detrás de este tipo de saltos de plataformas. Si nunca antes ha tenido alguna experiencia con esto y desea probarlo, no intente corregir o mejorar mi implementación explicada, a menos que esté en el camino correcto, intente inventar su solución desde rasguño. No me importa si usas la gravedad, la física o cualquier otra cosa, siempre que muestre cómo funcionan estos pseudo-impulsos, funciona.
Además, me gustaría que su presentación evite una codificación específica del idioma; como compartirnos un ejemplo de C ++ o Delphi ... Por mucho que esté usando el marco XNA para mi proyecto y no me importe cosas de C #, no tengo mucha paciencia para leer el código de otros, y estoy ciertos desarrolladores de juegos de otros idiomas estarían interesados en lo que logramos aquí, así que no te preocupes por seguir el pseudocódigo.
Gracias de antemano.
fuente
Respuestas:
Creo que su principal problema radica aquí:
La gravedad no funciona así. Google "movimiento uniformemente acelerado" para los detalles, pero en términos simples, como dijo otro miembro, la gravedad es una aceleración, no una velocidad.
En pocas palabras, mientras que la velocidad es la tasa constante de cambio de posición en el tiempo, la aceleración es la tasa constante de cambio de velocidad en el tiempo.
Entonces, su primer orden de negocios sería cambiar su algoritmo de caída para incluir la aceleración, no solo la velocidad. En lugar de:
tendrías que hacer algo como
De esa manera, todo caerá en una parábola, que es el movimiento físicamente correcto.
Ahora, para implementar saltos simples (llegaremos a su pregunta exacta justo después de esto), simplemente establezca el
velocity_y
valor deseado. Siempre y cuando el signoacceleration_y
y suvelocity_y
deseo sean diferentes, su objeto saltará correctamente (en otros términos, usted no "desactiva la gravedad". Lo mantiene encendido y simplemente establece la velocidad del objeto en algún valor predefinido).Notarás que cuanto mayor
velocity_y
sea cuando comiences a saltar, mayor será el salto. Entonces, para implementar el efecto deseado, agrega algún tipo de aceleración al salto (en términos físicos, esto significa agregar una fuerza. Piense en agregar un pequeño cohete al objeto).Para hacer esto, debe hacer lo mismo que antes, pero ahora la aceleración y la velocidad deberían tener el mismo signo. Usted hace esto mientras se presiona el botón:
fuente
La solución no es retrasar la desaceleración. Cuando lanzas una pelota al aire, no se mueve a una velocidad constante hasta que alcanza su altura máxima, sino que se desacelera desde el momento del impulso.
La gravedad no es una velocidad, sino una aceleración. Entonces, si un jugador tiene una velocidad superior a 20 unidades, y la gravedad es -10 unidades, en la siguiente marca, la velocidad ascendente sería de 10 unidades, en la siguiente, 0 unidades, etc.
La razón por la que tus saltos parecen tan diagonales es porque la velocidad de tu jugador hacia arriba y hacia abajo es constante. Entonces, si literalmente dibujas una línea que sigue la trayectoria del jugador, verás una línea con la pendiente, positiva o negativa, de tu valor de gravedad sobre el cambio en la posición x.
Para que su jugador controle la altura de su salto, a su jugador se le debe dar cierta velocidad inicial por impulso, se debe desactivar la gravedad y se debe aplicar un valor de gravedad especial (menor que la gravedad normal) a la velocidad del jugador. Una vez que se suelta el botón de salto o la velocidad del jugador alcanza 0, se debe aplicar la gravedad normal.
De esta manera, el jugador verá una bonita curva durante su salto, ya sea que estén desacelerando por gravedad regular o no.
fuente
La historia corta es: vas a tener una sección no parabólica en tu arco de salto en alguna parte.
Intenté algunos enfoques al implementar el salto:
Ascenso constante: Esto parece ser, en efecto, lo que estaba intentando: tener la velocidad vertical positiva fijada hasta que se suelta el botón, momento en el que se activa la gravedad normal. El arco es diagonal en el ascenso, pero normal en la caída - En realidad, esto normalmente se ve bien y (lo que es más importante) se siente bien, ya que es bastante fácil juzgar bien la altura del salto.
Ascenso arrestado: aquí es donde comienzas al personaje a ascender en la parábola de altura máxima, aplicando un impulso inicial. Luego, cuando se suelta el botón, establece la velocidad vertical en cero (o una pequeña velocidad hacia arriba). Esto significa que sus saltos más grandes son una parábola garantizada, y los saltos más pequeños se sienten más como si estuviera dando un gran salto y luego disminuyendo la velocidad.
Impulso inicial variable: esta es la opción por la que terminé optando: presionar el salto aplicaría un impulso ascendente inicial suficiente para un salto, y luego continuaría aplicando aceleración ascendente (mucho mayor que la gravedad) durante un corto período, la ventana de salto, hasta que Se soltó el botón. Una vez que se cerró la ventana de salto, el movimiento sería parabólico, y el período de impulso inicial variable fue lo suficientemente corto como para que no pareciera extraño, pero fue lo suficientemente largo como para darle a un jugador experimentado suficiente alcance para controlar la altura del salto. La desventaja era que no era tan fácil juzgar la altura del salto, ya que la ventana era mucho más pequeña y no tenía la correspondencia del momento de liberación con la altura. Como sucedió la mayoría de las veces, o bien querías un toque o un salto completo de todos modos, así que eso no fue un problema.
Pruebe estos y vea cuál se siente mejor.
fuente