Luascenery: Różnice pomiędzy wersjami
Z MaSzyna
(Utworzono nową stronę "Obecnie w eksperymentalnych buildach @milek7 do częściowego sterowania eventami na sceneriach można użyć języka skryptowego Lua 5.1 (implementacja LuaJIT) Uwaga:...") |
|||
(Nie pokazano 6 wersji utworzonych przez jednego użytkownika) | |||
Linia 1: | Linia 1: | ||
− | + | Do częściowego sterowania eventami na sceneriach można użyć języka skryptowego Lua 5.1 (implementacja LuaJIT) | |
− | |||
− | |||
Skrypt dołącza się do scenerii poprzez dyrektywę <code>lua <ścieżka do skryptu></code>. | Skrypt dołącza się do scenerii poprzez dyrektywę <code>lua <ścieżka do skryptu></code>. | ||
Funkcje do interakcji z symulatorem dołączane są przez moduł <code>eu07.events</code>: | Funkcje do interakcji z symulatorem dołączane są przez moduł <code>eu07.events</code>: | ||
− | < | + | <nowiki> |
− | TEvent* event_create(const char* name, void (*handler)(TEvent*, TDynamicObject*), | + | TEvent* event_create(const char* name, double delay, double randomdelay, void (*handler)(TEvent*, TDynamicObject*)); |
+ | void (*func)(TEvent*, TDynamicObject*) event_preparefunc(function func); | ||
TEvent* event_find(const char* name); | TEvent* event_find(const char* name); | ||
const char* event_getname(TEvent *e); | const char* event_getname(TEvent *e); | ||
− | void event_dispatch(TEvent *e, TDynamicObject *activator); | + | void event_dispatch(TEvent *e, TDynamicObject *activator, double delay); |
− | void event_dispatch_n(const char* name, TDynamicObject *activator); | + | void event_dispatch_n(const char* name, TDynamicObject *activator, double delay); |
TTrack* track_find(const char* name); | TTrack* track_find(const char* name); | ||
bool track_isoccupied(TTrack *track); | bool track_isoccupied(TTrack *track); | ||
bool track_isoccupied_n(const char *name); | bool track_isoccupied_n(const char *name); | ||
+ | |||
+ | TIsolated* isolated_find(const char* name); | ||
+ | bool isolated_isoccupied(TIsolated *isolated); | ||
+ | bool isolated_isoccupied_n(const char *name); | ||
const char* train_getname(TDynamicObject *dyn); | const char* train_getname(TDynamicObject *dyn); | ||
Linia 27: | Linia 30: | ||
double random(double a, double b); | double random(double a, double b); | ||
void writelog(const char* txt); | void writelog(const char* txt); | ||
− | </ | + | void writeerrorlog(const char* txt); |
+ | </nowiki> | ||
Funkcje manipulujące obiektami przyjmują wskaźnik do wewnętrznych struktur C++ który zwykle może być wyszukany po nazwie przez odpowiednią funkcję *_find. | Funkcje manipulujące obiektami przyjmują wskaźnik do wewnętrznych struktur C++ który zwykle może być wyszukany po nazwie przez odpowiednią funkcję *_find. | ||
Linia 35: | Linia 39: | ||
scenery/td.scn: | scenery/td.scn: | ||
− | < | + | <nowiki> |
node -1 0 komorka1 memcell 1.0 1.0 1.0 abc 1 2 none endmemcell | node -1 0 komorka1 memcell 1.0 1.0 1.0 abc 1 2 none endmemcell | ||
event logval logvalues 0 komorka1 endevent | event logval logvalues 0 komorka1 endevent | ||
lua td.lua | lua td.lua | ||
− | </ | + | </nowiki> |
scenery/td.lua: | scenery/td.lua: | ||
− | < | + | <nowiki> |
local api = require "eu07.events" --użycie modułu API | local api = require "eu07.events" --użycie modułu API | ||
Linia 49: | Linia 53: | ||
--definiujemy event typu tp_Lua. funkcja callback przyjmuje argumenty: TEvent* który wywołał funkcję, TDynamicObject* który aktywował event (może być nil) | --definiujemy event typu tp_Lua. funkcja callback przyjmuje argumenty: TEvent* który wywołał funkcję, TDynamicObject* który aktywował event (może być nil) | ||
− | api.event_create("onstart_lua", function(event, activator) | + | api.event_create("onstart_lua", 0, 0, function(event, activator) |
--odczytuje memcell "komorka1" | --odczytuje memcell "komorka1" | ||
local mc = api.memcell_read_n("komorka1") | local mc = api.memcell_read_n("komorka1") | ||
Linia 62: | Linia 66: | ||
--uruchamiamy event "logval" żeby zobaczyć że memcell się zaktualizował (tak można wywołać dowolny event na scenerii, też te zdefiniowane w lua) | --uruchamiamy event "logval" żeby zobaczyć że memcell się zaktualizował (tak można wywołać dowolny event na scenerii, też te zdefiniowane w lua) | ||
− | api.event_dispatch_n("logval", activator) | + | api.event_dispatch_n("logval", activator, 0) |
--zaświecamy coś tam na semaforze | --zaświecamy coś tam na semaforze | ||
− | api.event_dispatch_n("stacja1_a_s13", activator); | + | api.event_dispatch_n("stacja1_a_s13", activator, 0); |
− | end | + | end) |
+ | |||
+ | </nowiki> | ||
− | + | [[Kategoria:Scenerie]] |
Aktualna wersja na dzień 22:20, 4 kwi 2022
Do częściowego sterowania eventami na sceneriach można użyć języka skryptowego Lua 5.1 (implementacja LuaJIT)
Skrypt dołącza się do scenerii poprzez dyrektywę lua <ścieżka do skryptu>
.
Funkcje do interakcji z symulatorem dołączane są przez moduł eu07.events
:
TEvent* event_create(const char* name, double delay, double randomdelay, void (*handler)(TEvent*, TDynamicObject*)); void (*func)(TEvent*, TDynamicObject*) event_preparefunc(function func); TEvent* event_find(const char* name); const char* event_getname(TEvent *e); void event_dispatch(TEvent *e, TDynamicObject *activator, double delay); void event_dispatch_n(const char* name, TDynamicObject *activator, double delay); TTrack* track_find(const char* name); bool track_isoccupied(TTrack *track); bool track_isoccupied_n(const char *name); TIsolated* isolated_find(const char* name); bool isolated_isoccupied(TIsolated *isolated); bool isolated_isoccupied_n(const char *name); const char* train_getname(TDynamicObject *dyn); void dynobj_putvalues(TDynamicObject *dyn, memcell_values v); TMemCell* memcell_find(const char *name); memcell_values memcell_read(TMemCell *mc); memcell_values memcell_read_n(const char *name); void memcell_update(TMemCell *mc, memcell_values v); void memcell_update_n(const char *name, memcell_values v); double random(double a, double b); void writelog(const char* txt); void writeerrorlog(const char* txt);
Funkcje manipulujące obiektami przyjmują wskaźnik do wewnętrznych struktur C++ który zwykle może być wyszukany po nazwie przez odpowiednią funkcję *_find. Istnieją też funkcje pomocnicze *_n, które odwołują się do obiektów przez nazwę. (wewnętrznie też wywołują _find)
Podstawowy przykład
scenery/td.scn:
node -1 0 komorka1 memcell 1.0 1.0 1.0 abc 1 2 none endmemcell event logval logvalues 0 komorka1 endevent lua td.lua
scenery/td.lua:
local api = require "eu07.events" --użycie modułu API api.writelog(tostring(api.random(5, 20))) --wypisywanie losowej liczby do loga --definiujemy event typu tp_Lua. funkcja callback przyjmuje argumenty: TEvent* który wywołał funkcję, TDynamicObject* który aktywował event (może być nil) api.event_create("onstart_lua", 0, 0, function(event, activator) --odczytuje memcell "komorka1" local mc = api.memcell_read_n("komorka1") --coś tam grzebiemy w wartościach mc.str = "def" mc.num1 = 3 mc.num2 = 4 --zapisujemy zmienioną komórkę api.memcell_update_n("komorka1", mc) --uruchamiamy event "logval" żeby zobaczyć że memcell się zaktualizował (tak można wywołać dowolny event na scenerii, też te zdefiniowane w lua) api.event_dispatch_n("logval", activator, 0) --zaświecamy coś tam na semaforze api.event_dispatch_n("stacja1_a_s13", activator, 0); end)