¿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.
¿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.
Respuestas:
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.
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.
He visto a algunas personas hacer esto:
Cree una variable (lo llamaré jumpTime
) (número / doble / flotante). Cuando se presiona la tecla de salto, establezca jumpTime
un número (es decir, 0.5
este será el número de segundos que la tecla de salto tendrá efecto).
Luego, para cada paso, ajuste la velocidad a jumpTime
multiplicada por algún otro número y disminuya jumpTime
por delta
(la diferencia de tiempo entre cada paso).
Repita eso hasta jumpTime
llegar 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 jumpTime
cada 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.
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.
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!
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.
He encontrado otra solución en la respuesta de David Gouveia a la pregunta " ¿Cómo hacer que un personaje salte? "
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 ...
http://excitemike.com/JumpingControlTester (ilustra diferentes mecanismos de salto en varios juegos)
http://meyermike.com/wp/?p=175 (también analiza la ruta de salto de Mario)
http://www.flatredball.com/frb/docs/index.php?title=Tutorials:Platforer:Variable-Height_Jumps (describe 3 métodos diferentes)
posiblemente más (no ha pasado por demasiados resultados de búsqueda, pero googlear "altura de salto variable" ayuda)