Bennu Game Development

Foros en Español => General => Topic started by: JaViS on December 17, 2017, 01:39:01 AM

Title: Librería de eventos
Post by: JaViS on December 17, 2017, 01:39:01 AM






(https://i.imgur.com/Z0cblp5.jpg)




Estuve jugando un poco con el pre compilador y me gustó como quedó. Es parte del codigo que estamos abriendo de Anarkade en forma de librerias. si quieren ir echando el ojo: https://bitbucket.org/pixelatom/bennu_framework/src/d42bb583a9b664a1f1a659d3529c57453a4b233c/test_menus/test_menus.prg?at=master
Title: Re:Librería de eventos
Post by: Drumpi on December 17, 2017, 02:00:34 AM
Interesante.
Lo cierto es que Bennu, y Fénix... y DIV, llevaban pidiendo algo similar desde hace mucho :D

En otros lenguajes orientados a objetos es más sencillo porque ya implementan los métodos de clase, pero aquí son procesos independientes. Por lo que entiendo, esto son una especie de "eventos pasivos" ¿no? Es decir, el proceso se ejecuta y comprueba en su ejecución si se ha producido un evento ¿no?
Aunque no sé, yo lo hubiera enfocado a ejecutar un trozo de código al mandarle el evento directamente al proceso, similar al onexit o algo así. Quiero decir que se le mande un "signal" a un proceso y este ejecute el trozo que corresponde a esa señal.

En cualquier caso, es interesante, y no habría que hacer algunas "cabriolas" para esto mismo :D Tratar de hacer un IDE sin eventos es complicado, aunque no imposible.
Title: Re:Librería de eventos
Post by: gecko on December 17, 2017, 01:35:40 PM
Se ve muy MUY interesante ese framework  :D
Title: Re:Librería de eventos
Post by: JaViS on December 17, 2017, 02:31:55 PM
Gracias Gecko! Ya voy a documentarlo y prepararlo para publicarlo. Mientras tanto hay cosas que ya funcionan bien y venimos usando hace mucho. Cómo la librería de controles, que yo creo es muy útil tanto para permitir configuración de controles o soporte multiplataforma.


Drumpi la verdad es que consideré la posibilidad de hacerlo como tú dices, pero al final me incliné por la opcion más práctica y simple de implementarlo, veremos cómo anda, siempre se puede refactorear :P
Title: Re:Librería de eventos
Post by: SplinterGU on December 17, 2017, 11:27:11 PM
ayer un poco apurado me costo ver lo que intentabas hacer... hoy lo entendi...

no se si lo que has hecho es lo mas simple, creo que lo que dice Drumpi es mas simple, por otro lado, quizas incluso podrias haberlo hecho de forma de libreria sin tener que tocar el compilador, haciendo funciones que armen el handler del evento y un frame callback que ejecute el evento llamando a una funcion...

por ejemplo...



process blah()
begin
on_event(EVT_UI_FOCUS, my_function_handler)
end

function my_function_handler(e)
begin
....
end


asi no tendrias que tocar el compilador y quedaria una libreria que puede ser facilmente portada como modulo a cualquiera de los bennu like...

como sea, muy bien te has atrevido a tocar el compilador y implementar un nuevo comando...
Title: Re:Librería de eventos
Post by: JaViS on December 18, 2017, 02:30:29 AM
No no, nunca toque el compilador, lo que hice fue usar el precompilador.


Claro que lo que propones vos es mucho mejor implementación, pero con el pre compilador no se puede hacer
Title: Re:Librería de eventos
Post by: SplinterGU on December 18, 2017, 02:34:04 AM
precompilador?
Title: Re:Librería de eventos
Post by: JaViS on December 18, 2017, 03:00:25 AM
Si, no se si le estoy diciendo bien, estoy usando #define
Title: Re:Librería de eventos
Post by: SplinterGU on December 18, 2017, 03:45:35 AM
ahh... me imagine... preprocesador... :D

jejeje, ahora si... muy bien entonces, genial...
Title: Re:Librería de eventos
Post by: SplinterGU on December 18, 2017, 04:12:10 AM
ahi vi tu codigo, lo podrias optimizar asi...


#ifndef __EVENTS
#define __EVENTS

import "mod_proc";

local
__event_code = 0;
end

/**
* Events are process that last one frame only
*/
process __event(int event_code)
begin
priority = 255;
__event_code = event_code;
frame;
end

#define event_trigger(event_code) __event(event_code);

#define event_on(event_code,e) while (e=get_id(type __event)) if (e.__event_code != event_code) continue; end;

function event_get_process(e)
begin
return e.father;
end

function event_get_process_type(e)
begin
return e.father.reserved.process_type;
end

function event_get_code(e)
begin
return e.__event_code;
end
#endif
Title: Re:Librería de eventos
Post by: JaViS on December 18, 2017, 10:04:07 AM
Gracias! Había probado eso, pero por alguna razón dio error, dice que el tipo de proceso event no es conocido, por eso tuve que usar get_id(0)
Title: Re:Librería de eventos
Post by: SplinterGU on December 18, 2017, 12:21:13 PM
ahora tambien lo dice?, quizas te falto el __ ? o falla eso?
Title: Re:Librería de eventos
Post by: SplinterGU on December 18, 2017, 12:24:01 PM
tambien podrias declarar

__event_code como public dentro de __event, y declaras e como __event en las funciones donde la usas... con eso ahorrarias memoria, y seria mas ordenado, de otra forma cada proceso tiene __event_code declarado como local y no lo usa.

y ahora volviendo a ver el codigo, incluso deberia funcionar esto


process __event(int __event_code)
begin
priority = 255;
frame;
end
Title: Re:Librería de eventos
Post by: JaViS on December 18, 2017, 01:37:13 PM
Muchas sugerencias copadas pero realmente no se pueden implementar como decis, vamos por parte y te explico cada una:



process __event(int __event_code)
begin
priority = 255;
frame;
end



Si declaramos __event_code como publica, el compilador da error que la variable está redeclarada (inclusive usando declare)


e=get_id(type __event)

Quote
ahora tambien lo dice?, quizas te falto el __ ? o falla eso?


Efectivamente falla, el error textual es: error: Unknown identifier ( token error: "TYPE__EVENT" ).

Saludos!
Title: Re:Librería de eventos
Post by: SplinterGU on December 18, 2017, 03:22:16 PM
perdon, pero a mi no me da esos errores

si la declaras como publica, hay que hacer la asignacion como tenias antes, pero funciona


#ifndef __EVENTS
#define __EVENTS

#if __BGD__ == 2
import "mod_misc";
#else
import "mod_proc";
#endif

declare process __event(int event_code)
    public
        int __event_code = 0;
    end
end

/**
* Events are process that last one frame only
*/
process __event(int event_code)
begin
    priority = 255;
    __event_code = event_code;
    frame;
end

#define event_trigger(event_code) __event(event_code);

#define event_on(event_code,e) while (e=get_id(type __event)) if (e.__event_code != event_code) continue; end;

function event_get_process(__event e)
begin
    return e.father;
end

function event_get_process_type(__event e)
begin
    return e.father.reserved.process_type;
end

function event_get_code(__event e)
begin
    return e.__event_code;
end
#endif



#include "events.inc"

begin
end



splinter@splinter-C500:~/bennugd.test/events$ bgdc sample.prg
BGDC 2.0.0 (Aug  1 2017 19:45:03)
Bennu Game Development Compiler

Copyright (c) 2006-2016 SplinterGU (Fenix/BennuGD)
Copyright (c) 2002-2006 Fenix Team (Fenix)
Copyright (c) 1999-2002 José Luis Cebrián Pagüe (Fenix)


File sample.dcb compiled (35560 bytes):

  Processes                             5
  Global data                         568 bytes
  Local data                          120 bytes
  Private data                         32 bytes
  Public data                           8 bytes
  Code                                280 bytes
  System processes                    132
  Globals vars                          6
  Locals vars                           8
  Private vars                          4
  Publics vars                          1
  Identifiers                         372
  Structs                               4
  Strings                               4 (30 bytes)

Title: Re:Librería de eventos
Post by: SplinterGU on December 18, 2017, 03:24:35 PM
veo que dice TYPE__EVENT, estas poniendo todo junto... es TYPE <ESPACIO> __EVENT
Title: Re:Librería de eventos
Post by: JaViS on December 18, 2017, 04:13:43 PM
Qué raro, será la versión del compilador?
Title: Re:Librería de eventos
Post by: JaViS on December 18, 2017, 04:14:23 PM
Quote from: SplinterGU on December 18, 2017, 03:24:35 PM
veo que dice TYPE__EVENT, estas poniendo todo junto... es TYPE <ESPACIO> __EVENT


No no, no soy tan nabo Jaja, lo pongo separado
Title: Re:Librería de eventos
Post by: SplinterGU on December 18, 2017, 04:16:38 PM
Quote from: JaViS on December 18, 2017, 04:14:23 PM
Quote from: SplinterGU on December 18, 2017, 03:24:35 PM
veo que dice TYPE__EVENT, estas poniendo todo junto... es TYPE <ESPACIO> __EVENT


No no, no soy tan nabo Jaja, lo pongo separado

jaja, bueno, se lee pegado, debio ser el copy&paste.

no deberia ser el compilador, probaste nuevamente con el codigo que puse?
Title: Re:Librería de eventos
Post by: JaViS on December 18, 2017, 04:22:30 PM
Quote from: SplinterGU on December 18, 2017, 04:16:38 PM
Quote from: JaViS on December 18, 2017, 04:14:23 PM
Quote from: SplinterGU on December 18, 2017, 03:24:35 PM
veo que dice TYPE__EVENT, estas poniendo todo junto... es TYPE <ESPACIO> __EVENT


No no, no soy tan nabo Jaja, lo pongo separado

jaja, bueno, se lee pegado, debio ser el copy&paste.

no deberia ser el compilador, probaste nuevamente con el codigo que puse?


Nope, no es el copypaste, es el error literal como sale por consola, sale asi junto, a pesar de que yo lo escribo por separado. Pasa tambien con un solo guión, pero acabo de comprobar que sacandole los guiones funciona bien
Title: Re:Librería de eventos
Post by: SplinterGU on December 18, 2017, 04:57:34 PM
raro, intrigado que puede ser que con guiones no funcione... imagino que estas usando bennugd oficial? o algun fork?
Title: Re:Librería de eventos
Post by: JaViS on December 18, 2017, 05:06:55 PM
Quote from: SplinterGU on December 18, 2017, 04:57:34 PM
raro, intrigado que puede ser que con guiones no funcione... imagino que estas usando bennugd oficial? o algun fork?


bennugd oficial, a proposito, quizas a vos tambien te da el mismo error, proba llamar la funcion event_on en tu ejemplo, a mi me lo da en esa linea
Title: Re:Librería de eventos
Post by: JaViS on December 18, 2017, 05:59:24 PM
Perdón, el error tambien ocurre sin guiones bajos.
Title: Re:Librería de eventos
Post by: SplinterGU on December 18, 2017, 07:19:46 PM
Quote from: JaViS on December 18, 2017, 05:06:55 PM
Quote from: SplinterGU on December 18, 2017, 04:57:34 PM
raro, intrigado que puede ser que con guiones no funcione... imagino que estas usando bennugd oficial? o algun fork?


bennugd oficial, a proposito, quizas a vos tambien te da el mismo error, proba llamar la funcion event_on en tu ejemplo, a mi me lo da en esa linea

es cierto... bueno, ya lo revisare luego.

gracias!
Title: Re:Librería de eventos
Post by: SplinterGU on December 18, 2017, 08:20:54 PM
fixeado! muchas gracias!

por favor, en lugar de hacer un "workaround" para salir del paso, reportar estos errores... no teman preguntar, aunque parezca estupida la pregunta...

asi podemos depurar bien el producto.

nuevamente, muchas gracias!
Title: Re:Librería de eventos
Post by: JaViS on December 18, 2017, 08:44:01 PM
Buenísimo, voy a probar implementar los cambios que propones de vuelta y te cuento como me fué
Title: Re:Librería de eventos
Post by: SplinterGU on December 18, 2017, 10:52:49 PM
los cambios del fix, lo subi al svn, voy a esperar a revisar algunas cosas mas antes de generar el binario... pero ese bug ya esta resuelto.

puedes generar los binarios si quieres.