GUI_SO (áreas de texto, botones, barras, tablas, menús, etc)

Started by Prg, January 05, 2011, 04:30:26 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Arcontus

Estoy teniendo un error inesperado al tratar de generar un desplegable de botones:

include "./GUI_SO.h"

FUNCTION inicializa_GUI()
PRIVATE
    string archivo[]="Cargar","Guardar","Salir";
    MAP_Estado;
END
BEGIN
    //uno para cuando está sobre botones y listas y otro para cuando está en campos de texto
    gui_inicializa(load_png("flecha.png"),load_png("flechag.png"),load_png("cursor.png"));

    set_center(0,gui_flecha,0,0);     //centro del mouse (punto caliente)
    set_center(0,gui_mano,0,0);

    gui_color_borde=rgb(176,176,192);              //se inicializa el color de los bordes de los objetos de la gui
    gui_color_Fondo=rgb(128,128,144);              //se inicializa el color de los objetos de la gui

    gui_MDespl(50, 15, 100, 30, "Archivo", &archivo, gui_Ttamano(archivo) );         //gui_Ttamano retorna el tamaño de un arreglo
    While (MAP_Estado!= 0)
        //Evita que nos quedemos encerrados en un menu.
        if (key( _ESC)) MAP_Estado= 0; END
        gui_actualiza();  //es necesario llamar esta función cada frame, ya que es la que se encarga de los gráficos del mouse
        FRAME;
    END
END

PROCESS main()
PRIVATE
    MAP_Estado;
END
BEGIN
     set_mode(1024,768,32, mode_window);
     set_fps(60, 0);
     MAP_Estado = 100;
     inicializa_GUI();
     While (MAP_Estado!= 0)
         //Evita que nos quedemos encerrados en un menu.
        if (key( _ESC)) MAP_Estado= 0; END

         FRAME;
     END
    let_me_alone();
END




Teóricamente debería mostrar el listado: archivo[]="Cargar","Guardar","Salir";
Pero aparecen: "mod_mem", "Guardar" y "Salir"

¿Alguna idea de que está saliendo mal?
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com


Arcontus

5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

Arcontus

Vale chicos, parece que localicé el problema, obviamente estaba en mi código. El problema es que no estaba correctamente definido uno de los bucles y no se llamaba a la funcion "gui_actualiza();" tal y como debería.

Un saludo!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

Arcontus

Estoy intentando darle un poco de caña a esta librería la cual me parece extemadamente útil y reporto lo que me parece un pequeño fallo.
los botones "-" y "X" de la parte superior derecha de la ventana creada con la función "gui_muestraMensaje"  no funcionan. Por lo que he estado investigando el problema está en el proceso "gui_barraMovimiento", del fichero "GUI_SO.prg". Concretamente en la linea 2315 se setea la variable "accion" a 0 y para que vuelvan a funcionar solo hay que comentar o borrar esa asignación quedando de esta manera:

process gui_barraMovimiento(gui_contenedor ct,String nombre)
private
public    adjy;
    cx,cy;
    x0,y0;
    idm;
public gui_contenedor c;
public    botones[3];
    accion;
public estado=false;
public ancho2;
begin
    c=ct;
    graph= gui_arma_gB(c.ancho,text_height(gui_fuente,"X")+10,nombre,GUI_GBARRAMOVIMIENTOVENTANA,id);
    adjy=(graphic_info(0,c.graph,g_height)>>1) + ((text_height(gui_fuente,"X")+10)>>1)-1 ;
    ancho2=(graphic_info(0,c.graph,g_width)>>1) +6;
    x=c.x;
    y=c.y-adjy;
    z=c.z-1;
    if ( c.tipoCont==3)
        botones[0]=gui_boton(x+ancho2-14,y,14,14,"X",1,&accion);
        botones[0].z=z-2;
    end

    if (c.tipoCont==2)

        botones[0]=gui_boton(x+ancho2-14,y,14,14,"X",1,&accion);
        botones[0].z=z-2;

        botones[1]=gui_boton(x+ancho2-28,y,14,14,"_",2,&accion);
        botones[1].z=z-2;
        botones[2]=gui_boton(x+ancho2-28,y,14,14,"-",3,&accion);
        botones[2].z=z-2;
        signal(botones[2],s_sleep);

    end
    loop
        if (exists(c))
            switch  (accion)
                case 1:
                    gui_cierra(c);
                    signal(id,s_kill);
                end
                case 2:
                    gui_propaga(c,s_sleep_tree);
                    while(mouse.left)
                        frame;
                    end
                    signal(botones[1],s_sleep);
                    signal(botones[2],s_wakeup);
                    accion=0;
                end
                case 3:
                    gui_propaga(c,s_wakeup_tree);
                    while(mouse.left)
                        frame;
                    end
                    signal(botones[2],s_sleep);
                    signal(botones[1],s_wakeup);
                    accion=0;
                end
            end
            cx=mouse.x-x;
            cy=mouse.y-y;
            if (!((idm=collision(type gui_contenedor)) and idm<>0 and idm.z<z) and !((idm=collision(type gui_barraMovimiento)) and idm<>0 and idm.z<z) and collision(type mouse) and mouse.left)
                while (mouse.left)

                    x=mouse.x-cx;
                    y=mouse.y-cy;
                    if (c.tipoCont==3)
                        botones[0].x=x+ancho2-14;
                        botones[0].y=y;
                    end

                    if (c.tipoCont==2)
                        botones[0].x=x+ancho2-14;
                        botones[0].y=y;
                        botones[1].x=x+ancho2-28;
                        botones[1].y=y;
                        botones[2].x=x+ancho2-28;
                        botones[2].y=y;
                    end
                    gui_mueveContenedor(c,x,y+adjy);
                    frame;
                end
                //accion=0; //<<-- (linea comentada)
            end
        else
            signal(id,s_kill);
        end
        frame;
    end
    onexit;
    unload_map(0,graph);
    from z=0 to 2;
        if (exists(botones[z]))
            signal(botones[z],s_kill);
        end
    end
end


Por el momento no he notado ningún problema al comentar esa parte del código. A ver que dice PRG :)

Otro problema que he encontrado es que al utilizar "gui_ObjetoLista" dentro de un "gui_muestraMensaje" no aparece la  barra "gui_BarraDesplazamientoVariable". Para solucionarlo basta con cambiar la Z del proceso "BarraDesplazamientoVariable" de "z=son.z-2;" a "z=son.z-8;" quedando de esta manera:
process gui_BarraDesplazamientoVariable(x,y,anch2,alt2,dir,max,int *val,*cant)
private mx;
begin
    ancho=anch2;
    alto=alt2;
    direccion=dir;
    actualisaCoord();
    x0=x;
    y0=y;
    gui_Etiqueta(0,gui_arma_gB(ancho,alto,"",GUI_GBARRADESPLAZAMIENTOVARIABLEFONDO,id),x,y,true);
    if (direccion)
        x0-=ancho>>1;
    else
        y0-=alto>>1;
    end

    ancho-=2;
    alto-=2;

    //    write_var(0,400,300,4,ed);
    //    son.flags=4;
    auxval=-1;
    loop
    z=son.z-8;
        if (auxval<>*cant)
            if (map_exists(file,graph))
                unload_map(file,graph);
            end
            if (*cant>max)
                if (direccion)
                    anchg=ancho/(float)(*cant/(float)max);
                      graph=gui_arma_gB(anchg>5? anchg : 5,alto,"",GUI_GBARRADESPLAZAMIENTOVARIABLEBARRA,id);
                    anchg=graphic_info(file,graph,g_width);
                                        val2=anchg>>1;
                    if (ancho>anchg)
                        if (*val>*cant-max)
                            *val=*cant-max;
                            write_int(0,200,260,0,&max);
                        end
                        x=x0+val2+((*val*(ancho-anchg))/(*cant-max));
                    /* else
                        x=x0+(ancho>>1)-((ancho-anchg)>>1);
                        *val=0; */
                    end
                else
                    altg=alto/(float)(*cant/(float)max);
                    graph=gui_arma_gB(ancho,altg>5? altg : 5,"",GUI_GBARRADESPLAZAMIENTOVARIABLEBARRA,id);
                    altg=graphic_info(file,graph,g_height);

                    val2=altg>>1;
                    if (alto>altg)
                        if (*val>*cant-max)
                            *val=*cant-max;
                        end
                        y=y0+val2+((*val*(alto-altg))/(*cant-max));
                    /* else
                        y=y0+(alto>>1)-((alto - altg)>>1);
                        *val=0; */
                    end
                end
            else
                graph=gui_arma_gB(ancho,alto,"",GUI_GBARRADESPLAZAMIENTOVARIABLEBARRA,id);
                if (direccion)
                    x=x0+(ancho>>1);
                else
                    y=y0+(alto>>1);
                end
                *val=0;
            end
            auxval=*cant;
            anchg=graphic_info(file,graph,g_width);
            altg=graphic_info(file,graph,g_height);
            if (direccion)
                val2=anchg>>1;
            else
                val2=altg>>1;
            end
        end

        if (*cant>max)
            if (direccion)
                x=x0+val2+((*val*(ancho-anchg))/(*cant-max));
                if (anchg<ancho and mouse.left and !((idm=collision(type gui_contenedor)) and idm<>0 and idm.z<z) and !((idm=collision(type gui_barraMovimiento)) and idm<>0 and idm.z<z) and estado!=GUI_DORMIR and  estado!=GUI_BLOQUEAR and not out_region(id,region))
                    if (collision(type mouse))
                        mx=mouse.x;
                        while (mouse.left)
                            x+=mouse.x-mx;
                            if (x>(x0+ancho-val2))
                                x=x0+ancho-val2;
                            elseif (x<(x0+val2))
                                x=x0+val2;
                            end
                            mx=mouse.x;
                            *val=(x-x0-val2)*(*cant-max)/(ancho-anchg);
                            frame;
                        end
                    else
                        while (mouse.x<(x0+ancho-val2) and mouse.x>(x0+val2) and mouse.y<y0+(alto>>1) and mouse.y>y0-(alto>>1) and mouse.left and x<>mouse.x)
                            if (mouse.x>x) x++;
                            else
                                x--;
                            end
                            *val=(x-x0-val2)*(*cant-max)/(ancho-anchg);
                            frame;
                        end
                    end
                end
            else
                y=y0+val2+((*val*(alto-altg))/(*cant-max));
                if (altg<alto and mouse.left and !((idm=collision(type gui_contenedor)) and idm<>0 and idm.z<z) and !((idm=collision(type gui_barraMovimiento)) and idm<>0 and idm.z<z) and estado!=GUI_DORMIR and  estado!=GUI_BLOQUEAR and not out_region(id,region))

                    if (collision(type mouse))
                        mx=mouse.y;
                        while (mouse.left)
                            y+=mouse.y-mx;
                            if (y>(y0+alto-val2))
                                y=y0+alto-val2;
                            elseif (y<(y0+val2))
                                y=y0+val2;
                            end
                            mx=mouse.y;
                            *val=(y-y0-val2)*(*cant-max)/(alto-altg);
                            frame;
                        end
                    else
                        while (mouse.x<x0+(ancho>>1) and mouse.x>x0-(ancho>>1) and mouse.y<y0+alto-val2 and mouse.y>y0+val2 and mouse.left and y<>mouse.y)
                            if (mouse.y>y) y++;
                            else
                                y--;
                            end
                            *val=(y-y0-val2)*(*cant-max)/(alto-altg);
                            frame;
                        end
                    end
                end
            end
        end
        frame;
    end
    onexit;
    unload_map(0,graph);
    signal(son,s_kill);
end


Si encuentro algún otro problema os lo comento.
Un  saludo!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

Arcontus

Hola chicos,

otro pequeño error de la librería: si utilizas la función gui_TextoListaV(...) por ejemplo en el Test23, verás que al cerrar la ventana también se eliminan los textos no asociados a la misma. Para que funcione correctamente tienes que cambiar las lineas del delete_text del "onExit;" para que compruebe antes el código de texto a borrar que no sea 0:


//Fichero GUI_SO.prg lineas: 2913-2917
for (cont=0;cont<cantPant*cantidadR;cont++)
        if (listaTex[cont] != 0)
            delete_text(listaTex[cont]);   
        END
    end


Con este cambio todo parece funcionar correctamente.

Un saludo!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

l1nk3rn3l

Comparte todo en un zip para actualizar la libreria

Se agradece el aporte..