Godot #HO | Información General

Ridote

#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

1 respuesta
Jastro

#991 menudos gamedevs estamos hechos jajajajajajaja

Yo más o menos igual

1 respuesta
Ridote

#992 pero que lo importante es divertirse, si nos dedicáramos a esto profesionalmente ahora no estaríamos posteando estaríamos haciendo horas extras un viernes para llegar a fin de mes

1
vasketahd

Hola de nuevo viene MrDudas MrNovato. Pensando en que hacer pa la jam (esta juro que si la acabo :joy:) 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!

DevilJin

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?

2 respuestas
kidandcat

#995 https://docs.godotengine.org/es/4.x/tutorials/scripting/singletons_autoload.html

1 respuesta
AikonCWD

#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.

1 respuesta
DevilJin

#997 lo intenté con señales pero creo que algo estoy haciendo mal, también estaba haciéndolo con una escena para guardar una estructura de datos , pero algo no hago bien xD

#996 le echaré un ojo gracias!

1 respuesta
AikonCWD

#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.

1 respuesta
DevilJin

#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

kidandcat

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".

2 respuestas
AikonCWD

#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.

2 respuestas
DevilJin

#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 )

2 respuestas
AikonCWD

#1003 sin problema. Tira con singleton y podrás acceder a los datos desde cualquier parte, incluso a escenas completas.

1
kidandcat

#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)

1 respuesta
AikonCWD

#1005 Aaaaah, debe ser eso. Me lío con los términos todavía

kidandcat

#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.

1 respuesta
DevilJin

#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

1 respuesta
kidandcat

#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á.

1 respuesta
DevilJin

#1009 nada he sido muy vago, como el casillero tiene 40-60 casillas no me hacía falta xD, ahora me falta dar contenido a ellas, pero esto ahora me permite guardar cosas que necesitaba para darle algo más de chichilla

1

Usuarios habituales

  • kidandcat
  • AikonCWD
  • Ridote
  • Jastro
  • Kalgator
  • MisKo
  • Leos

Tags