# Control de movimiento del personaje.
if Input.is_action_pressed("ui_right"):
position.x += speed * delta
if Input.is_action_pressed("ui_left"):
position.x -= speed * delta
if Input.is_action_pressed("ui_down"):
position.y += speed * delta
if Input.is_action_pressed("ui_up"):
position.y -= speed * delta
# Control de movimiento del personaje.
var direction_pressed : Vector2
if Input.is_action_pressed("ui_right"):
direction_pressed.x += 1;
if Input.is_action_pressed("ui_left"):
direction_pressed.x -= 1;
if Input.is_action_pressed("ui_down"):
direction_pressed.y += 1;
if Input.is_action_pressed("ui_up"):
direction_pressed.y -= 1;
position += direction_pressed * speed * delta
Normalizar la velocidad de movimiento en diagonal
La distancia recorrida en diagonal no es la misma que en horizontal o vertical.
Por tanto, el elemento se mueve más rápido en diagonal que en horizontal o vertical...
Cuando un elemento se mueve en horizontal o vertical avanza una distancia a una velocidad determinada.
Por ejemplo, con el siguiente código podemos observar la distancia y a qué velocidad se desplaza un elemento en horizontal o en vertical
# Función que aplica el teorema de pitágoras:
# (Cateto al cuadrado + Cateto al cuadrado = Hipotenusa).
var distancia = sqrt(direction_pressed.x ** 2 + direction_pressed.y ** 2)
print ("Recorrida distancia de: ", distancia, " a una velocidad de: ", speed * delta)
Como resultado, si el elemento no se está desplazando obtendríamos:
Recorrida distancia de: 0 a una velocidad de: 3.33
Si el elemento se está desplazando en horizontal o en vertical obtendríamos:
Recorrida distancia de: 1 a una velocidad de: 3.33
Y si el elemento se está desplazando en diagonal obtendríamos:
Recorrida distancia de: 1.41 a una velocidad de: 3.33
Por tanto, significa que el elemento se moverá mucho más rápido en diagonal que en horizontal o en vertical.
Para corregir esto, tenemos que normalizar la distancia con la función normalized();
El personaje se ha movido una distancia de: 0.99 a una velocidad de: 3.33
De este modo, si volvemos a probar el movimiento en diagonal observaremos que se desplaza una distancia mucho más ajustada al valor real, haciendo que la velocidad a la que se desplaza sea igual tanto en horizontal, como en vertical, como en diagonal.
Mover un elemento hacia el click del ratón
var speed = 200
var is_moving = false
var target_position = Vector2()
# Obtenemos la posición de la pantalla donde se ha hecho click.
if Input.is_action_just_pressed("ui_left_click"):
target_position = get_global_mouse_position()
is_moving = true;
# Función para desplazarse.
if is_moving:
# Calculamos la dirección a la que se debe desplazar el elemento
# para llegar hasta la posición donde se ha realizado el click.
var direction = (target_position - position).normalized()
# Calculamos la distancia que hay desde el elemento al click.
var distance = position.distance_to(target_position)
# Si la distancia es mayor que el siguiente movimiento, desplazamos
# el elemento en la dirección previamente calculada.
if distance > speed * delta:
position += direction * speed * delta
# Si la distancia es menor, se sobrepasaría la posición donde se ha realizado el
# click inicial, por tanto, movemos el elemento a la posición final y terminamos.
else:
position = target_position
is_moving = false