#989 era una coña, pensé que era más obvio. Pero sí, yo peco de eso. Pero también te digo mi motivación no es terminar, es implementar funcionalidades y divertirme en el proceso
Hola de nuevo viene MrDudas MrNovato. Pensando en que hacer pa la jam (esta juro que si la acabo ) quería hacer una especie de plataformas 2d pero con historia es decir que en X momento saliese un dialogo y luego siguiese el juego. ¿Como de dificil es esto en godot? ¿Teneis algun tutorial decente? Gracias!
Por si alguien se le ocurre , para la jam estoy haciendo un mapa en el que cada punto es un nodo2D, dentro de esos nodos suceden cosas que te mandan a otra escena
Hasta ahí guay, el problema es , cuando termino en la otra escena y vuelvo al mapa normal, me empieza en la casilla original
¿Hay alguna manera fácil de guardar el estado de la escena?
#995 Antes de cambiar de escena, almacena los valores actuales del mapa, imagino que la posición desde donde entras. Luego al cargar el mapa de vuelta, lee esos valores para dejar el estado igual.
Puedes usar un singleton para ello. O si no te gustan; señales.
#998 Yo hasta que no me leí un poco sobre los patrones de diseño, no entendí como las señales me iban a ayudar.
Yo no soy programador y por eso me faltan esos conocimientos, pero las señales son básicamente el patrón de diseño llamado "Observador". En otros lugares se le conoces como Observer-Subscriber, pero son maneras diferentes de llamar a lo mismo. Te dejo un link, no relacionado con Godot, que si te lees los primeros párrafos te ayudarán a entender esta forma de programar:
https://refactoring.guru/es/design-patterns/observer
La explicación de este link es muy buena y lo explican con ejemplos sencillos. Luego te enseñan a implementarlo a bajo nivel, pero tú eso no lo tienes que hacer, pues Godot ya lo lleva implementado con las señales. La idea es que entiendas lo útiles que son.
edit: Y en esta misma web te explican los singleton (en Godot lo llaman Autoloads): https://refactoring.guru/es/design-patterns/singleton por si quieres tener una explicación fuera del mundo Godot y entender como funcionan.
#999 me pasa igual me dedico sobre todo al sql y al scripting, así que hay cosas de programación en las que soy bastante noob, le echaré un ojo también gracias! A ver si consigo entregar algo para la jam
Las señales por si solas no te sirven para lo que quieres, necesitas almacenar los datos en alguna parte que no se pierda con el cambio de escena, ahi entra el Autoload. Básicamente creas un script, lo configuras como autoload en la configuración del proyecto, y puedes acceder a él desde cualquier parte usando el nombre, y no se desmonta al cambiar de escena ni hagas lo que hagas, por lo que simplemente guardate ahi las variables que necesites.
Por ejemplo, si llamas a tu Autoload "State" al configurarlo, ve al script, crea una variable var current_point = 1
y puedes leerla y modificarla desde donde quieras con State.current_point
Para lo de crear un Autoload, ve al explorador de archivos de Godot (abajo izquierda) haz click derecho, crea un nuevo script, y luego vas al Project Settings (o configuración de proyecto) y tienes una pestaña "Autoloads".
#1001 Con señales puede hacerlo también. En el momento de cambiar la escena, almacena el valor de la posición donde se encuentra en el mapa y lo pasa a la siguiente escena. Al volver simplemente recupera ese valor y ya.
Parecido a como, en memoria, guardas la dirección de retorno en la pila, para volver al punto desde donde la llamaste al terminar la función.
Hay mucha gente que odia los singletons (yo no) aunque son muy útiles porque te ahorran código y siempre tienes esa clase cargada que sirve como cajón desastre para almacenar ahí lo que quieras y acceder desde cualquier lugar.
#1001 aahhh pues es lo que tenía montado pero me faltaba lo de autoload!!
Mañana pruebo a ver si me sale gracias !
#1002 eso lo intenté el problema es que algunas escenas no las tengo “linkadas” en la escena principal y no me deja enviar señales desde ellas y como son escenas “genéricas” que voy a reutilizar mucho pero cambiando cosas no sé si no se me complica mucho (lo he intentado de todas maneras pero me lío un poco con las señales y creo que no las invoco / recojo bien )
#1002 Las señales no almacenan nada, son una forma de comunicarse, un nodo emite una señal, y los que estén suscritos la reciben. Si tu emites una señal, y el nodo que quieres que la reciba todavía no está cargado porque no has cambiado de escena, cuando cambies de escena y lo conectes no va a recibir nada.
Las señales son para comunicación, no para almacenamiento.
PD: Por lo que dices, tiene toda la pinta de que estás hablando del patrón event bus: https://www.gdquest.com/tutorial/godot/design-patterns/event-bus-singleton/ (que al final no es más que un Autoload pero usas eventos para comunicarte con él)
#1003 Mírate esto: https://www.gdquest.com/tutorial/godot/design-patterns/event-bus-singleton
Como bien ha dicho Aikon, no empieces a meter morralla en el autoload y todo te irá bien, úsalo solo para las señales y lo que sea imprescindible que te perdure entre cambios de escena.
#1007 entiendo lo del singelton,
Estoy haciendo pruebas y creo que lo que pasa es que no puedo referenciar la variable como yo quiero, me explico:
Al iniciar el juego le asigno al personaje la posicion inicial del Nodo2d PI1, cuando me muevo a PI2, le intento meter al singleton el PI2 como dato en la variable, la variable se guarda como Nodo2D y un chorro de numeros
Al entrar en la siguiente escena se queda como freed la variable (que por lo que es visto es algo asi como un null)
Y al volver a la escena principal e intentar cargar el dato falla porque se ha quedado en Freed y no puede cargarlo.
He probado a guardar la posicion del nodo y eso si lo hace bien, el problema es que ahora ya no tengo el nodo de referencia donde estaba xDDDDDDDDDD.
Seguire investigando, pero entiendo que la referencia de los nodos se pierde al ser algo de memoria y cambiar de contexto
Edit
Estoy viendo que parece que con los nombres de los nodos puedo coger la lista de hijos y buscarlos, me falla al hacerlo desde el loop jugable pero me va si lo pongo a mano
Edit2
Por fin conseguido, con el nombre de los nodos funciona
#1008 Genial!, también puedes coger el path entero con get_path(), por si no quieres ponerte a buscar el nodo. Si no tienes ningún nombre de nodo aleatorio por el camino, te funcionará.