Luascenery: Różnice pomiędzy wersjami

Z MaSzyna
Skocz do: nawigacja, szukaj
 
(Nie pokazano 4 wersji utworzonych przez jednego użytkownika)
Linia 1: Linia 1:
Obecnie w eksperymentalnych buildach @milek7 do częściowego sterowania eventami na sceneriach można użyć języka skryptowego Lua 5.1 (implementacja LuaJIT)
+
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ę <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>
 
  <nowiki>
TEvent* event_create(const char* name, void (*handler)(TEvent*, TDynamicObject*), double delay);
+
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>
 
</nowiki>
  
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, 0) -- tu jeszcze ostatni argument event_create, opóźnienie eventu
+
end)
  
 
</nowiki>
 
</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)