Luascenery

Z MaSzyna
Wersja z dnia 16:16, 31 sie 2017 autorstwa Milek7 (dyskusja | edycje) (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:...")
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Skocz do: nawigacja, szukaj

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: API eksperymentalne, może sie jeszcze znacząco zmienić

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, void (*handler)(TEvent*, TDynamicObject*), double delay); TEvent* event_find(const char* name); const char* event_getname(TEvent *e); void event_dispatch(TEvent *e, TDynamicObject *activator); void event_dispatch_n(const char* name, TDynamicObject *activator);

TTrack* track_find(const char* name); bool track_isoccupied(TTrack *track); bool track_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);

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", 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)
   --zaświecamy coś tam na semaforze
   api.event_dispatch_n("stacja1_a_s13", activator);

end, 0) -- tu jeszcze ostatni argument event_create, opóźnienie eventu