What's new

Funkcja addEvent.

Thorge D

Advanced User
Joined
Jul 24, 2014
Messages
300
Reaction score
29
Autor: Simon


Dobra z racji tego, ?e jestem tutaj nowy i w og?le to chcia?bym udost?pni? m?j tutorial, kt?ry ju? powsta? sporo czasu temu. Mam nadziej?, ?e przyda si? on jakim? skrypterom.

Dotyczy on funkcji addEvent, kt?ra jest popularna i do?? cz?sto u?ywana, je?eli chcemy skorzysta? z us?ugi timera w Lua.

Posiada ona trzy atrybuty:
PHP:
callback - funkcja, kt?ra zostanie wywo?ana.
delay - czas po jakim wywo?a si? funkcja.
parameters - parametry, kt?re u?ywane s? w funkcji jako parametr 'callback', kt?re trzeba deklarowa? z "zewn?trz" (wymaga g??bszego wyja?nienia).
Parametrem callback przekazujemy funkcj?. Mo?e to by? ju? istniej?ca funkcja lub te? funkcja anonimowa. Je?eli wybrali?my wariant pierwszy, to w celu jej przekazania wystarczy poda? tylko jej nazw?. Dla przyk?adu:
[LUA]local function dodaj()
print(5+3)
end

addEvent(dodaj,500) -- u?ywamy wcze?niej stworzonej funkcji [/LUA]

Nic nie stoi na przeszkodzenie, ?eby?my u?yli wspomnianej wcze?niej funkcji anonimowej, co w wielu przypadkach jest bardzo dobrym pomys?em:
[LUA]addEvent(function() -- tworzymy zupe?nie now? funkcj? jako parametr funkcji addEvent
print(5+3)
end,1000) [/LUA]

Drugi parametr okre?la czas, po kt?rym ma zosta? wywo?ana funkcja przes?ana jako pierwszy parametr. Jest on wyra?ony w milisekundach (0,001 sekundy). Technik? stylistyczn?, kt?ra poprawia wygl?d tej?e funkcji jest zapis:
[LUA]addEvent(function()
print("Hello world z opoznieniem")
end, 5 * 1000) -- zapis x * 1000 jest bardzo popularny w przypadku tej funkcji [/LUA]
Dzi?ki temu innym skrypterom ?atwiej jest na pierwszy rzut oka odczyta?, za co odpowiada ten parametr.

Skrypt:
[LUA]for i = 1, 5 do
addEvent(function()
print("Wiadomosc z opoznieniem.")
end, i * 1000)
end [/LUA]
Wywo?a napis "Wiadomosc z opoznieniem." pi?ciokrotnie, z odst?pami po jednej sekundzie.

Jak wida? jest to bardzo wygodna funkcjonalno??, kt?ra bardzo rozszerza mo?liwo?ci tego j?zyka skryptowego.

Ostatni parametr - parameters odpowiada parametrom funkcji, kt?ra zosta?a przes?ana jako callback. Sposoby ich przes?ania s? dwa - za pomoc? tablicy, lub te? po przecinkach.

Za???my, ?e posiadamy funkcj?, kt?ra dodaje do siebie dwie liczby - x i y.
[LUA]function sum(x, y)
return x + y
end [/LUA]
Chcemy, ?eby jej warto?ci by?y liczone z pewnym odst?pem czasowym w zagnie?d?onej p?tli for. Nic trudnego!
[LUA]for i = 1, 10 do
for j = 1, 10 do
addEvent(function(x, y)
print(sum(x, y))
end, (i + j) * 1000, i, j)
end
end [/LUA]

U?yli?my funkcji anonimowej, kt?ra pobiera dwa parametry, przekazali?my je jako parametr 3. i 4. funkcji addEvent.

Przekazanie parametru parameters jako tablicy w tym przypadku wygl?da?oby nast?puj?co:
[LUA]for i = 1, 10 do
for j = 1, 10 do
addEvent(function(x, y)
print(sum(x, y))
end, (i + j) * 1000, {x = i, y = j})
end
end [/LUA]

Tak jak widzimy, aby przekaza? parametry w tablicy, wystarczy zdefiniowa? je pod odpowiadaj?cymi im indeksom w tabeli, kt?ra przekazywana jest jako parametr nr 3.

U?ycie funkcji addEvent razem z funkcjami typowo OTSowymi nie stanowi ?adnego problemu. A o to skrypt clean.lua z katalogu data/globalevents/scripts, kt?ry prezentuje u?ycie funkcji addEvent w ?rodowisku skryptowym OTSa:
[LUA]function executeClean()
doCleanMap()
doBroadcastMessage("Game map cleaned, next clean in 2 hours.")
return true
end

function onThink(interval, lastExecution, thinkInterval)
doBroadcastMessage("Game map cleaning within 30 seconds, please pick up your items!")
addEvent(executeClean, 30000)
return true
end [/LUA]

My?l?, ?e om?wi?em ju? wszystkie podstawowe mo?liwo?ci tej funkcji, kt?re pozwol? tworzy? bardziej zaawansowane mechanizmy. W razie pyta? s?u?? pomoc?.

Pozdrawiam.
 

#NOOB

Senior User
Joined
May 25, 2014
Messages
901
Reaction score
88
Odp: Funkcja addEvent.

Taka funkcja bardzo by sie przydala pod 7.6 (zreszta nie tylko taka) ale brak chetnych do opublikowania ;P

A co do poradnika to git majonez bo wkoncu Simon z dawnego otsoftu [*] go pisa?.
 

Dantez

Moim sekretem jest ciasto
Joined
May 22, 2008
Messages
1,206
Reaction score
202
Odp: Funkcja addEvent.

[LUA]for i = 1, 10 do
for j = 1, 10 do
addEvent(function(x, y)
print(sum(x, y))
end, (i + j) * 1000, {x = i, y = j})
end
end[/LUA]
Nie wiem, czy to by?o kiedy? mo?liwe, ale obecnie to nie zadzia?a. Tablica b?dzie traktowana jako parametr "x", a "y" b?dzie mia? warto?? nil. W tym przypadku funkcja sum b?dzie pr?bowa?a doda? do siebie te dwie warto?ci, a to niemo?liwe.

Od siebie dodam, ?e Lua przesy?a wszystkie tablice przez referencj?, co w przypadku op??nionych zdarze? mo?e powodowa? wywo?anie funkcji z "najnowsz?" wersj? tablicy, a nie t? kt?r? chcieli?my przes?a?.

[LUA]{x = i, y = j}[/LUA]
Takie u?ycie tworzy now? tablic? za ka?dym razem, a wi?c jest bezpieczne.
 

Thorge D

Advanced User
Joined
Jul 24, 2014
Messages
300
Reaction score
29
Odp: Funkcja addEvent.

Kto? ma co? do dodania to ?mia?o dodawa? dla nowych.
Przyda si?.

PS. Poradniki s?dz?, ?e powinny by? dawno w odpowiednich kategoriach.
 
Top