Avances, Diario de...

Started by SplinterGU, April 17, 2008, 03:00:51 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

kim-elet-o

Me encanta esa funcionalidad, pero mucho mucho. :D :D :D :D :D


|/
|\im-elet-o el yayo programador.

SplinterGU

Quote from: kim-elet-o on November 07, 2008, 10:00:21 AM
Me encanta esa funcionalidad, pero mucho mucho. :D :D :D :D :D

gracias

Codigo de ejemplo (las funciones pueden sufrir modificaciones, por ahora es experimental, y lamentablemente por problemas de internet no puedo subir ninguna version hasta que me solucionen el problema de que no puedo subir mas de 4kb y con problemas):



import "mod_video";
import "mod_ffi";
import "mod_say";
import "mod_wm";
import "mod_key";

/* --------------------------------------------------------------------------- */

#define SW_HIDE 0
#define SW_NORMAL 1
#define SW_SHOWNORMAL 1
#define SW_SHOWMINIMIZED 2
#define SW_MAXIMIZE 3
#define SW_SHOWMAXIMIZED 3
#define SW_SHOWNOACTIVATE 4
#define SW_SHOW 5
#define SW_MINIMIZE 6
#define SW_SHOWMINNOACTIVE 7
#define SW_SHOWNA 8
#define SW_RESTORE 9
#define SW_SHOWDEFAULT 10
#define SW_FORCEMINIMIZE 11
#define SW_MAX 11

/* --------------------------------------------------------------------------- */

#define MB_ABORTRETRYIGNORE 2
#define MB_APPLMODAL 0
#define MB_DEFAULT_DESKTOP_ONLY 020000h
#define MB_HELP 04000h
#define MB_RIGHT 080000h
#define MB_RTLREADING 0100000h
#define MB_TOPMOST 040000h
#define MB_DEFBUTTON1 0
#define MB_DEFBUTTON2 256
#define MB_DEFBUTTON3 512
#define MB_DEFBUTTON4 0300h
#define MB_ICONINFORMATION 64
#define MB_ICONSTOP 16
#define MB_OKCANCEL 1
#define MB_RETRYCANCEL 5

/* --------------------------------------------------------------------------- */

#define HWND_BROADCAST (0FFFFh)
#define HWND_BOTTOM (1)
#define HWND_NOTOPMOST (-2)
#define HWND_TOP (0)
#define HWND_TOPMOST (-1)
#define HWND_DESKTOP 0

/* --------------------------------------------------------------------------- */

type _RECT;
    INT left;
    INT top;
    INT right;
    INT bottom;
end

/* --------------------------------------------------------------------------- */

Global
    fMessageBox;
    fGetForegroundWindow;
    fGetConsoleWindow;
    fGetWindowThreadProcessId;
    fShowWindow;
    fGetCurrentProcessId;
    fBringWindowToTop;
    fSetWindowPos;
    fGetWindowRect;
end

/* --------------------------------------------------------------------------- */

process ImportExternals()
begin
    fMessageBox = ffi_declare(FFI_STDCALL, "user32.dll", "MessageBoxA", "PPPI", "I");
    fGetForegroundWindow = ffi_declare(FFI_STDCALL, "user32.dll", "GetForegroundWindow", "", "I");
    fGetConsoleWindow = ffi_declare(FFI_STDCALL, "kernel32.dll", "GetConsoleWindow", "", "I");
    fGetWindowThreadProcessId = ffi_declare(FFI_STDCALL, "user32.dll", "GetWindowThreadProcessId", "IP", "I");
    fGetCurrentProcessId = ffi_declare(FFI_STDCALL, "kernel32.dll", "GetCurrentProcessId", "", "I");
    fShowWindow = ffi_declare(FFI_STDCALL, "user32.dll", "ShowWindow", "II", "I");
    fBringWindowToTop = ffi_declare(FFI_STDCALL, "user32.dll", "BringWindowToTop", "I", "I");
    fSetWindowPos = ffi_declare(FFI_STDCALL, "user32.dll", "SetWindowPos", "IIIIIII", "I");
    fGetWindowRect = ffi_declare(FFI_STDCALL, "user32.dll", "GetWindowRect", "IP", "I");
end

/* --------------------------------------------------------------------------- */

function GetWindowRect(int hWnd, _RECT * lpRect)
private
    int ret = 0;
    int * values[1];
begin
    values[0] = &hWnd;
    values[1] = &lpRect;
    ffi_call(fGetWindowRect, &ret, &values);
    return ret;
end

/* --------------------------------------------------------------------------- */

function SetWindowPos(int hWnd, int hWndInsertAfter, int x, int y, int cx, int cy, int uFlags)
private
    int ret = 0;
    int * values[6];
begin
    values[0] = &hWnd;
    values[1] = &hWndInsertAfter;
    values[2] = &x;
    values[3] = &y;
    values[4] = &cx;
    values[5] = &cy;
    values[6] = &uFlags;
    ffi_call(fSetWindowPos, &ret, &values);
    return ret;
end

/* --------------------------------------------------------------------------- */

function GetForegroundWindow()
private
    int ret = 0;
begin
    ffi_call(fGetForegroundWindow, &ret, NULL);
    return ret;
end

/* --------------------------------------------------------------------------- */

function GetConsoleWindow()
private
    int ret = 0;
begin
    ffi_call(fGetConsoleWindow, &ret, NULL);
    return ret;
end

/* --------------------------------------------------------------------------- */

function GetCurrentProcessId()
private
    int ret = 0;
begin
    ffi_call(fGetCurrentProcessId, &ret, NULL);
    return ret;
end

/* --------------------------------------------------------------------------- */

function GetWindowThreadProcessId(int hWnd, int * dwProcessId)
private
    int ret = 0;
    int * values[1];
begin
    values[0] = &hWnd;
    values[1] = &dwProcessId;
    ffi_call(fGetWindowThreadProcessId, &ret, &values);
    return ret;
end

/* --------------------------------------------------------------------------- */

function BringWindowToTop(int hWnd,)
private
    int * values[0];
    int ret = 0;
begin
    values[0] = &hWnd;
    ffi_call(fBringWindowToTop, &ret, &values);
    return ret;
end

/* --------------------------------------------------------------------------- */

function ShowWindow(int hWnd, int nCmdShow)
private
    int ret = 0;
    int * values[1];
begin
    values[0] = &hWnd;
    values[1] = &nCmdShow;

    ffi_call(fShowWindow, &ret, &values);

    return ret;
end

/* --------------------------------------------------------------------------- */

function MessageBox(int hWnd, string title, string message, int btype)
private
    int ret = 0;
    int * values[3];

    char _message[30];
    char _title[30];

    char * pmessage;
    char * ptitle;
begin
    _message = message; pmessage = &_message;
    _title = title; ptitle = &_title;
    values[0] = &hWnd;
    values[1] = &pmessage;
    values[2] = &ptitle;
    values[3] = &btype;
    ffi_call(fMessageBox, &ret, &values);
    return ret;
end

/* --------------------------------------------------------------------------- */

private
    ret;
    int hWnd, hMainWnd;
    DWORD dwProcessId;
    _RECT   rect;
begin

    ImportExternals();

    hMainWnd = GetForegroundWindow();

    hWnd = GetConsoleWindow();
    GetWindowThreadProcessId( hWnd, &dwProcessId );
    if ( dwProcessId == GetCurrentProcessId() )
        ShowWindow( hWnd, SW_SHOW );
    end

    GetWindowRect(hMainWnd, &rect);
    SetWindowPos(hMainWnd, HWND_TOPMOST, rect.left, rect.top, 0, 0, 0);

    loop
        if (key(_ESC))
            GetWindowRect(hMainWnd, &rect);
            SetWindowPos(hMainWnd, HWND_NOTOPMOST, rect.left, rect.top, 0, 0, 0);
            ret = MessageBox(NULL, argv[0], "Are you sure you want to quit?", MB_OKCANCEL);
            if (ret == 1)
                break;
            end
            GetWindowRect(hMainWnd, &rect);
            SetWindowPos(hMainWnd, HWND_TOPMOST, rect.left, rect.top, 0, 0, 0);
        end
        frame;
    end

end
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

osk

Aaagghh qué guapoo!!!
Cuando Bennu esté listo hay que lanzar la buena nueva en todos los rincones del mundo!!
Revistas, foros, portales ... aquí viene una nueva era!!

josebita

Joé, tiene muy buena pinta. A ver si lo probamos :)

SplinterGU

#379
http://wiki.bennugd.org/images/1/1c/Ffitest.zip

aca va el link del programa de prueba con el ultimo update de bennu, perdon que no lo suba como wip, pero no solo es prueba, sino que tengo problemas de internet y para hacer esto, tuve que pasarselo a sandman en 77 fragmentos de 2k, y con varios intentos hasta lograrlo... gracias Sandman por la ayuda y la paciencia.


pd: en el ejemplo, veran que se usa el api para desocultar la ventana de la consola de comandos, tambien veran como se obtiene las coordenadas de la ventana, como se hace que esta sea siempre visible, como se usa un MessageBox y como se interpreta sus resultados... y tambien hay otras funciones mas a modo de ejemplo...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

TYCO

Ese ejemplo solo consigo ver el MsgBox de salida, pero está curioso.

-------------------------------------------------------------------------------

Lo de la función exit("",0); por ejemplo yo en mi código tengo esto:

memoria_libre=memory_free();
memoria_libre=memoria_libre/1024000;
If (memoria_libre < 16)
    exit("ERROR_03: Memoria insuficiente. Se necesita un mínimo de 16MB de RAM.",3);
End

Entonces si no puedo leer ese mensaje en la consola... no se por qué ha salido del juego, yo creo que es útil que saldría el mensaje.
Programador, Escritor/Guionista y Deportista.

Todo Modo Gráfico tiene por detrás una Línea de Comandos.

SnowCraft Remake (100%)
Rally Mortal (87%)

SplinterGU

puf no solo tiene el messagebox de salida, tiene todas las cosas que describi un post antes del tuyo...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

Quote from: TYCO on November 07, 2008, 02:31:23 PM
Ese ejemplo solo consigo ver el MsgBox de salida, pero está curioso.

-------------------------------------------------------------------------------

Lo de la función exit("",0); por ejemplo yo en mi código tengo esto:

memoria_libre=memory_free();
memoria_libre=memoria_libre/1024000;
If (memoria_libre < 16)
    exit("ERROR_03: Memoria insuficiente. Se necesita un mínimo de 16MB de RAM.",3);
End

Entonces si no puedo leer ese mensaje en la consola... no se por qué ha salido del juego, yo creo que es útil que saldría el mensaje.

si, si, no digo lo contrario...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

MythomizeR

#383
potencia&flexibilidadDeBennu+=5;

¿A un pasito para crear aplicaciones con el escritorio como fondo, verdad?

Por decir solo una, que ésto abre muchas puertas...

Grande.

blostec

TYCO siempre puedes crearte un fichero para guardar los mensajes de error si se da el caso.

Prg

QuoteNuevo modulo interface portable de funciones externas... (importar cualquier dll/so a bennu)...

Increíble, cada vez me dejas más con la boca abierta splinter, esto será muy bueno a la hora de hacer programas como el editor fpg  :D .
Increíble todo lo que se puede ahorrar uno usando librerías del sistema... que lo que ya está hecho nos quite los problemas de hacerlo nosotros mismos  ;D

oye, y la función set_text_color  ya funciona?
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

SplinterGU

eso iba a responderte y me olvido, funciona la set_text_color, solo que para fonts de 1 bit de color... para fonts de mas bits el color es el definido...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

osk

De todas maneras, Prg, yo pediría que en el caso concreto del editor Fpg no se hiciera uso de esta funcionalidad, si se quiere que el programa funcione igual para todas las plataformas... Si se meten funciones que manejan dll de windows, se tendría que hacer lo propio para Linux y eso puede ser un follón. La gracia de esto yo lo veo cuando uno quiere hacer un programa para una plataforma concreta, para exprimir sus posibilidades...porque repetir lo mismo para diferentes sistemas operativos repito que puede ser algo tedioso, no?


SplinterGU

tal vez si, tal vez no tanto...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

- Soporte de todas las formas exit
- Soporte "#define lala()  pepe"
- Fonts 32 bits
Download Lastest BennuGD Release: http://www.bennugd.org/node/2