Duda sobre Godot (código marranero inside)

Sawi

Dejo aquí código marranero en Godot. Iba a pasar a refactorizar todo después de ver que las cosas me funcionaban y demás, pero es que estoy topando con una tontería muy gorda y no sé por dónde cogerlo.

Me explico:
Me está dando problemas en específico esta parte del código ->position= position.move_toward(nextPosition,movementSpeed*delta)

¿Por qué?

Pues porque la primera vez que pulso la tecla funciona correctamente, y me mueve una posición (que es lo que quiero), pero después si vuelvo a pulsar esa tecla me mueve mucho menos (dependiendo de la movementSpeed que le meta tengo algo más de margen antes de que termine de fallar del todo).

Tiene que ser una gilipollez, pero no doy con la tecla y estoy ya de los nervios.

Es movimiento "por casillas", si el personaje está mirando en una dirección, al volver a pulsar esa dirección debe avanzar. Si está mirando en otra dirección, gira a la dirección que has pulsado.

Gracias por la ayuda, cualquier duda que tengais sobre el código aquí estoy.

He medio probado con tweens, y la cagada es similar.

func _process(delta: float) -> void:
	

frontDirection= global_transform.origin + Vector3.FORWARD
leftDirection= global_transform.origin + Vector3.LEFT
rightDirection= global_transform.origin + Vector3.RIGHT
backDirection= global_transform.origin + Vector3.BACK


if Input.is_action_just_pressed("Front"):
	
	if !lookingFront:
		rotationDirection= self.transform.looking_at(frontDirection,Vector3.UP)
		
		lookingFront=true
		lookingLeft=false
		lookingRight=false
		lookingBack=false
		
		print_debug(position,nextPosition)
		
	else:
		nextPosition= position+ Vector3.FORWARD
		print_debug(position,nextPosition)
	
elif Input.is_action_just_pressed("Left"):
	if !lookingLeft:
		rotationDirection= self.transform.looking_at(leftDirection,Vector3.UP)
		
		lookingFront=false
		lookingLeft=true
		lookingRight=false
		lookingBack=false
		print_debug(lookingFront,lookingLeft,lookingRight,lookingBack)
	elif lookingLeft:
		nextPosition= position + Vector3.LEFT
		print_debug(lookingFront,lookingLeft,lookingRight,lookingBack)
elif Input.is_action_just_pressed("Right"):
	if !lookingRight:
		rotationDirection= self.transform.looking_at(rightDirection,Vector3.UP)
		
		lookingFront=false
		lookingLeft=false
		lookingRight=true
		lookingBack=false
		print_debug(lookingFront,lookingLeft,lookingRight,lookingBack)
	elif lookingRight:
		nextPosition= position+ Vector3.RIGHT
		print_debug(lookingFront,lookingLeft,lookingRight,lookingBack)
	
elif Input.is_action_just_pressed("Back"):
	if !lookingBack:
		rotationDirection= self.transform.looking_at(backDirection,Vector3.UP)
		
		lookingFront=false
		lookingLeft=false
		lookingRight=false
		lookingBack=true
		print_debug(lookingFront,lookingLeft,lookingRight,lookingBack)
	elif lookingBack:
		nextPosition= position+ Vector3.BACK
		print_debug(lookingFront,lookingLeft,lookingRight,lookingBack)

#INTERPOLA ENTRE POSICIÓN ANTERIOR Y POSICIÓN A LA QUE ROTARÁ
self.transform= self.transform.interpolate_with(rotationDirection,rotationSpeed*delta)
position= position.move_toward(nextPosition,movementSpeed*delta)
jrrbuil

Has probado a pedirle a ChatGPT que te lo corrija? No es broma

1 respuesta
Sawi

#2 Yes. No lo arregla, sigue fallando en el mismo sitio el código. Tiene que ser algo que estoy haciendo mal con el movementSpeed * delta, o no sé.

Si le meto movementSpeed = 10 puedo hacer un movimiento hasta que empieza a moverse menos, y si lo pongo en 100, alrededor de 10 movimientos 🤔

Me tiene descolocado el problema. Mañana le meteré más horas 😂😂

EDIT: Si cambio la línea del move_forward con un position = nextPosition, se posiciona correctamente donde quiero, pero claro, pierdo la animación desde la posición A a la B

1 respuesta
DevilJin

#3 prueba solo en el código a moverte en una dirección, quita todos los ifs y prueba solo con una a ver si te pasa, a mi me pasaba por los ifs que me hacían cosas raras

1 1 respuesta
Sawi

#4 Mañana lo pruebo!

Lo jodido es que sin el move_toward la lógica de posicionarlo si funciona 🥲

1
Freak1337

Mis IAs dicen estas cosas: prueba y me dices:

extends Spatial

var lookingFront = false
var lookingLeft = false
var lookingRight = false
var lookingBack = false

var nextPosition = Vector3()
var rotationDirection = Transform()

var movementSpeed = 5.0
var rotationSpeed = 5.0

func _process(delta: float) -> void:
    var frontDirection = global_transform.origin + Vector3.FORWARD
    var leftDirection = global_transform.origin + Vector3.LEFT
    var rightDirection = global_transform.origin + Vector3.RIGHT
    var backDirection = global_transform.origin + Vector3.BACK

var positionChanged = false

if Input.is_action_just_pressed("Front"):
    if !lookingFront:
        rotationDirection = self.transform.looking_at(frontDirection, Vector3.UP)
        lookingFront = true
        lookingLeft = false
        lookingRight = false
        lookingBack = false
    else:
        nextPosition = global_transform.origin + Vector3.FORWARD
        positionChanged = true

elif Input.is_action_just_pressed("Left"):
    if !lookingLeft:
        rotationDirection = self.transform.looking_at(leftDirection, Vector3.UP)
        lookingFront = false
        lookingLeft = true
        lookingRight = false
        lookingBack = false
    else:
        nextPosition = global_transform.origin + Vector3.LEFT
        positionChanged = true

elif Input.is_action_just_pressed("Right"):
    if !lookingRight:
        rotationDirection = self.transform.looking_at(rightDirection, Vector3.UP)
        lookingFront = false
        lookingLeft = false
        lookingRight = true
        lookingBack = false
    else:
        nextPosition = global_transform.origin + Vector3.RIGHT
        positionChanged = true

elif Input.is_action_just_pressed("Back"):
    if !lookingBack:
        rotationDirection = self.transform.looking_at(backDirection, Vector3.UP)
        lookingFront = false
        lookingLeft = false
        lookingRight = false
        lookingBack = true
    else:
        nextPosition = global_transform.origin + Vector3.BACK
        positionChanged = true

# Actualizar transformación para rotación
self.transform = self.transform.interpolate_with(rotationDirection, rotationSpeed * delta)

# Mover hacia la nueva posición si es necesario
if positionChanged:
    global_transform.origin = global_transform.origin.move_toward(nextPosition, movementSpeed * delta)
1 1 respuesta
Sawi

Mañana le doy una vuelta. Muchas gracias!

kidandcat

Para hacer movimiento por casillas, divide las posiciones entre el ancho que quieras de la casilla. Si lo haces como lo estas haciendo, se te va a descuadrar antes o después.

Y sobre lo que te pasa ahora mismo, mirando tu codigo por encima, para las direcciones estás usando un vector unitario, y el move_forward nunca va a sobrepasar el target que le pases, al menos metele más distancia por si acaso (pero ya te digo que no es la mejor forma de hacerlo).

Por otro lado la documentación dice esto sobre Vector3.FORWARD:

Forward unit vector. Represents the local direction of forward, and the global direction of north. Keep in mind that the forward direction for lights, cameras, etc is different from 3D assets like characters, which face towards the camera by convention. Use MODEL_FRONT and similar constants when working in 3D asset space.

Así que deberías usar MODEL_FRONT.

Soluciona esas cosas y a ver si ya no tienes el problema, y si sigues teniéndolo, pon cómo tienes las escenas y demás, sino poco podemos probar.

Suerte!

1 1 respuesta
Sawi

#6 Pues he probado esto por curiosidad y falla de la misma forma que lo que yo tengo. Voy a intentar estudiar el mensaje de @kidancat, pero después del curro llego con el cerebro frito xD.

A ver si hay suerte

K

Buenas, todavia no tuve la oportunidad de probar el codigo en mi computadora, pero de base te recomiendo usar las posiciones globales siempre que sea posible ya que las relativas a veces funcionan un poco raro

1
9 días después
Sawi

Os pongo un poco al día.

Acabo de solucionar el marrón aprendiendo a usar tweens xD

Aun así no termina de estar bien por lo que comentó #8 , y se me va descuadrando. Pero bueno, paso a paso.

Menuda aventura es esto de intentar hacer videojuegos.

Usuarios habituales