[Godot] Pasar valores entre arrays

voidlaw

Bueno es una pregunta un poco chorra pero tengo curiosidad para ver como lo hacéis vosotros. Tengo este código:

var array1 = [Escena_instanciada1, Escena_instanciada2]
var array2 = [ ]

array2.append(Escena_instanciada1)
array1[0].queue_free()

Luego si miro que hay en el array 1 y 2 me sale esto:

array1 = [ [deleted_object] , Escena_instanciada2 ]
array2 = [ [ deleted_object ] ]

Pero lo que yo quiero es que en el array2 se guarde lo que hay dentro de la escena instanciada, no la escena instanciada en si misma.

B

slice()

1 respuesta
Ridote

#2 No hay slice aún.

#1 En lugar de queue_free por qué no haces un array1.remove(0)?? Creo que eso te lo quita del array sin removerlo del tree. Si explicas con más detalle lo que estás haciendo con eso igual podemos discutir las mejores formas de implementarlo.

Edit: https://docs.godotengine.org/en/3.1/classes/class_array.html#class-array-method-remove

2 1 respuesta
voidlaw

#3 Estoy haciendo un juego de cartas y lo he estructurado con 3 arrays uno para el mazo, otro para la mano y otro para la pila de descartes. Cuando robas del mazo la carta se instancia, se elimina del mazo y se añade a la mano, cuando tiras la carta de la mano se elimina de la mano y se añade a la pila de descartes. Justo en este paso es donde tengo problemas porque si uso el remove la carta continua estando en el tablero, aunque se haya eliminado de la mano.

Edito: Las cartas las he hecho como una Area2D (ignoro si es lo mejor)

2 respuestas
Kalgator

#4 pues antes de meter el remove le quitas la visibilidad, asi te la mueves a uno de los 3 array pero no te cargas la carta en si

Por que el remove lo quita del array, pero sigue manteniendo su posición y todo :P

eso, o haces que la posición de la carta sea la pila de descartes dibujada

1 respuesta
voidlaw

Muchas gracias por las respuestas!

#5 Es lo que he acabado haciendo pero no sabía si era correcto eso de ir instanciando y quitarles la visibilidad

1 respuesta
Ridote

#4 En cuanto al Area2D, y esto está ya un poco fuera de tu pregunta original, ¿para qué utilizas exactamente el Area2D? Presupongo que hay colisiones de algún tipo, ¿no?

2 respuestas
Kalgator

#6 A ver, si lo mueves de array sigue manteniendo su posición, tendrás que cambiarla de alguna forma, o le quitas la visibilidad (es lo que veo como chapuza), o yo lo que haría sería en el tablero montar una pila de descartes, y la movería ahi y que se viera la ultima carta descartada

#7 Debería usar un Sprite, dudo que tenga ninguna colisión

1 1 respuesta
voidlaw

#7 No tienen colision las cartas, al final me decante por el area2D precisamente porque no había colisiones.

#8 Hostia haré eso! Muchas gracias, no se como no había caído en moverlas dentro del juego en lugar de irlas eliminando e instanciando todo el rato :sweat_smile:

2 respuestas
MisKo

#9 Buenas, Yo tengo una duda en esto que pones que no termino de entender a que te refieres:

Pero lo que yo quiero es que en el array2 se guarde lo que hay dentro de la escena instanciada, no la escena instanciada en si misma.

Sin saber exactamente como funciona tu juego, yo lo plantearía asi:

  • arrayMazo = [ datosCarta1, datosCarta2 ]
  • arrayDescartes = [datosCartaDescartada1, datosCartaDescartada2 ]
  • arrayMano = [ cartaInstanciada1, cartaInstanciada2 ]

En el momento que me descarto una carta ( entiendo que no se va a utilizar en el juego, por lo que no es necesario seguir teniendo la instancia en memoria ), guardo los datos relativos a la carta en el array de descartes, la quito del array, le hago queue_free, y listo.

Cuando en arrayMazo y arrayDescartes pongo 'datosCarta', me refiero a lo que necesitas para instanciarla, por ejemplo:

  • { tipo:'Picas', numero: 7 }
  • { tipo:'Diamantes', numero: 10 }
1 1 respuesta
Ridote

#9 No uses un Area2D, usa un Sprite simplemente entonces. El Area2D detecta colisiones aunque no influya en las físicas ni te mueva a otros objetos. Pero deteca cuando otro objeto entra en el area y si no estás usando eso es mejor usar simplemente el sprite, no?

1 respuesta
voidlaw

#10 Sii! Eso es lo que quería hacer, con el ejemplo que has puesto creo que ya he pillado exactamente como hacerlo.

Los descartes son importantes porque cuando se acaba el mazo, la pila de descartes se convierte en el mazo.

#11 Hmmm, solo usaba una area2d para hacer la mecánica de drag and drop (lo hice con area2d por pura vagueria, ya que ya tenia un juego hecho con esa mecánica), con solo el sprite me valdria?

1 respuesta
Ridote

#12 ¿Qué haces exactamente para eso? ¿Utilizas algo que esté en Area2D pero no esté en Sprite? La verdad es que no lo sé, no he hecho nada drag and drop y tendría que mirarlo luego en casa con más calma. En la docu sueles tener toda la funcionalidad de los nodos, cuanto más sencillo sea lo que hagas mejor pero tampoco te rayes tanto que por poner un area2d o un sprite sin area2d no te va a cambiar radicalmente la eficiencia del juego.

Cuando tengas algo para poner un clip corto hazlo. ¿Qué tipo de juego es? Abre hilo!! Me molan los juegos de cartas y me tienes intrigado.

1 respuesta
voidlaw

#13 Ahora lo he estado mirando, uso la función input_event() de los nodos CollisionShape2D (cuando haces click basicamente sigue al raton, hasta que sueltas el click) así que tienes toda la razón y el area2D la estoy desaprovechando! Lo he cambiado a un Sprite con colision y ya esta :)

Respecto al juego es un juego con mecánicas muy parecidas al Dominion, cuando tenga algo minimamente hecho abriré hilo, de momento me quedan bastantes cosas básicas que solucionar, como por ejemplo como enseñar la mano :thinking:

1 respuesta
Ridote

#14 Creo que input event lo puedes usar también con un Sprite normal y corriente. Por cierto, hay funcionalidad ya hecha de drag and drop para nodos de control. No la he usado nunca y no tengo claro cómo funciona, pero puedes mirar por ahí. Si eso sirviese, no te haría falta usar ni un nodo de Node2D, y podrías hacerlo todo usando sólo nodos de Control, ya que para un juego de cartas debería ser suficiente. Luego por la tarde si tengo tiempo le puedo echar un ojo.

He encontrado esto con uns búsqueda rápida:
https://www.reddit.com/r/godot/comments/7ystqs/drag_and_drop/
https://github.com/godotengine/godot-demo-projects/tree/master/gui/drag_and_drop

Igual eso te vale!

1 1 respuesta
voidlaw

#15 Muchas gracias! Justo antes de ponerme a hacer la mano del jugador me pondré a leer un poco sobre como recomiendan hacer las cartas que yo he ido super yolo.

También tengo pendiente mirarme este proyecto: https://www.youtube.com/watch?v=0ih4K1lZy_E

1

Usuarios habituales