[Godot] escena de enemigo, instanciada a través de un "Spawn Manager"

MartinDrk7

¡Buenas gente! Iba a preguntar en el hilo de Godot, pero por lo visto no es para dudas, y tampoco quería abrir uno para preguntar esto, aaaasi que.... Os explico (A los que controlen de Godot).

¿Cómo podría hacer que, una escena de enemigo, instanciada a través de un "Spawn Manager" en el nivel, pueda acceder a un nodo que está en el mismo nivel que contiene 2DPoints a forma de guía para el movimiento?

Os pongo foto para ilustrar un poco más a ver...

¡Gracias de antemano!

AikonCWD

#1

Se puede hacer de muchas maneras, a mí me gusta mucho trabajar con grupos. Se me ocurre que podrías añadir los Position2D dentro de un grupo "posición enemigo" y luego iterar sobre ese array de nodos de una manera fácil:

for posicion in get_tree().get_nodes_in_group("PosicionEnemigo"):

Otra opción es usar la función get_node("../MovementPoints/Position2D").position
Con el get_node() puedes recoger un nodo del arbol en cualquier nivel, usando el ../ para acceder a nodos de un nivel superior, como en un árbol de directorios.

3 respuestas
Ridote

#1

Así a bote pronto y medio dormido con mis capacidades cognitivas mermadas y si he entendido bien tu problema, yo lo que haría sería enfocarlo de otro modo. ¿Por qué no usas un PathFollow? Yo no reinventaría la rueda y usaría las herramientas de Godot: https://www.youtube.com/watch?v=_lJ0jbahbjw

En caso de que aún así quieras hacerlo a tu manera, siempre puedes al instanciar el elemento pasarle unos parámetros, por ejemplo la escena que contiene esos puntos. De ahí coges los hijos de la escena y te creas tu array de posiciones. Pero sigo pensando que parece un problema que se resolvería mucho mejor con un path follow.

1 respuesta
MisKo

#1

Sin pensarlo mucho, creo que lo ideal sería pasarle esos 'nodos2D' directamente al hijo que agregas a la escena.

Para ello, en el 'hijo' create una funcion, por ejemplo 'addWaypoint' que reciba un nodo Position2D y lo agregue al array.

En la escena 1, cuando creas el enemigo, recorres los MovementPoints y los vas pasando a 'addWaypoint' y, cuando has terminado, lo agregas a la escena.

Igual me he explicado fatal, pero aun no me he tomado el café :P

Ridote

#2 Yo cogerlo del árbol de escenas a lo bruto no lo haría porque luego vas a tener que tener mucho cuidado al hacer el resto de mapas de no liarla. Creo que es más modular pasarle el nodo con los hijos directamente en lugar de coger del root el nodo que sea. Que funcionar funciona...

MisKo

#2 Aunque eso te funcione, perderías la gracia de las 'escenas' de godot.

#3 La siguiente respuesta tb se te aplica a ti, puesto que tu le pasas la escena directamente al hijo (en la segunda opcion)

Lo ideal de usar Godot en escenas 'aisladas', es que puedas reutilizarlas en cualquier tipo de escena y, haciendolo como decis, ya estais condicionando a que todas las escenas tengan MovementPoints.

¿Que pasa si en otra escena tiene varios caminos y dependiendo de como está la escena tiene que asignarle uno u otro? No te vas a poner a tocar el hijo para ese caso en concreto....

Lo ideal es abstraer la funcionalidad, si el hijo necesita unos puntos, creas un método para pasarselos y es en la escena padre donde haces la lógica para determinar que puntos hay que pasarle al hijo pero en ningún caso, el hijo ha de recorrer elementos del padre.

1 1 respuesta
Ridote

#6

#3Ridote:

siempre puedes al instanciar el elemento pasarle unos parámetros

Pasarle unos parámetros desde un agente externo. No tiene ningún problema, has malentendido lo que he dicho, porque has dicho tú lo mismo luego. Tú el elemento lo instancias desde un agente externo, ese agente decide qué puntos pasarles, el hijo no sabe si le llegan unos puntos u otros, sólo sabe que tiene que seguir esos puntos.

De todas formas es reinventar la rueda, que use un pathfollow.

1 respuesta
MisKo

#7

instanciar el elemento pasarle unos parámetros, por ejemplo la escena que contiene esos puntos. De ahí coges los hijos de la escena y te creas tu array de posiciones

Te he mencionado por lo que marco en negrita, pasarle los parametros está bien, pasarle la escena no.

Además, que es justo lo que he puesto al mencionarte xDDD

...puesto que tu le pasas la escena directamente al hijo (en la segunda opcion)

:P

1 respuesta
AikonCWD

Os liáis mucho, a veces parece esto stackoverflow.

Él ha pedido:

#1MartinDrk7:

¿Cómo podría hacer que, una escena de enemigo, instanciada a través de un "Spawn Manager" en el nivel, pueda acceder a un nodo que está en el mismo nivel

Respuesta: get_node()

El parámetro de getnode podría ser un argumento, por ejemplo. Así podría funcionar si instancia eso en un árbol de estructura diferente. Las otras cosas que proponéis no responden a la pregunta original de #1

2 respuestas
Ridote

#8 Si quieres coger los puntos en el padre bien, pero mal van a estar ambas teniendo en cuenta que tienes herramientas que ofrece Godot para hacer eso que son más potentes, que te ofrecen más funcionalidad como interpolar como quieras los puntos por porcentajes o por distancia recorrida y que seguramente son hasta más fáciles de modificar porque no tienes que ponerte a crear escenas Position cada vez que quieras un punto nuevo.

#9 Responden a lo que en realidad quería preguntar xDDDD

2 respuestas
AikonCWD

#10

Estáis actuando tal que así:

1 respuesta
MisKo

#9 Tambien funciona concatenar 27 ifs en vez de un switch :man_shrugging:

#10 Sin conocer la funcionalidad real del juego, tampoco es plan de recomendar nodos. Lo mismo el lo llama guia para desplazarse pero son posiciones en el mapa y el 'enemigo' aparece y desaparece en ellas, no anda de una a otra.

De todas formas, si lo usa para andar, debería de mirarse el nodo que comentas porque seguramente le saque más partido, si simplemente es tener posiciones random, pues ya lo que el vea xD

#11 Estás bastante equivocado, hay mil formas de hacer las cosas y que funcionen y no por ello son todas correctas

AikonCWD

Él no ha preguntado cuál sería la mejor forma de hacer X.... él ha preguntado como hacer una cosa en concreto.
No estáis respondiendo a la pregunta de #1

Lo correcto es responder su pregunta Y LUEGO, SI QUIERES añadir una sugerencia, otras opciones o darle otro enfoque.

Vuelve a mirar la imagen del meme, ya que estáis haciendo exactamente eso.

2 respuestas
Ridote

#13 Pero si le hemos respondido a su pregunta y luego hemos dado una sugerencia... Bueno no, primero le he sugerido hacerlo de otra forma y luego le he respondido a su pregunta.

MisKo

#13 A ver, que no quiero desviar más el hilo

Ha preguntado como puede acceder el hijo a los nodos del padre, y la forma óptima es pasarselos a través de parámetros, cosas que le hemos dicho tanto @Ridote como yo. Además, @Ridote le ha dicho que si los va a usar en modo waypoints para andar, que utilice el nodo PathFollow

La opción que le has dicho tu también en #2 le vale, como te he dicho en el primer comentario que he hecho, pero es una chapuza y usar el mismo hijo en escenas con una estructura diferente no valdría.

La otra opcion que has dicho despues es la de pasarle por parámetro al hijo la RUTA para el get_node, y así solucionar los problemas que tiene la primera opción que has puesto y, aunque es mejor que la primera, sigue siendo un error a la larga.

Programar no consiste en hacer una ñapa para que me funcione ahora, consiste en tener un poco de visión a futuro y pensar en los casos que se podrían dar y estructurar las cosas bien desde el principio, por ejemplo:

  • Tengo varios tipos de enemigos, cada uno tiene su path ( a cada uno le pasarías la ruta en tu solucion y listo )
  • Tengo un tipo de enemigo que mezcla rutas de cada uno de los 2 tipos ( modificas el hijo para pasarle ahora 2 rutas?, te creas una sola ruta repitiendo los datos de las otras 2? )
  • Tienes un tipo de enemigo que solo utiliza media ruta de una existente (modificas el hijo para q solo coja la media ruta?, te creas una ruta nueva?)

Todo esto no lo ha planteado el usuario al preguntar y puede que ni siquiera sea necesario para su juego pero son casos que se pueden dar y que a la hora de programar hay que tener en cuenta.

Además, y sin querer dar más porsaco con el tema, Godot 'aisla' las cosas y tendrían que funcionar sin tener en cuenta al padre, por lo que hay que hacer los 'hijos' de manera que no accedan a nada que no tengan en su propia escena ( la del hijo )

Para no desviar el tema, podemos seguir por privado, o en la taberna, o no seguir y listo

2
MartinDrk7

¡Muchísimas gracias por todas las respuestas! Cuando me fui a dormir se me ocurrieron un par de formas y encajan con lo que me habéis comentado arriba,:laughing:. Respecto a lo de PathFollow no tenía ni idea de su existencia, así que le voy a echar un vistazo, pero a primera vista me encaja perfectamente para el comportamiento de los enemigos.

¡Muchas gracias nuevamente! :grin:

Usuarios habituales

  • MartinDrk7
  • MisKo
  • Ridote
  • AikonCWD