Una GUI en Bennu para Bennu

Started by Yawin, March 02, 2015, 10:04:14 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Yawin

Pues aquí os traigo mi último proyecto: una GUI para usar en programas hechos con Bennu.

La idea surgió del hecho de que es un dolor de huevos cada vez que quiero hacer una interfaz con botones y demás. Así que como suelo necesitar botones y me da pereza hacermelos cada vez que lo necesito, pues he decidido hacerme una librería con todo esto y a paseo.

Demostración: https://www.youtube.com/watch?v=zFnASj6Cs6I

Código:
/************************************************/
/* GUI en BennuGD para BennuGD            */
/* -------------------------------------------- */
/*                        */
/* Una solución sencilla para hacer interfaces  */
/* de usuario.                    */
/*                        */
/* Autor: Yawin                    */
/* Versión: Alpha v1                */
/************************************************/

import "mod_mouse";
import "mod_video";
import "mod_key";
import "mod_map";
import "mod_proc";
import "mod_grproc";
import "mod_text";
import "mod_string";
import "mod_say";
import "mod_draw";
import "mod_mem";
import "mod_wm";
import "mod_screen";

type _lista
    int valor; /* Valor */
    _lista* anterior; /* Elemento anterior */
end
global
    int gui_window_width, gui_window_height; /*almaceno el ancho y el alto de la ventana*/
    int gui_window_color; /*Profundidad de color*/
    int gui_window_mode;
    int gui_debug; /*Si estamos debugeando o no*/
    int gui_cursor; /*Si queremos que se muestre el cursor*/
    bool gui_mouse_left; /*Si tenemos el click derecho pulsado*/

    /*Controles*/
        int gui_p_mouse; /*Identificador del proceso del ratón*/
        _lista *gui_controles;
end

/*Gestión de controles*/
function gui_carga_control(int id_obj) /* Esta función carga un control en el sistema */
    private
        _lista *nuevo; /* Guarda el puntero al nuevo elemento que vamos a añadir */
    end
    begin
        nuevo=alloc(sizeof(_lista));/* Reservo la memoria                        */
        nuevo.valor=id_obj;     /* Asigno el identificador de proceso                     */
        nuevo.anterior=gui_controles; /* Asigno el puntero para que apunte al último elemento añadido     */
        gui_controles=nuevo;    /* Reasigno el puntero global para que apunte al nuevo             */
        log("Cargado control["+gui_controles.valor+"]");
    end

function gui_descarga_controles() /* Esta función descarga la lista de controles */
    private
        int i;
        _lista *actual; /* Guarda el elemento en el que nos situamos */
    end
    begin
        while(gui_controles != NULL)
            actual=gui_controles;         /* Recojemos el primer control    */
            log("Valor: "+actual.valor);
            signal(actual.valor,s_kill);    /* Matamos el control        */
            free(gui_controles);            /* Liberamos el control        */
            gui_controles=actual.anterior;    /* Pasamos al siguiente control    */
        end
    end

function gui_descarga_control(int id)
    private
        int i;
        _lista *actual, *int_old;
    end
    begin
        if(!id) return; end
        actual=gui_controles;         /* Recojemos el primer control    */
        repeat
            if(actual.valor==id)
                if(int_old)
                    int_old.anterior=actual.anterior;
                else
                    gui_controles=actual.anterior;
                else
                signal(actual.valor,s_kill);
                free(actual);
                break;
            end
            int_old=actual;
            actual=actual.anterior;    /* Pasamos al siguiente control    */
        until(actual==NULL)
    end
/**********************/

function log(string texto)
    begin
                if(gui_debug)
                        say(texto);
                end

    end

function gui_init(int _screen_w, int _screen_h, int _screen_color, int _screen_mode, int _mouse, int _debug)
    begin
        gui_debug=_debug;

        gui_window_width=_screen_w;
        gui_window_height=_screen_h;
        gui_window_color=_screen_color;
        gui_window_mode=_screen_mode;
        set_mode(gui_window_width,gui_window_height,gui_window_color,gui_window_mode);

        log("GUI_WINDOW_WIDTH: "+gui_window_width);
        log("GUI_WINDOW_HEIGHT: "+gui_window_height);
        log("GUI_WINDOW_COLOR: "+gui_window_color);
        log("GUI_WINDOW_MODE: "+gui_window_mode);

        gui_cursor=_mouse;

        gui_p_mouse=gui_mouse();
        log("GUI inicializado");
    end

function gui_stop()
    begin
        signal(gui_p_mouse,s_kill); /*Matamos el proceso del ratón*/
        gui_descarga_controles();
        log("GUI parado");
    end

process gui_mouse()
    private
        int grafico;
    end
    begin
        if(gui_p_mouse)
            /*Si ya existe el ratón sacamos error*/
            log("Error: Ya tenemos un el raton activo");
            if(!gui_cursor) log("El cursor no esta visible. Tal vez quieras hacerlo visible"); end
        end

        x=gui_window_width/2;
        y=gui_window_height/2;
        z=-1;

        file=load_fpg("img/common.fpg");
        grafico=1;
       
        loop
            if(gui_cursor)
                if(graph!=grafico)
                    graph=grafico;
                end
            else
                if(graph==grafico)
                    graph=0;
                end
            end

            if(mouse.left && !gui_mouse_left)
                gui_mouse_left=true;
            elsif(!mouse.left && gui_mouse_left)
                gui_mouse_left=false;
            end

            x=mouse.x;
            y=mouse.y;
            frame;   
        end
    end

process gui_canvas(int x, int y,int z, int c_w, int c_h, int file, int grafico)
    private
        int _tw, _th;
    end
    begin
        /*Asignamos posicion*/
            if(x<0) x=gui_window_width/2; end
            if(y<0) y=gui_window_height/2; end

        /*Asignamos tamaño*/
            if(c_w<0)
                if(gui_window_width/2>x)
                    c_w=x*2;
                elsif(gui_window_width/2<x)
                    c_w=(gui_window_width-x)*2;
                else
                    c_w=gui_window_width;
                end
            end
                    if(c_h<0)
                            if(gui_window_height/2>y)
                                    c_h=y*2;
                            elsif(gui_window_height/2<y)
                                    c_h=(gui_window_height-y)*2;
                            else
                                    c_h=gui_window_height;
                            end
                    end

                /*Asignamos grafico*/
                        if(file>0)
                                if(grafico>0)
                                        graph=grafico;

                    /* Calculamos tamaño resultante*/
                        _tw=map_info(file,graph,G_WIDTH);
                        _th=map_info(file,graph,G_HEIGHT);

                        size_x=(100*c_w)/_tw;
                        size_y=(100*c_h)/_th;
                                end
                        else
                                /*Dibujamos un canvas de color sólido*/
                    graph=new_map(c_w,c_h,gui_window_color);

                    if(grafico>0)
                        map_clear(0,graph,grafico);
                    else
                        map_clear(0,graph,rgb(195,195,195));
                    end
                        end

        log("Canvas");
        gui_carga_control(id);
        loop
            frame;
        end       
    end

process gui_label(int x, int y,int z, string texto, int align, int fnt)
    private
        int priv_gui_texto;
    end
    begin
        priv_gui_texto=write_var(fnt,x,y,z,align,texto);
        gui_carga_control(id);
        loop
            frame;
        end
    OnExit
        delete_text(priv_gui_texto);
    end


process gui_button(int x, int y,int z, int c_w, int c_h, int file, int grafico, string texto, int fnt)
    private
        int _tw, _th, internal_label;
        int internal_size_x,internal_size_y;
        int internal_entered=false;
    public
        gui_button_active=false;
    end
    begin
        /*Asignamos posicion*/
            if(x<0) x=gui_window_width/2; end
            if(y<0) y=gui_window_height/2; end

        /*Asignamos tamaño*/
            /*if(c_w<0)
                if(gui_window_width/2>x)
                    c_w=x*2;
                elsif(gui_window_width/2<x)
                    c_w=(gui_window_width-x)*2;
                else
                    c_w=gui_window_width;
                end
            end
                    if(c_h<0)
                            if(gui_window_height/2>y)
                                    c_h=y*2;
                            elsif(gui_window_height/2<y)
                                    c_h=(gui_window_height-y)*2;
                            else
                                    c_h=gui_window_height;
                            end
                    end*/

                /*Asignamos grafico*/
                        if(file>0)
                                if(grafico>0)
                                        graph=grafico;

                    /* Calculamos tamaño resultante*/
                        _tw=map_info(file,graph,G_WIDTH);
                        _th=map_info(file,graph,G_HEIGHT);

                        size_x=(100*c_w)/_tw;
                        size_y=(100*c_h)/_th;
                                end
                        else
                                /*Dibujamos un canvas de color sólido*/
                    graph=new_map(c_w,c_h,gui_window_color);

                    if(grafico>0)
                        map_clear(0,graph,grafico);
                    else
                        map_clear(0,graph,rgb(195,195,195));
                    end
                        end

            internal_size_x=size_x;
            internal_size_y=size_y;

        gui_carga_control(id);
        internal_label=gui_label(x,y,z-1,texto,4,fnt);
        loop
            if(collision(gui_p_mouse))
                if(!mouse.left)
                    internal_entered=true;
                end
                if(mouse.left && internal_entered)
                    gui_button_active=true;
                else
                    gui_button_active=false;
                end
            else
                gui_button_active=false;
                internal_entered=false;
            end

            if(mouse.left && internal_entered)
                size_x=internal_size_x-(internal_size_x/4);
                size_y=internal_size_y-(internal_size_y/4);
            elsif(!mouse.left && !internal_entered)
                if(size_x!=internal_size_x)
                    size_x=internal_size_x;
                    size_y=internal_size_y;
                end
            elsif(!mouse.left)
                if(size_x!=internal_size_x)
                    size_x=internal_size_x;
                    size_y=internal_size_y;
                end
            end

            frame;
        end
    OnExit
        signal(internal_label,s_kill);       
    end
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

SplinterGU

ejemplos y capturas estaria bueno, muchas gracias!
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Yawin

He dejado un vídeo explicando su funcionamiento xD
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

SplinterGU

muy bueno yawin! felicitaciones!
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Yawin

^__^ Gracias, cualquier sugerencia que tengáis la recogeré encantado. Es más, si alguien encuentra una forma más eficiente de hacer algo, que me pase el código que lo aceptaré encantado.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

JaViS

Pues, siempre pense que eras cosas eran muy utiles. Alla por el 2002 hice una libreria parecida, me gustaria continuarla y actualizarla, pero no tengo tanto tiempo ahora.


Hace un tiempo la vi portada a Bennu, por ahi te sirve alguna idea de alli http://forum.bennugd.org/index.php?topic=1263.msg19924#msg19924
Working on Anarkade. A couch multiplayer 2D shooter.

Yawin

#6
Pues me interesa mogollón, voy a ver si entiendo cómo está programada y si soy capaz de plagiarla inspirarme con ella.

P.d.: Acabo de recordar que el gran Fede hizo un explorador de archivos en Bennu y su GUI era tochísima. boy a ver si le meto mano. http://forum.bennugd.org/index.php?topic=2026.0
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

DCelso

Quote from: Yawin on March 04, 2015, 02:06:24 PM
Pues me interesa mogollón, voy a ver si entiendo cómo está programada y si soy capaz de plagiarla inspirarme con ella.

P.d.: Acabo de recordar que el gran Fede hizo un explorador de archivos en Bennu y su GUI era tochísima. boy a ver si le meto mano. http://forum.bennugd.org/index.php?topic=2026.0
Boys! Boys! Boys!
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Yawin

Llamadme loco, pero me encanta esa canción y, sobre todo, esa cantante xD
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Futu-block

Y a mi...

De toas formas me gusta la idea del gui ese, siempre me ha gustao eso de que haya una especie "estandar" Bennu