Movimiento

@export var speed : float = 200.0
# 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();

direction_pressed = direction_pressed.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
// Some code

Última actualización