Buenas.
?Alguien sabe si se puede pasar una expresi?n como argumento en un script?
Supongamos que tengo el siguiente script llamado scr_prueba1 que se ejecuta en el evento de creaci?n de una instancia
[gml]
var_expresion=argument0;
[/gml]
donde argument0 es una expresi?n, digamos, "variable1>variable2". variable1 vale 0 y variable2 vale 5, por lo que la expresi?n es falsa y la variable var_expresion tendr?a por valor false. Sin embargo, en el evento step tenemos otro script, llamado scr_prueba2, que dice lo siguiente
[gml]
if (var_expresion=true){
//Expresi?n verdadera
}
else{
//Expresi?n falsa
}
[/gml]
En el bucle se ejecutar?a la segunda parte, la excepci?n, pues 0 es menor que 5 por lo que variable1 no es mayor que variable2. El problema es que si los valores de variable1 y variable2 se invierten y la expresi?n pasa a ser verdadera, el valor de var_expresion no cambia, pues lo que var_expresion guarda es un true o un false, no la expresi?n (variable1>variable2). Esa es mi pregunta. ?Existe alguna forma de guardar no el valor de una expresi?n, si no la expresi?n misma en una variable? No guardar constantemente el valor de la expresi?n, pues eso podr?a hacerlo utilizando el mismo script que uso al principio, scr_prueba1, en el evento step, si no la expresi?n. Quiz?s se pueda guardar como una string, pero luego no se c?mo volver a pasarlo como expresi?n en un script, adem?s de no saber qu? tan ?ptimo ser?a hacerlo de ?se modo.
Eso. Ayuda por favor :c y muchas gracias de antemano.
hay una forma que ser?a usando la funci?n execute_code (busca en el manual para m?s info), pero ser?a terriblemente lento, aunque si solo quieres hacerlo para una unica expresi?n y no hacerlo 50 veces por cada step creo que estar?a bien...
suerte!!
Cita de: Ciberman en Enero 11, 2012, 09:47:02 PM
hay una forma que ser?a usando la funci?n execute_code (busca en el manual para m?s info), pero ser?a terriblemente lento, aunque si solo quieres hacerlo para una unica expresi?n y no hacerlo 50 veces por cada step creo que estar?a bien...
suerte!!
Ademas de que no funcionaria en versiones pr?ximas de gm ): ni gm html5.
Calio podr?as decir para que necesitas realmente guardar las expresiones?, se me ocurre algo pero periferia estar seguro de para que lo quieres, ya que en realidad lo que escribes puede ser f?cilmente echo de otra manera.
Hola, yo usaria 2 scripts, uno para para la expresion y otro para el script_prueba2:
script_expresion:
[gml]
{
return(variable1>variable2);
}[/gml]
script_prueba2:
[gml]
{
var_expresion=script_expresion();
if(var_expresion)
{
//...
}
else
{
//...
}
}
[/gml]
Saludos.
Exacto puede ser f?cilmente echo como lo escribiste Zeit, pero tengo la teor?a de que lo quiere para algo mas complicado :D.
Cita de: brunoxzx en Enero 11, 2012, 10:44:24 PM
Exacto puede ser f?cilmente echo como lo escribiste Zeit, pero tengo la teor?a de que lo quiere para algo mas complicado :D.
Si, de hecho estaba pensando que no entiendo el problema, creo que deberias explicarlo mejor...
EDIT: dejame ver si lo entendi...
tienes 2 variables...
al momento de crear una instancia c/u tiene un valor inicial...
las comparas mediante una expresion...
el resultado es un boolean (true/false)...
en el tiempo de vida de la instancia queres que esa variable boolean sea fija a pesar de que las variables cambian...
como consecuencia se ejecutan ciertas expresiones que dependen del boolean fijo...
es esta tu duda???
?Muchas gracias a todos por su ayuda! :D
Ok, voy a explicar mi problema en extenso, pero les advierto que va a ser un poco largo y aburrido de leer.
Ver?n, estoy reescribiendo un motor de plataformas, y ?sta duda surge por un asunto con los di?logos.
El sistema de di?logos que hice define las l?neas de di?logo en el c?digo de creaci?n de cada instancia. Actualmente las guarda en arreglos unidimensionales. Se me ocurri? que ser?a bonito poder hacer que los NPC tengan l?neas de texto din?micas, por ejemplo, que digan cosas en contexto antes y despues de lograr un objetivo, y para eso necesito ocupar arreglos bidimensionales.
[gml]
//Antes
if (variable_global_array2_get("trigger",scn_dungeon5c,0)=true){
dialog_set_line("?Gracias por matar al monstruo malo!");
}
else{
dialog_set_line("Hay un monstruo malo que nos pega en la mazmorra :(");
}
//Ahora
dialog_set_line("Hay un monstruo malo que nos pega en la mazmorra :(",0);
dialog_set_line("?Gracias por matar al monstruo malo!",1);
[/gml]
En el motor anterior, sencillamente lo estaba haciendo recurriendo a chequear interruptores al definir las l?neas de texto en el c?digo de creaci?n de la instancia, sin embargo eso conlleva un problema. Supongamos que uno activa un interruptor en la misma habitaci?n que quiere cambiar el di?logo de un personaje. El di?logo nuevo s?lo se mostrar?a cuando la habitaci?n vuelva a cargarse y la instancia vuelva a crearse. Para ?sto, necesito hacer que el c?digo chequee qu? ?ndice ocupar al comenzar a leer las l?neas del arreglo bidimensional. Ahora, como cada posible di?logo estar?a vinculado a distintas posibles condiciones, necesito una forma de definir din?micamente, es decir, sin echarle mano al c?digo de los actores, qu? variable chequear, por lo que necesito pasar un argumento que impique guardar el nombre de una variable, m?s no su valor, que ser?a chequeado en otro script posteriormente.
Camino a casa estuve pensando que, dado que ocupo s?lo una variable para guardar todos los interruptores, quiz?s la soluci?n implique requerir tres argumentos en el script, dos para la variable de interruptor (para hacer las cosas m?s manejables, el primer ?ndice de la variable de interruptores es la room en la que se activa y la segunda es su n?mero identificador :B) y el n?mero del ?ndice del banco de l?neas de di?logo que corresponde a esa variable, entonces, ?stas quedar?an almacenadas como
[gml]
interruptor_necesario[indice_dialogo,0]=indice1_interruptor;
interruptor_necesario[indice_dialogo,1]=indice2_interruptor;
[/gml]
y as? todo se soluciona :D
La soluci?n mediante execute_string la supuse, pero es lenta y no es buena idea. La soluci?n de Zelt parece la m?s viable si tuviese que hacerlo con m?s de una variable, pero como s?lo ocupo una variable me parece que ya lo solucion?.
?Much?simas gracias a todos, nuevamente! :D
Veo que el tema est? solucionado, pero... ?Por qu? us?s variable_global_array2_get? Tiene las mismas desventajas que execute_string.