Salto de altura variable en desplazadores laterales


10

¿Cómo puedo hacer que el jugador salte más alto si la tecla de salto se mantiene presionada por más tiempo? Actualmente solo estoy reduciendo la gravedad siempre que se mantenga presionada la tecla y el jugador salte, pero esto parece extraño.


tal vez solo por alguna modificación en cuanto reduces la gravedad obtienes una mejor acción de salto.
Ali1S232

@Gajet Eso es bastante torpe y parece una forma extraña de hacerlo.
El pato comunista

Hmm, dices que reducir la gravedad no implica que estés usando un motor de física. ¿Es este el caso? ¿Estás usando impulsos para saltar?
Jonathan Connell

No hay motor de física, y no estoy usando Impulsos
John Stimac

En cuyo caso, ¿cómo se cae tu jugador? ¿Simplemente traduces su posición de acuerdo con un vector de movimiento * salto * gravedad?
Jonathan Connell

Respuestas:


9

Primero debes decidir cómo quieres que se vea el salto.

En la vida real, la altura del salto se decide en el momento en que abandonas el suelo. No puedes seguir saltando más alto mientras estás en el aire.

Entonces, si puede controlar la altura de su salto mientras ya está en el aire, obtendrá una especie de efecto tipo "jet-pack".

Parece que recuerdo un desplazamiento lateral que tenía dos alturas de salto diferentes, creo que fue uno de los juegos de Super Mario. El salto más alto ocurrió cuando mantuviste presionado el botón de salto, y el salto fue en realidad un salto de dos partes, comenzando con el salto regular inicial, seguido de un segundo impulso que te llevó más alto.

Entonces, ¿cómo quieres que se vea tu salto? ¿Qué tipo de control quieres que tenga el jugador sobre el salto?

Con lo que comenzaría es con esto:

Deje la gravedad sola (es decir, nunca la cambie). Cuando un jugador presiona el botón de salto, aplique la fuerza de salto siempre que el jugador presione el botón de salto (hasta cierto límite de tiempo). Luego, cuando el jugador suelta el botón de salto, no puede aplicar ninguna fuerza de salto nuevamente (es decir, no puede iniciar un salto nuevamente) hasta que toque el suelo primero, momento en el cual los saltos se vuelven a habilitar.


Lo intenté y obtuve el efecto jetpack. Me preguntaba si había alguna forma de evitar eso.
John Stimac

1
Quizás no sea el juego que tienes en mente, pero en Super Mario 2 saltaste más alto al agacharte un poco antes de saltar. (Lo que tiene cierto sentido intuitivo, ya que no saltas muy lejos si intentas hacerlo directamente desde una posición de pie).
Darien

3
Jcubed: en lugar de agregar fuerza a la velocidad, intente agregar la fuerza directamente a la posición. Luego, el jugador se moverá linealmente hacia arriba, en lugar de acelerar.
Olhovsky

@Jcubed: cuando juegas algunos juegos como super meat boy, que creo que tiene el mismo efecto de salto que deseas, parece que mientras mantienes presionado el botón de salto se aplica una fuerza al personaje, es opuesto a la gravedad y más pequeño que él, y el descanso es como lo que dijo alhovsky. Si tuviera que implementar algo así, comenzaría con algo como 60% -80% de gravedad como la fuerza de salto.
Ali1S232

1
Hago esto todo el tiempo, solo mantengo el tiempo durante el cual configuras la velocidad de salto hacia arriba manteniendo presionado el botón lo suficientemente corto para que no sea un efecto notable de jet pack, entonces será como Super Mario con bastante facilidad, con un poco de magia. ajustes numéricos No reduzca la "fuerza", solo siga restableciendo la velocidad a la velocidad máxima de salto hasta que el jumpHigherTime expire o el jugador suelte el botón ... también, siento que los super carne muchachos saltan para ser imprecisos y molestos, como lo es cualquier salto de plataforma. que solo se basa en un motor de física; p
Oskar Duveborn

7

He visto a algunas personas hacer esto:

  1. Cree una variable (lo llamaré jumpTime) (número / doble / flotante). Cuando se presiona la tecla de salto, establezca jumpTimeun número (es decir, 0.5este será el número de segundos que la tecla de salto tendrá efecto).

  2. Luego, para cada paso, ajuste la velocidad a jumpTimemultiplicada por algún otro número y disminuya jumpTimepor delta(la diferencia de tiempo entre cada paso).

  3. Repita eso hasta jumpTimellegar a cero o menos, o cuando el jugador suelta la tecla de salto. Después de que eso suceda, usa física normal (aplica una aceleración negativa constante hasta que el jugador llegue al suelo).

Es posible que necesite usar prueba y error (o "adivinanzas lógicas") para encontrar valores adecuados para esos "algunos números", a menos que sepa cómo hacerlo.


ACTUALIZACIÓN: Encontré el truco que hace que el salto sea un poco más realista (ya que originalmente es lento pero luego rápido). Infinite Mario también usa la siguiente línea (293 de Character.js de la versión de JavaScript) ... this.Ya *= 0.85;Esto es simplemente como "arrastre de aire", y limita / reduce la velocidad del personaje cuando está en el aire. Entonces, en cada cuadro, multiplique la velocidad y (velocidad vertical) por un número menor que uno para que disminuya la velocidad cuando caiga hacia atrás (y, por lo tanto, subir y bajar durante un salto será similar y más realista). Lo sé, soy malo para explicar ...

Cuando el personaje salta usando el método que describí originalmente anteriormente, "sube" más rápido que "cayendo hacia abajo". El arrastre, sin embargo, ralentiza la velocidad vertical. Dado que configuramos la velocidad vertical para que sea proporcional a jumpTimecada cuadro, este arrastre no tiene mucho efecto en la primera mitad del salto. Sin embargo, en la próxima mitad (cayendo hacia abajo), la velocidad vertical no se establece en cada cuadro, sino que simplemente se agrega por otro número (en este caso, es la constante gravitacional). Por lo tanto, el arrastre tiene efecto en la caída, y dado que disminuye la velocidad (en cualquier dirección), ralentiza la caída, haciéndola similar a la primera mitad.

Sin embargo, hay otras formas de resolver este problema, como disminuir el efecto de la gravedad en el personaje a medida que cae. Sin embargo, necesitamos encontrar cuánto debemos reducir la gravedad.


Estudio de caso: Mario infinito

Esto es lo que encontré (de la línea 206 de Mario.java por Markus Persson (Notch)):

    if (keys[KEY_JUMP] || (jumpTime < 0 && !onGround && !sliding))
    {
        if (jumpTime < 0)
        {
            xa = xJumpSpeed;
            ya = -jumpTime * yJumpSpeed;
            jumpTime++;
        }
        else if (onGround && mayJump)
        {
            world.sound.play(Art.samples[Art.SAMPLE_MARIO_JUMP], this, 1, 1, 1);
            xJumpSpeed = 0;
            yJumpSpeed = -1.9f;
            jumpTime = 7;
            ya = jumpTime * yJumpSpeed;
            onGround = false;
            sliding = false;
        }
        else if (sliding && mayJump)
        {
            world.sound.play(Art.samples[Art.SAMPLE_MARIO_JUMP], this, 1, 1, 1);
            xJumpSpeed = -facing * 6.0f;
            yJumpSpeed = -2.0f;
            jumpTime = -6;
            xa = xJumpSpeed;
            ya = -jumpTime * yJumpSpeed;
            onGround = false;
            sliding = false;

            facing = -facing;
        }
        else if (jumpTime > 0)
        {
            xa += xJumpSpeed;
            ya = jumpTime * yJumpSpeed;
            jumpTime--;
        }
    }
    else
    {
        jumpTime = 0;
    }

La versión de JavaScript es básicamente la misma https://github.com/robertkleffner/mariohtml5/blob/master/code/character.js

Esto es similar a la sugerencia de Olhovsky, pero en este caso la fuerza será proporcional a la cantidad de tiempo transcurrido después de que el jugador presionó la tecla de salto.

Mi versión de javascript:

    if ( onGround && jump && !jumped ) {
        jumpTime = maxJumpTime;
        onGround = false;
        jumped = true;
        this.vel.y = jumpTime * jumpConstant;
        A = true;
    } else if ( !onGround && jump && jumpTime > 0 && !released ) {
        jumpTime -= evt.delta;
        this.vel.y = jumpTime * jumpConstant;
        B = true;
    } else if ( !onGround && ( !jump || jumpTime <= 0 ) ) {
        this.vel.y -= gravityConstant * evt.delta;
        jumpTime = 0
        released = true;
    } if ( this.pos.y < 0 && !A && !B ) {
        onGround = true;
        released = false;
        this.pos.y = 0;
        this.vel.y = 0;
    }
    if ( !jump && onGround ) jumped = false;

Sin embargo, algunos valores para las constantes (por ejemplo, "gravityConstant" y "jumpConstant") darán un salto poco realista. ¡Pero a veces los juegos no tienen que ser realistas! ( actualización ver la sección de actualización anterior)

Esta pregunta ya tiene más de un año, ¡pero espero que esto ayude!


2

Como ha dicho Olhovsky, la altura del salto se decide en el momento en que abandonas el suelo, no después de eso.

Si realmente desea evitar el efecto jetpack, solo veo dos formas: una combinación de teclas para saltar más alto o cambiar fundamentalmente la forma en que funciona la tecla de salto:

En lugar de hacer que el jugador salte tan pronto como se presione la tecla, retrase el salto hasta que se suelte la tecla . Entonces, básicamente, la duración de la pulsación de la tecla controla la cantidad de tensión del resorte en las piernas del jugador que se acumula y luego se libera.

Por supuesto, esto altera fundamentalmente la mecánica del juego y puede ser desconocido para el jugador. Pero el efecto podría ser bastante interesante y bien puede valer la pena la falta de familiaridad.


2
Creo que recuerdo haber jugado un juego de plataformas con exactamente esa mecánica: no abandones el suelo hasta que hayas "cargado" el salto. Con algunas animaciones bonitas (como la nube de polvo que crece a los pies del personaje), esto puede hacerse para sentirse intuitivo.
Jari Komppa

2

He encontrado otra solución en la respuesta de David Gouveia a la pregunta " ¿Cómo hacer que un personaje salte? "

Resumen:

Su idea era establecer una velocidad cuando el jugador presiona el botón de salto. En cada cuadro solo calcula la gravedad. Sin embargo, cuando el jugador suelta el botón, establece la velocidad en un valor menor si la velocidad es mayor que esta. La velocidad solo disminuye en cada cuadro por la gravedad.

No debería robar su respuesta, así que adelante y lea su publicación. Su solución está en la sección " Salto de altura variable ".

Entonces, a la gente se le ocurrieron muchas maneras diferentes de resolver este problema ...

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.