Librería de eventos

Started by JaViS, December 17, 2017, 01:39:01 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

JaViS












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
Working on Anarkade. A couch multiplayer 2D shooter.

Drumpi

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.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

gecko

Se ve muy MUY interesante ese framework  :D
Torres Baldi Studio
http://torresbaldi.com

JaViS

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
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

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...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

JaViS

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
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

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

JaViS

Si, no se si le estoy diciendo bien, estoy usando #define
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

ahh... me imagine... preprocesador... :D

jejeje, ahora si... muy bien entonces, genial...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

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
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

JaViS

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)
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

ahora tambien lo dice?, quizas te falto el __ ? o falla eso?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

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
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

JaViS

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!
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

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)

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