Autor Tema: Librería de eventos  (Leído 444 veces)

JaViS

  • Global Moderator
  • *****
  • Mensajes: 1192
  • Karma: 21
    • Anarkade
Librería de eventos
« en: Diciembre 17, 2017, 01:39:01 am »











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
« última modificación: Diciembre 17, 2017, 01:53:53 am por JaViS »
Working on Anarkade. A couch multiplayer 2D shooter.

Drumpi

  • Hero Member
  • *****
  • Mensajes: 6241
  • Karma: 157
  • Odio el periodo "entre proyectos"
    • La web de Drumpi
Re:Librería de eventos
« Respuesta #1 en: Diciembre 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.
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

  • Hero Member
  • *****
  • Mensajes: 801
  • Karma: 47
    • Torres Baldi Studio
Re:Librería de eventos
« Respuesta #2 en: Diciembre 17, 2017, 01:35:40 pm »
Se ve muy MUY interesante ese framework  :D
Torres Baldi Studio
http://torresbaldi.com

JaViS

  • Global Moderator
  • *****
  • Mensajes: 1192
  • Karma: 21
    • Anarkade
Re:Librería de eventos
« Respuesta #3 en: Diciembre 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
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12704
  • Karma: 374
Re:Librería de eventos
« Respuesta #4 en: Diciembre 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...

Código: [Seleccionar]

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

  • Global Moderator
  • *****
  • Mensajes: 1192
  • Karma: 21
    • Anarkade
Re:Librería de eventos
« Respuesta #5 en: Diciembre 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
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12704
  • Karma: 374
Re:Librería de eventos
« Respuesta #6 en: Diciembre 18, 2017, 02:34:04 am »
precompilador?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

JaViS

  • Global Moderator
  • *****
  • Mensajes: 1192
  • Karma: 21
    • Anarkade
Re:Librería de eventos
« Respuesta #7 en: Diciembre 18, 2017, 03:00:25 am »
Si, no se si le estoy diciendo bien, estoy usando #define
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12704
  • Karma: 374
Re:Librería de eventos
« Respuesta #8 en: Diciembre 18, 2017, 03:45:35 am »
ahh... me imagine... preprocesador... :D

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

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12704
  • Karma: 374
Re:Librería de eventos
« Respuesta #9 en: Diciembre 18, 2017, 04:12:10 am »
ahi vi tu codigo, lo podrias optimizar asi...

Código: [Seleccionar]
#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

  • Global Moderator
  • *****
  • Mensajes: 1192
  • Karma: 21
    • Anarkade
Re:Librería de eventos
« Respuesta #10 en: Diciembre 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)
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12704
  • Karma: 374
Re:Librería de eventos
« Respuesta #11 en: Diciembre 18, 2017, 12:21:13 pm »
ahora tambien lo dice?, quizas te falto el __ ? o falla eso?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12704
  • Karma: 374
Re:Librería de eventos
« Respuesta #12 en: Diciembre 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

Código: [Seleccionar]
process __event(int __event_code)
begin
priority = 255;
frame;
end
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

JaViS

  • Global Moderator
  • *****
  • Mensajes: 1192
  • Karma: 21
    • Anarkade
Re:Librería de eventos
« Respuesta #13 en: Diciembre 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:

Código: [Seleccionar]

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)

Código: [Seleccionar]
e=get_id(type __event)
Citar
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

  • Hero Member
  • *****
  • Mensajes: 12704
  • Karma: 374
Re:Librería de eventos
« Respuesta #14 en: Diciembre 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

Código: [Seleccionar]
#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

Código: [Seleccionar]
#include "events.inc"

begin
end

Código: [Seleccionar]
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