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
8 días después
Yerboth

Estoy trasteando aprovechando los assets que he hecho para la Jam y me pasa algo con un shader que no entiendo del todo.

Quiero ponerle un outlline al player pero lo estoy montando a partir de varios sprites, básicamente el monigote y el arma que gira a donde apunte el mouse. Para que el shader funcione haciendo el outline al conjunto de los sprites y no a los dos por separado, los he metido en un CanvasGroup y le aplico el shader a éste.

Ví la solución por reddit con el shader ya adaptado a CanvasGroup y funcionó perfecto:

Peeero cuando toco los Z Index todo se jode. Quiero que cuando el player está mirando hacia arriba, el arma se pinte tras él, así que he cambiado los Z Index para ir ajustándolos por código, en el momento en el que el ZIndex del sprite o del arma son distintos de 0, el shader ya no se aplica, he probado a tocar el Z Index del CanvasGroup pero se la pela. ¿Alguna idea?

El shader es este, según el tipo de reddit ha usado el de los ejemplos de Godot adaptándolo porque el CanvasGroup usa SCREEN_*, supongo que por ahí viene el problema, pero no controlo de shaders como para entender qué tiene que ver aquí el Z index

spoiler

No sé si hay otra forma de ordenar capas sin tocar el Z Index o si no la alternativa es tocar los viewports, que he visto algo por youtube pero parece más complicado, pensaba que con el CanvasGroup me había librado pero ahora ya ni idea.

1 respuesta
DevilJin

#1011 usar shaders es trampa

XD

Ni idea no he tocado shaders nunca

1 respuesta
Yerboth

#1012 buf pues solucionan bastantes papeletas, en otro proyecto los tengo para distintos efectos de golpe, el rastro del dash y alguna cosilla más, eso sí los pillo ya hechos y toco lo justo para no romperlos xD

1 respuesta
DevilJin

#1013 es que no tengo ni idea de cómo se usan , pero vamos que he sido tan cutre que ni animaciones ni nada

vasketahd

A ver si alguien sabe algo. Cree una plataforma en movimiento y mi personaje a veces salta más si está en esta plataforma, alguien sabe el motivo? Por la velocidad de la plataforma? Por si hay alguna manera facil de solucionarlo sino lo dejare asi xD

2 respuestas
kidandcat

#1015 Le has activado el check de que es una plataforma? (lo tienen los characterbody creo)
Igualmente, lo mejor es que siempre capes las velocidades, puedes hacerlo con un simple

if velociy.y > MAX_VELOCITY: velocity.y = MAX_VELOCITY

algo asi pero con el length del vector.

2 respuestas
vasketahd

#1016 es un AnimatableBody2D vere lo de capar la velocidad

Ridote

#1016 clamp(valor, min, max)

#1015 a riesgo de parecer un pedante, te has mirado la documentación?

Property Descriptions¶
bool sync_to_physics = true

void set_sync_to_physics ( bool value )

bool is_sync_to_physics_enabled ( )

If true, the body's movement will be synchronized to the physics frame. This is useful when animating movement via AnimationPlayer, for example on moving platforms. Do not use together with PhysicsBody2D.move_and_collide

1 respuesta
vasketahd

#1018 Eso viene activado de serie pero no me funciona bien. Seguiré investigando sino cambiaré la plataforma.

1 respuesta
kidandcat

#1019 Los CharacterBody's ahora tienen un apartado de plataformas:

Mira a ver si van por ahi los tiros