POO. INGENIERIA EN ANIMACION Y EFECTOS VISUALES. MTRO. MARIO [Link] P.
Mecánicas extras para el jugador.
Salto.
1.- Creamos una variable de salto.
export (float) var vel_salto
2.- Configuramos el botón de salto (queda a elección del equipo).
3.- Agregamos un nuevo if dentro de la función procesar_teclas(), dejamos un espacio para
respetar el indentado.
if(Input.is_action_just_pressed(“jump”)):
$anim,play(“jump”)
vel_actual.y -= vel_salto
4.- En la función _physic tenemos la variable vel_act.y, necesitamos cambiar el valor
a incremental para que no envíe al infinito a nuestro personaje.
vel_actual.y += gravedad * delta
5.- Modificamos los valores de nuestra gravedad y de la variable salto de acuerdo a las
necesidades de nuestro juego.
Detección de superficies mediante RayCast.
Nota: se crea un raycast, por si el juego tiene pendientes o superficies irregulares en
donde nuestro personaje quede atascado.
6.- En el player le daremos un nuevo hijo que será del tipo RayCast.
7.- La renombramos como r1, la agregamos al grupo Suelo, y le hacemos un poco pequeña
en Cast To en el eje Y, la bajamos a 10.
8.- Activamos los botones de Enable y Exclude Parent, ambos pueden venir desactivados.
9.- En la función _physics creamos un if, justo debajo de move_and_collide, el cual nos
permitirá saber si está tocando o colisionando con un objeto del grupo Suelo.
if($r1.is_colliding() && $[Link]().is_in_group(“Suelo”)):
global_position = Vector2(global_position.x, $r1.get_collision_point().y -15)
10.- Modificamos un poco el valor de velocidad de movimiento, a modo que Mario camine
un poco natural, aunque notemos que desacelera por la fricción que tiene el personaje al
tocar el piso.
POO. INGENIERIA EN ANIMACION Y EFECTOS VISUALES. MTRO. MARIO [Link] P.
Solución previa a fricción.
11.- Haremos que el raycast se base en el collision Shape.
12.- Modificamos el código de la siguiente manera:
if($r1.is_colliding() && $[Link]().is_in_group(“Suelo”)):
global_position = Vector2(global_position.x, $r1.get_collision_point().y -
$[Link].y -1)
13.- Movemos este código para que quede enmedio procesar movimiento y move and
collision, de modo que se ejecute en medio de ambas funciones.
14.- Entramos a colisión del player, y modificamos safe Margin, esto permitirá que el jugador
no colisione bruscamente con el suelo.
15.- Aún falta mucho para que nuestro player interactúe con el escenario de manera fluida,
pero va bien hasta el momento.
Solución salto con raycast y solución definitiva a fricción.
16.- Alteramos el código para que nuestro personaje caiga en negativo al realizar la caída
hacia el piso.
if(vel_act.y > 0 && $r1.is_colliding() && $[Link]().is_in_group(“Suelo”)):
global_position = Vector2(global_position.x, $r1.get_collision_point().y -
$[Link].y -0.5)
17.- Dentro del input de Jump, vamos a modificar una línea del código que permita que
nuestro personaje no supere el salto, que sea controlado, para que no se nos dispare de la
escena.
Debajo del if insertamos la siguiente línea:
global_position.y = -5
18.- Ahora al tocar el suelo, queremos que la gravedad vuelva a 0. Agregamos una nueva
línea en el if que estuvimos trabajando hace unos instantes.
vel_act.y = 0
Le dejamos la velocidad de movimiento en 100 y la velocidad de salto en 50.
19.-Debajo de nuestro último código insertamos el siguiente:
POO. INGENIERIA EN ANIMACION Y EFECTOS VISUALES. MTRO. MARIO [Link] P.
if(estado_actual == [Link]):
$[Link]("idle")
Este código nos ayudará a que nuestro personaje vuelva a su posición neutral sin tener que
estar corriendo.
Doble Salto.
20.- Creamos una variable nueva que nos permita evitar el doble salto.
var saltando = false
21.- Ahora en el if de jump vamos a decir que al presionar la tecla de Jump, pues si me
encuentre saltando:
if(Input.is_action_just_pressed("jump") && !saltando):
global_position.y = -5
$[Link]("jump")
vel_act.y -= vel_salto
saltando = true
22.- Y en el código de collision de la función physics vamos a decirle que tampoco quiero
que después de tocar el piso siga saltando. (debajo de $[Link](“idle)
saltando = false
23.- Ahora en la función procesar_movimiento vamos a agregar la variable de saltando,
para evitar que cuando salte el personaje se muestre corriendo en el aire.
func procesar_movimiento():
if(estado_actual == [Link]):
vel_act.x = vel_mov
if(!$anim.is_playing() && !saltando):
$[Link]("walk")
$Sprite.flip_h = false
elif(estado_actual == [Link]):
vel_act.x = -vel_mov
if(!$anim.is_playing() && !saltando):
$[Link]("walk")
$Sprite.flip_h = true
POO. INGENIERIA EN ANIMACION Y EFECTOS VISUALES. MTRO. MARIO [Link] P.