¿Cómo hacer que un personaje salte?

45

Actualmente estoy haciendo un juego en C # usando Direct X 9.0. El remake del juego es Donkey Kong NES. Tengo casi todo terminado, pero tengo problemas con la física del salto de Mario. Tengo variables declaradas para las coordinaciones Y y X.

Me preguntaba si había un método simple para hacer esto. He buscado una respuesta alta y baja, pero las respuestas que he encontrado son irrelevantes o utilizan un lenguaje de programación diferente como XNA.

Actualmente tengo una variable bool configurada para verificar si se ha presionado W y eso activará cualquier código para hacerlo saltar. He estado jugando como.

  if (jump == true)
    {

        Playerypos -=  vel;
        Playerxpos +=  vel;
    }

Lo que no funcionó tan bien. He buscado por todas partes una respuesta y ahora estoy desesperado, si alguien podría orientarme en la dirección correcta hacia una solución simple. Eso seria genial. Muy apreciado por cualquier respuesta.

Sarah
fuente
55
Las respuestas que usan un lenguaje de programación diferente no deberían plantear un problema. El algoritmo es lo que interesa, no la implementación específica ... a menos que solo esperes copiar y pegar sin entender nada, ¡lo que ciertamente espero que no sea! Poder leer y adaptar algoritmos de otros lenguajes de programación es una habilidad muy buena.
ccxvii

Respuestas:

85

En primer lugar, XNA también usa C # también, por lo que es el mismo lenguaje de programación. Y aunque la API subyacente puede tener algunas diferencias con DirectX, eso no tiene nada que ver con el salto, por lo que los mismos tutoriales o respuestas deberían aplicarse aquí. Además, existen numerosas formas de implementar esto, dependiendo de muchos factores. Lo que describiré a continuación es solo una de las posibilidades.

Requisitos básicos de física

Primero necesita algunas variables físicas básicas y cálculos en su ciclo de actualización. En particular, debe definir la posición, la velocidad y la gravedad, y su ciclo de actualización debería estar haciendo algo similar a esto (detección de colisión y respuesta omitida por simplicidad):

float positionX, positionY;     // Position of the character
float velocityX, velocityY;     // Velocity of the character
float gravity = 0.5f;           // How strong is gravity

void Update(float time)
{
    positionX += velocityX * time;      // Apply horizontal velocity to X position
    positionY += velocityY * time;      // Apply vertical velocity to X position
    velocityY += gravity * time;        // Apply gravity to vertical velocity
}

Salto de altura fija

Ahora, la forma más fácil de implementar un salto que siempre tenga la misma altura, sin importar cuánto tiempo presione la tecla, es simplemente cambiar la velocidad vertical una vez. Esto hará que el personaje comience a elevarse, mientras que la gravedad se encargará automáticamente de derribarlo:

void OnJumpKeyPressed()
{
    velocityY = -12.0f;   // Give a vertical boost to the players velocity to start jump
}

Importante : no quieres poder comenzar un salto si tu personaje no está en el suelo, por lo que deberás agregar un cheque para eso.

Salto de altura variable

Pero los juegos como Mario y Sonic tienen un salto variable donde la altura del salto depende de cuánto tiempo presiona el botón. En este caso, deberá manejar presionando y soltando la tecla de salto. Podrías agregar algo como:

void OnJumpKeyReleased()
{
    if(velocityY < -6.0f)       // If character is still ascending in the jump
        velocityY = -6.0f;      // Limit the speed of ascent
}

Al ajustar todos estos valores (es decir, los números como 0.5, -12.0fo -6.0f) en el código anterior, puede cambiar la sensación de su salto, qué tan alto salta, cuánto impulso mantiene incluso después de soltar el botón de salto, qué tan rápido cae, etc. .

Importante No llame a estas funciones cada cuadro. Llámelos solo una vez cuando se presione o suelte la tecla. De lo contrario, tu personaje volará en lugar de saltar.

Ejemplo de trabajo

Acabo de crear un ejemplo rápido de las técnicas descritas anteriormente, que puede probar en su navegador aquí (presione el botón del mouse para saltar, suéltelo a la mitad para controlar la altura del salto). Está en JS, pero como mencioné anteriormente, el lenguaje es irrelevante en este caso.

http://jsfiddle.net/LyM87/

David Gouveia
fuente
11
También podría aprovechar la oportunidad de compartir este increíble artículo escrito hace unos días con información relacionada con este tema: La guía para implementar plataformas 2D . Y también esto: Salto sónico .
David Gouveia
2
El artículo describe una forma diferente de hacer saltos variables que la que hiciste en tu respuesta. Requiere suprimir la gravedad o continuar agregando el impulso mientras se mantiene presionado el botón. Usualmente hago lo que dice David en su respuesta, pero ¿hay alguna idea sobre los métodos del artículo?
Jeff
@Jeff Eso también me llamó la atención, y es exactamente por eso que mencioné que hay varias formas de implementarlo. El primer artículo describe dos formas adicionales de manejar el mismo problema, mientras que la forma que describí se basa en el segundo artículo. No sé cómo se comparan entre sí, aunque cualquiera de ellos es bastante fácil de implementar. Al final, elegí este método porque era más fácil de explicar y no requería agregar un temporizador o lidiar con múltiples impulsos de magnitudes decrecientes.
David Gouveia
La respuesta puede variar según el juego específico y cuántas animaciones quieras hacer. Metroid utiliza un salto: / descenso de velocidad constante, pero lo enmascara con un trabajo de animación de alta calidad para que se vea suave y "curvado" en el cenit. Muchos otros juegos de plataformas usan saltos de velocidad variable, que requieren más trabajo para que funcione bien.
Sean Middleditch
1
esto fue muy útil, 5 años después :) y esta cosa del violín es muy genial, ¡debería aprender JS!
Fluidez
1

Como en física. Solo en el momento en que presionas jump keyy el personaje está en el suelo, agrega velocidad hacia arriba (se llama impulso), pero hace que el personaje caiga por gravedad todo el tiempo.

Si no desea que el personaje salte cada vez que toca el suelo, porque lo está sosteniendo jump key, agregue la jump key is being pressedvariable que borra después jump keyse libera y se establece después. Pseudocódigo:

if jump being key pressed == false && jump key just pressed
   add y velocity 
   jump being key pressed = true

if jump key released
   jump being key pressed = false

decrease velocity by gravity
check for collisions // to not penetrate ground ...

Si usé tu camino:

if jump key not pressed
     jump height = 0            // imaginary height donkey would travel without gravity

if jump key pressed
     // going up
     if jump height < maximal height donkey might jump
         jump height += 5
         donkey.y    += 5        // 
     // going down
     else if jump height < 2 * maximal height donkey might jump
         jump height += 5
         donkey.y    -= 5

Cómo donkey.ycambiará depende de tu imaginación. La velocidad debería hacerse más pequeña. El burro está en el aire para que se vea bien.

usuario712092
fuente