Bennu Game Development

Foros en Español => Proyectos => Topic started by: Yawin on March 02, 2015, 10:04:14 PM

Title: Una GUI en Bennu para Bennu
Post by: Yawin on March 02, 2015, 10:04:14 PM
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
Title: Re:Una GUI en Bennu para Bennu
Post by: SplinterGU on March 03, 2015, 01:20:33 AM
ejemplos y capturas estaria bueno, muchas gracias!
Title: Re:Una GUI en Bennu para Bennu
Post by: Yawin on March 03, 2015, 08:22:39 AM
He dejado un vídeo explicando su funcionamiento xD
Title: Re:Una GUI en Bennu para Bennu
Post by: SplinterGU on March 03, 2015, 12:23:04 PM
muy bueno yawin! felicitaciones!
Title: Re:Una GUI en Bennu para Bennu
Post by: Yawin on March 03, 2015, 03:01:02 PM
^__^ 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.
Title: Re:Una GUI en Bennu para Bennu
Post by: JaViS on March 03, 2015, 05:12:47 PM
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
Title: Re:Una GUI en Bennu para Bennu
Post by: 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
Title: Re:Una GUI en Bennu para Bennu
Post by: DCelso on March 04, 2015, 02:39:01 PM
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 (http://forum.bennugd.org/index.php?topic=2026.0)
Boys! Boys! Boys! (https://www.youtube.com/watch?v=Ug8WeZyTxXg)
Title: Re:Una GUI en Bennu para Bennu
Post by: Yawin on March 04, 2015, 02:59:16 PM
Llamadme loco, pero me encanta esa canción y, sobre todo, esa cantante xD
Title: Re:Una GUI en Bennu para Bennu
Post by: Futu-block on March 04, 2015, 10:12:09 PM
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