Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Drumpi on March 20, 2016, 07:02:00 PM

Title: ¿Se puede cambiar al padre de un proceso?
Post by: Drumpi on March 20, 2016, 07:02:00 PM
Hola a todos:

Pues esa es mi pregunta ¿se puede cambiar el padre de un proceso?
Me ha surgido un problema, porque he creado una serie de procesos "botón" a través de una función, los cuales sólo están activos si una variable llamada "int ventana_foco" contiene el valor del ID de su padre... pero como su padre es esta función que muere tras la creación, pues permanecen siempre inactivos.
Lo ideal sería poder modificar la variable local "father" de los procesos botón por el ID del proceso "interfaz_principal" que es al que deberían estar ligados, pero me parece recordar que si se hacía eso, todo el sistema interno de relaciones entre procesos de fastidiaba (ando confuso porque en Unity si te dejaba hacer eso, pero no lo recuerdo en BennuGD).

Temporalmente, lo que he hecho ha sido pasarle otro parámetro llamado "mi_padre", y comparar el valor de "ventana_foco" con este valor, pero no es una buena solución, porque el proceso botón pertenece al código del sistema de interfaz que había creado, y así se genera una incongruencia con el resto de elementos. Pero si no se puede modificar al padre, pues nada, lo dejo así, no me voy a morir :P
Title: Re:¿Se puede cambiar al padre de un proceso?
Post by: SplinterGU on March 21, 2016, 11:36:25 AM
no se puede...

por que matas al proceso padre? dejalo vivo pero dormido o cambia la logica...
Title: Re:¿Se puede cambiar al padre de un proceso?
Post by: Drumpi on March 21, 2016, 11:57:48 AM
Por lo dicho: es una función de actualización de una lista de elementos, que incluye una lista de botones.
Aunque puedo generar todos los botones desde el proceso de control, y mantenerlos vivos todo el tiempo... o desde el proceso "interfaz_principal", que es el que, al fin y al cabo, dependen para atender a eventos del ratón o no.

Es que esto es por la lista de mapas abiertos, que aparece en la parte derecha del editor de mapas tileados, que tiene una serie de posiciones (varía la cantidad en función de la resolución de la ventana), y dos botones para hacer scroll si hay más mapas que posiciones disponibles.
Mi idea era la de tener sólo los botones de los elementos existentes, para reducir los requisitos al mínimo, y la función refrescar (invocada sólo al crear o destruir un mapa) los creaba o destruía según necesidad.

Este es el código del botón (en realidad es un switch, que cambia de "seleccionado" a "no seleccionado", y envía su ID cuando cambia de estado a una variable, que suele recogerla el padre, identificarla, y actuar en consecuencia; se echan de menos los métodos de clases o las señales en estos casos :D )

process i_switch (x, y, z, file, int graph1, int graph2, int pointer is_actionevent,
                  int pointer is_focus, int is_father)
// GRAPH1:          switch off graphic
// GRAPH2:          switch on graphic
// is_ACTIONEVENT:  variable where to put ID if mouse clic it
// is_FOCUS:        variable who tells who have the focus
// Note: graphs always has their centers on (0,0) coordinates
private
    //int is_status;
begin
    graph=graph1;
    loop
      //say (*is_focus + "   " + is_father);
        if (*is_focus==is_father)
           
         if ((mouse.x < x) || (mouse.x > (x+graphic_info(file,graph,G_WIDE)-1)) ||
            (mouse.y < y) || (mouse.y > (y+graphic_info(file,graph,G_HEIGHT)-1))  )
           
            if (teclas[_RATON_LEFT][1]==1)
               if (graph == graph1)
                  graph = graph2;
                  //is_status=true;
               else
                  graph = graph1;
                  //is_status=false;
               end
               *is_actionevent=id;
            end
         end
           
        end
        frame;
    end
end


En teoría, un switch de estos sin el foco, no debería consumir recursos. Y con el foco tampoco, a menos que el ratón esté en la vertical del mismo. En la resolución estandar son 5 botones, pero se pueden ampliar a 20 en una resolución de 768p o 40 a 1080p, más o menos :P[/code]