Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: bygdle en Enero 05, 2016, 12:47:43 AM

Título: ¿Cómo "conectar" un objeto creado por un script al valor devuelto por el mismo?
Publicado por: bygdle en Enero 05, 2016, 12:47:43 AM
Buenas, estaba haciendo un pequeño sistema que se basaba en usar un script para crear un objeto y modificar las propiedades del mismo desde el script. Todo anda perfecto, pero hay un script que crea un objeto algo "especial" que "debería" reaccionar ante la respuesta del juegador. Algo similar a un show_question. Ese objeto "pregunta" tiene dos posibles opciones, y mi pregunta es: Cómo hacer para enviar la respuesta del usuario por el script, algo como conectar el script con el objeto, algo como esto:
[gml]
respuesta = el_script_xd();
[/gml]

Donde el_script_xd() es el script que crea este objeto pregunta, y debería dar el valor a la variable respuesta dependiendo de la elección tomada por el usuario. Si, prácticamente lo mismo a un show_question()

He pensado usar estructuras de datos, pero no me parece muy eficaz para al macenar UN SÓLO DATO.
Gracias de antemano
Título: Re:¿Cómo "conectar" un objeto creado por un script al valor devuelto por el mismo?
Publicado por: jmbs19 en Enero 05, 2016, 01:10:46 AM
niu no comprendo muy bien tu pregunta, esta parte

Cita de: NiuWeb en Enero 05, 2016, 12:47:43 AM
Donde el_script_xd() es el script que crea este objeto pregunta, y debería dar el valor a la variable respuesta dependiendo de la elección tomada por el usuario. Si, prácticamente lo mismo a un show_question()

me hace pensar que tienes mas de un script que crea el mismo objeto, por decir script1(), script2().

siendo este el caso seria tan facil como colocar desde el mismo script un identificador del script. me explico

[gml]
//dentro del script 1
obj=instance_create(obj_pregunta,x,y)
with obj
{
llamada = 1
}
//dentro del script 2
obj=instance_create(obj_pregunta,x,y)
with obj
{
llamada = 2
}
//dentro del obj_pregunta
if //lo que sea que gatille la pregunta
{
   switch(llamada)
      {
          case 1:
          script1();
          break;
          case 2:
          script2();
          break;
      }
}
[/gml]

no se si esto solucione tu pregunta porque de verdad no la entendi muy bien.  XD

ps: niu el icono del tema
Título: Re:¿Cómo "conectar" un objeto creado por un script al valor devuelto por el mismo?
Publicado por: bygdle en Enero 05, 2016, 01:33:51 AM
Oops, se me pasó el ícono, gracias por recordarme :-[

Bueno, quizás fue culpa mia, no soy bueno explicándome, así que lo hago de nuevo algo mejor explicado (creo):

Imagina el mensaje que se muestra al llamar la función show_question(), a este mensaje le llamaremos Pedro.

Tengo un script que crea un objeto que simula a Pedro, y ya está completo, funciona perfecto, le llamaremos Martín. Pero quiero que, por ejemplo, si se elige la opción 1 de Martín, el script que lo creó devuelva, por ejemplo, 1, y si se elige la opción 2, el script que creó a Martín devuelva 2.
Título: Re:¿Cómo "conectar" un objeto creado por un script al valor devuelto por el mismo?
Publicado por: jmbs19 en Enero 05, 2016, 01:43:01 AM
no te comprendo  XD

tienes un script que crea un show question o un objeto que es creado por el script?

de todas maneras no podrias hacer algo como lo que te dije arriba? lo de asignarle un id al objeto creado y que a partir de ese id el objeto llame al script con un argumentx

y si el show_question es desde el mismo script usa una condicion en la respuesta que realice la llamada al script.
Título: Re:¿Cómo "conectar" un objeto creado por un script al valor devuelto por el mismo?
Publicado por: bygdle en Enero 05, 2016, 01:55:50 AM
 XD XD XD XD XD XD :-[ :-X
Me rindo xD

Bien, el script que tengo crea un objeto, y este objeto simula a Pedro (ya sabes qué es, mensaje anterior), es como un "Pedro personalizado". ¿ok?
Este objeto Pedro personalizado (Llamado Martín) desactiva todas las instancias y muestra la pregunta, así:
(https://i.gyazo.com/5fe0e4ab73b7dc0b5ce219525381b529.png)

Los botones se controlan con el evento step, así:
[gml]
if mouse_check_button_pressed(mb_left) //Si se presiona el mouse
{
    if mouse_x < minBHL2 and mouse_y > minBVL and mouse_x > maxBHL2 and mouse_y < maxBVL //Y el mouse está en el botón 1
     {
        instance_destroy();
        instance_activate_all();
        sprite_delete(spr);
     }
   
    if mouse_x > minBHL and mouse_y > minBVL and mouse_x < maxBHL and mouse_y < maxBVL //Y el mouse está en el botón 2
     {
        instance_destroy();
        instance_activate_all();
        sprite_delete(spr);
       
     }
}
[/gml]

Y llamo al script que crea a Martín así:

[gml]
respuesta = crear_a_martin();
[/gml]

Y lo que quiero es, al momento de que el usuario presione el botón "Sí, Martín", la variable "respuesta" coja el valor de 1 (por ejemplo), y si presiona el botón "nope, no sé", la variable "respuesta" coja el valor de 2 (por ejemplo).

Tercer intento, a ver si me explico...xDDDD
Título: Re:¿Cómo "conectar" un objeto creado por un script al valor devuelto por el mismo?
Publicado por: jmbs19 en Enero 05, 2016, 02:16:23 AM
ok, creo que ya te entiendo, quieres guardar el resultado del script (lo que escoja la persona) en "resultado"

bueno en primer lugar te tengo que decir que necesitas si o si un return, en segundo es necesario parar la ejecucion del codigo completamente, como lo hace un get_string. porque? porque el return retorna el valor final entonces si no hay nada que retornar pues error si no declaraste y si la declaraste te envia el valor declarado.

te explico el return con el siguiente script de como debe de ser mas o menos el funcionamiento de get_string

[gml]
//dentro del get_string
/*el codigo que crea la caja de texto y lee el resultado*/
if boton=1
resultado = texto_en_pantalla
return resultado

//dentro del objeto

variable = get_string("asdas","")
/*a variable se le asigna el valor del return que dentro del script es resultado*/

[/gml]

habiendo establecido el funcionamiento del return con respecto a tu pregunta deberias de hacerlo directamente desde el script, no desde otro objeto. ya que hasta donde se no hay manera de asignarle un valor retornado de un objeto a un script, solo de script a objeto/script

entonces seria algo asi

[gml]
//script1
resultado=script2
//script2
variable ="cualquier cosa"
return variable

[/gml]

esto asigna a "resultado" el valor de "variable"
Título: Re:¿Cómo "conectar" un objeto creado por un script al valor devuelto por el mismo?
Publicado por: bygdle en Enero 05, 2016, 02:27:20 AM
Muero de risa XD XD
Vamos, el return lo he sabido usar hace miles de siglos XD
El problema que tengo es como hacer que el script devuelva un valor dependiendo de lo que haya elegido en OTRO objeto. No sé hacer que el resultado del script dependa del resultado dado por el objeto, es eso. El return lo uso a diario, haciendo miles de scripts a diario para practicar, lo manejo perféctamente.

Sigo explicando, pero esta vez, le mezclo pseudocódigo:
Un script, llamado crear_a_martin(), así:
[gml]
crear_instancia (martin);
return (seleccion_de_martin);
[/gml]

Y en Martín, tengo en un step:
[gml]
if boton_1_presionado()
seleccion = 1
if boton_2_presionado()
seleccion = 2

with crear_a_martin //Sí, imagina que el script es un objeto...xD
seleccion_de_martin = other.seleccion
[/gml]

Y con esto, se supone que el script devolvería un valor DEPENDIENDO DEL OBJETO MARTIN, no simplemente un valor ddo en el propio script.
Y no puedo poner en el script esto:
[gml]
obj = instance_create(0,0martin);
return (obj.seleccion)
[/gml]
Porque el valor de "seleccion" de Martín se defina en su STEP, evento que no toma el script. En create el valor de "seleccion" siempre es 0, por lo que saldrá mal sí o sí
Título: Re:¿Cómo "conectar" un objeto creado por un script al valor devuelto por el mismo?
Publicado por: jmbs19 en Enero 05, 2016, 02:40:51 AM
niu precisamente por eso te digo que un return no se puede hacer de un objeto a un script, solo alrevez, ademas los script no son objetos, por lo que no le podemos asignar un valor si no lo pasamos por argumentos o las variables que utiliza ya las creas en el objeto que llama al script antes de la llamada

lo unico que se me ocurre es algo asi

[gml]
//dentro del script
resultado = argument0
if resultado =0
{
instance_create(obj_pregunta)
exit;
}
if resultado = 1
{
//lo que sea que aga con el 1
exit;
}
if resultado = 2
{
//lo que sea que aga con 2
exit;
}
//dentro del objeto que hace la llamada
script(0)
//dentro del obj_pregunta
if pregunta = 1
script(1)
if pregunta = 2
script(2)
[/gml]
Título: Posible Solucion
Publicado por: arcangelcaos en Enero 05, 2016, 09:46:24 AM
Hola, no termine de enterderte bien, pero haber si asi te vale o te orienta.

Supongo que la respuesta la guardas en una variable de un objeto, no se cual.

ObjetoUno.Respuesta

llamamos al script
CrearAMartin(Respuesta)

EN EL SCRIPT
aux = instance_create(martin)
aux.boton = argument0  // siendo este argumento la respuesta pasada al script
Título: Re:¿Cómo "conectar" un objeto creado por un script al valor devuelto por el mismo?
Publicado por: bygdle en Enero 05, 2016, 05:20:45 PM
NOOOOO!!!!!!! :'( :'( :'(
¿Por qué no me entienden? Lo he explicado lo mejor que puedo! :'( :'(

No necesito hacer eso que muestra arcangelcaos, no es eso. Es lo que dije hace poco:

Martin es un objeto que simula el cuadro de diálogo que se muestra al llamar la función show_question(), tiene un mensaje y dos opciones: Sí ó No.

El script que crea a Martín se llama crear_a_martin(), y éste no necesita argumentos, sólo crea a Martín (Con algunos extra, pero no vienen al caso). Lo que necesito es que ESE SCRIPT, el script crear_a_martin(), devuelva 1 si se ha presionado el botón "Sí" de Martín, y devuelva 2 si se ha preionado el botón "No" de Mrtín. ¿Vamos bien?

Es exactamente lo mismo que el show_question(), ¿Entendido?

Bien, cuarto intento, y espero que no falle :'(
Título: Re:¿Cómo "conectar" un objeto creado por un script al valor devuelto por el mismo?
Publicado por: kostra en Enero 05, 2016, 05:56:32 PM
iba a postear un tema muy parecido, con problemas con el return, que no tiene sentido y fijo es una tontería, esperaré a ver cómo va aqui jeje
Título: Re:¿Cómo "conectar" un objeto creado por un script al valor devuelto por el mismo?
Publicado por: Clamud en Enero 05, 2016, 05:56:52 PM
Parece que ya entiendo lo que quieres hacer, y aunque tú mismo lo has explicado era difícil de entender, se trata de simular la función show_question, pero con un nombre muy confuso "crear_a_martin()", y el cuadro diálogo es una instancia del objeto martín.
Ahora quieres que el mismo script devuelva el valor del botón que se presionó en el cuadro de diálogo; eso no se puede hacer en el mismo step, porque se requiere que el cuadro detecte los eventos de presión del ratón. Lo mejor sería que el cuadro asigne una variable global y que en el evento Step de la instancia que lo creó se revise el valor de la variable.
Título: Re:¿Cómo "conectar" un objeto creado por un script al valor devuelto por el mismo?
Publicado por: bygdle en Enero 05, 2016, 05:59:54 PM
Entonces, ¿Sólo me queda esa opción?, lo que sucede es que no veo muy bien el hacer eso con variables, pero si no me queda de otra, pues qué se le hace :'(
Título: un objeto creado por un script al valor devuelto por el mismo?
Publicado por: arcangelcaos en Enero 05, 2016, 11:02:27 PM
DESDE DONDE SEA (llamesmole Script1)
if !object_exisist(martin)
{crear_martin()}
else
{return martin.seleccion; with(martin) {instance_destroy}}

CREAR MARTIN
aux = instance_create(x,y, martin)
aux.seleccion = 0

EN EL STEP MARTIN
if mouse_check_button_pressed(mb_left) //Si se presiona el mouse
{
    if mouse_x < minBHL2 and mouse_y > minBVL and mouse_x > maxBHL2 and mouse_y < maxBVL //Y el mouse está en el botón 1
     {
        instance_destroy();
        instance_activate_all();
        sprite_delete(spr);
        seleccion = 1
     }
   
    if mouse_x > minBHL and mouse_y > minBVL and mouse_x < maxBHL and mouse_y < maxBVL //Y el mouse está en el botón 2
     {
        instance_destroy();
        instance_activate_all();
        sprite_delete(spr);
        seleccion = 2
     }
}

if selección > 0 {Script()} 


// una vez tiene valor, se vuelve a llamar al script principal, y como ahora existe el objeto, no lo crea y pasa a la siguiente acción. La cosa es que no existe algo como para el código hasta que.., por lo tanto el código sigue ejecutándose, con algo asi debería de valerte.
Título: Re:¿Cómo "conectar" un objeto creado por un script al valor devuelto por el mismo?
Publicado por: bygdle en Enero 05, 2016, 11:18:19 PM
Vale, gracias igual. Lo que sucede es que no funciona de la manera en que quiero, ya que tendría que ejecutar 2 veces el script, y no devolvería el valor en donde se llamó por primera vez el script (donde debería) sino que en la segunda (desde el objeto martin) porque la primera vez que se ejecutó el script no devolverá el valor que es por eso mismo, porque ya se ha ejecutado
Pero ahora pensándolo bien, parce imposible lograr lo que quiero, pero bueno. Gracias a todos los que redpondieron, usaré variables globales que es la única forma de conectarlos de una u otra forma mezcladas con el código que me han dado, a ver si surge una pequeña criatura del experimento (626 xD)