R
Rahim
Guest
Na pocz?tku chcia?bym podkre?li?, ?e ten poradnik jest przeznaczony dla os?b zaawansowanych. Tak wi?c je?li dopiero zacz??e? swoj? przygod? z LUA to radz? Ci omin?? ten poradnik i wr?ci? do niego, jak nabierzesz do?wiadczenia.
Zabraniam udost?pniania na inne fora - Rahim.
W tym poradniku postaram si? wyja?ni?
Mi?o by by?o, gdyby?cie wcze?niej zapoznali si? z dwoma poradnikami mojego kolegi po fachu - Gelia:
http://tibia.net.pl/lua-xml/178429-kurs-lua.html
http://tibia.net.pl/lua-xml/178616-kurs-lua-cz-2-petle-oraz-tablice.html
Zaczn? od uzupe?nienia drugiego poradnika (dopisz? to, czego m?j poprzednik o tablicach nie napisa?).
1. TABLICE & P?TLE
Zabraniam udost?pniania na inne fora - Rahim.
Poradnik pisz? aby poprawi? umiej?tno?ci skrypter?w tego forum, nie innychPlagiaty w Polsce podlegaj? karze grzywny, ograniczenia wolno?ci, albo pozbawienia wolno?ci do lat 3 (Prawo Autorskie i Prasowe, rozdz. 14., art. 115) - s? ?cigane nie tylko z pow?dztwa cywilnego.
Plagiat jest ?cigany przez prokuratora z pow?dztwa karnego - osoby kt?re go pope?niaj?, s? w kr?tkim czasie wzywane do s?du i przes?uchiwane przez prokuratora, a sprawy tocz? si? szybko, a nie ci?gn? si? latami.
W tym poradniku postaram si? wyja?ni?
Mi?o by by?o, gdyby?cie wcze?niej zapoznali si? z dwoma poradnikami mojego kolegi po fachu - Gelia:
http://tibia.net.pl/lua-xml/178429-kurs-lua.html
http://tibia.net.pl/lua-xml/178616-kurs-lua-cz-2-petle-oraz-tablice.html
Zaczn? od uzupe?nienia drugiego poradnika (dopisz? to, czego m?j poprzednik o tablicach nie napisa?).
SPIS TRE?CI:
1. TABLICE & P?TLE
- Dodawanie warto?ci do tablicy.
- Pairs i ipairs
- Funkcje table
- Repeat... until
DODAWANIE WARTO?CI DO TABLICY
Powinni?cie ju? wiedzie?, co to jest tablica, jak "wyci?gn??" z niej jak?? warto?? i j? u?y?, jak dopisa? lub napisa? jak?? warto?? w tablicy. Zrobi? wam jednak powt?rk? z dodawania warto?ci do tablic.
Na og?? s? dwie metody - pierwsza to table.insert, druga to po proste
Jak zauwa?yli?my, liczba 8 zosta?a dopisana na ko?cu tabeli. A co, je?li chcemy mie? j? w ?rodku?
Druga metoda s?u?y do podmieniania warto?ci w tablicy. Na upartego mo?na tak?e dzi?ki niej doda? warto?? do tablicy, ale wydajniejszy jest pierwszy spos?b. Przyk?ad podmieniania:
Na pozycji numer 6 widzimy drugie z rz?du "nil" (kolorem niebieskim). Dlaczego nil? Dlatego, bo pr?bowa?em podmieni? pozycj? numer 5 w tabeli za zmienn? Rahim, kt?ra nie istnieje.
Gdybym zrobi? co? takiego:
Na og?? s? dwie metody - pierwsza to table.insert, druga to po proste
Tak naprawd? tylko za pomoc? table.insert mo?emy "wepchn??" jak?? warto?? np. w ?rodek tabeli. Druga metoda tylko podmienia warto??, zatem opiszmy lepiej pierwsz? metod?. Ot?? table.insert ma nie dwa... lecz trzy parametry. Jeden jest opcjonalny (?rodkowy):table[index] = wartosc
table.insert(tablica, [pozycja,] wartosc)
Chyba ka?dy z was cho? raz u?y? tej funkcji, wi?c doskonale wie, ?e ta metoda bez ?rodkowego parametru dopisuje warto??... na ko?cu tabeli. A co, je?li chcemy dopisa? na przyk?ad w ?rodku tabeli? Przeanalizujmy przyk?ad:
Przy okazji s?owo wyja?nienia - co to do licha jest to unpack? To jest funkcja LUA, kt?ra "rozpakowywuje" tablic?. Zrozumiecie lepiej, gdy zobaczycie efekt kocowy:local tbl = {1,2,3,4,5,6,7}
table.insert(tbl, 8)
print(unpack(tbl))
1 2 3 4 5 6 7 8
Dzi?ki unpack nie musz? u?ywa? p?tli. Na upartego m?g?bym skrypt napisa? tak:
i efekt ko?cowy by?by prawie identyczny (prawie, bo ka?da liczba by?a by od nowego wiersza - zale?y od silnika, na kt?ym testujemy).local tbl = {1,2,3,4,5,6,7}
table.insert(tbl, 8)
for i = 1, #tbl do print(tbl) do
Jak zauwa?yli?my, liczba 8 zosta?a dopisana na ko?cu tabeli. A co, je?li chcemy mie? j? w ?rodku?
Oto, co otrzymamy:local tbl = {1,2,3,4,5,6,7}
table.insert(tbl, 4, 8)
print(unpack(tbl))
1 2 3 8 4 5 6 7
Dzi?ki zastosowaniu "table.insert(tbl, 4, 8)"liczba "8" zosta?a "wepchni?ta" na czwart? pozycj? w tabeli, co spowodowa?o, ?e warto?ci za ni? zwi?kszy?y swoj? pozycj? o 1.
Druga metoda s?u?y do podmieniania warto?ci w tablicy. Na upartego mo?na tak?e dzi?ki niej doda? warto?? do tablicy, ale wydajniejszy jest pierwszy spos?b. Przyk?ad podmieniania:
local tbl = {1, 2, 3, 4, 5, 6, 7}
tbl[1] = 8
print(unpack(tbl))
8 2 3 4 5 6 7
Warto?? pierwszej liczby zosta?a zmieniona na 8. Pr?cz liczb mo?emy ?mia?o tak?e u?ywa? string?w, boolean?w, tablic a nawet i nil
local tbl = {1, 2, 3, 4, 5, 6, 7}
tbl[1] = "Yo" --podmieniamy wartosc o pozycji jeden na slowo "Yo"
tbl[2] = true --podmieniamy wartosc o pozycji dwa na wartosc logiczna prawda
tbl[3] = {5, 103434, ":<", false} --podmieniamy wartosc o pozycji trzy na tablice
tbl[4] = nil --podmieniamy wartosc o pozycji cztery za nil, NULL czy jak kto woli
tbl[5] = Rahim --podmieniamy wartosc o pozycji piec na zmienna o nazwie Rahim
tbl[6] = "Rahim" --podmieniamy wartosc o pozycji szesc na slowo "Rahim"
print(unpack(tbl))
Yo true table: 003ED818 nil nil Rahim 7
Zastanawiacie si?, dlaczego zamiast pokaza? zawarto?? tabeli zawartej na trzeciej pozycji tabeli pokaza?o si? jakie? "table: 003ED818"? Jakby to nale?ycie opisa?... Szczerze to sam nie jestem w 100% pewien, moim zdaniem jest to po prostu identyfikator zmiennej kryj?cej si? pod t? tablic?. Tak, jak na przyk?ad w skryptach ots r??ne postacie, potwory itp. maj? uid typu 42364234, 453847534, 4357345 itd. "E" jest to znak notacji wyk?adniczej, D oznacza bodaj?e dziedzin?... Mniejsza o tym, lecimy dalej.
Na pozycji numer 6 widzimy drugie z rz?du "nil" (kolorem niebieskim). Dlaczego nil? Dlatego, bo pr?bowa?em podmieni? pozycj? numer 5 w tabeli za zmienn? Rahim, kt?ra nie istnieje.
Gdybym zrobi? co? takiego:
Mym oczom ukaza?by si? taki efekt:local tbl = {1, 2, 3, 4, 5, 6, 7}
tbl[1] = "Yo" --podmieniamy wartosc o pozycji jeden na slowo "Yo"
tbl[2] = true --podmieniamy wartosc o pozycji dwa na wartosc logiczna prawda
tbl[3] = {5, 103434, ":<", false} --podmieniamy wartosc o pozycji trzy na tablice
tbl[4] = nil --podmieniamy wartosc o pozycji cztery za nil, NULL czy jak kto woli
Rahim = ""
tbl[5] = Rahim --podmieniamy wartosc o pozycji piec na zmienna o nazwie Rahim
tbl[6] = "Rahim" --podmieniamy wartosc o pozycji szesc na slowo "Rahim"
print(unpack(tbl))
Yo true table: 003ED818 nil Rahim 7
Z tablicami asocjacyjnymi jest tak samo. Je?li za? chcemy podmieni? warto?? w takiej tablicy:
Piszemy takie co?:local pos = {x= 1000, y=1000, z=7, stackpos=254}
Po u?yciu print(unpack(pos)) jednak niczego nie zobaczymy - unpack wy?wietla tylko warto?ci z "normalnych" tabel, czyli takich, w kt?rych warto?ci s? posuatwiane po kolei. _/pos.x = 999
pos.y = 998
pos.z = 8
Wypisze nam na ekranie tylkotbl = {x=1000, y=1000, z=7, 3, 4, [50] = "XD", ["lala"] = 2}
print(unpack(tbl))
3 4
Na pocz?tku napisa?em, ?e na upartego dzi?ki tej metodzie mo?na dodawa? nowe warto?ci na ko?cu tabeli. Na upartego? A co niby jest w tym takiego trudnego? A no spr?bujmy:
Zobaczymy co? takiego:tbl = {1, 2, 3, 4, 5, 6}
tbl[9] = 9
print(unpack(tbl))
1 2 3 4 5 6
Dlaczego wi?c warto?? 9 nie zosta?a dodana do tabeli? Ot?? ta metoda s?u?y tylko do podmieniania za inne warto?ci na podanej pozycji... a tak si? sk?ada, ?e pozycja numer dziewi?? w tej tabeli nie istnieje - zatem nie ma jak podmieni?. Kiedy? mo?na by?o u?y? w tym przypadku funkcji table.setn, jednak i tak najlepszym wyj?ciem jest u?ycie table.insert(tbl, 9, 9)
pairs & ipairs
Co to jest to pairs oraz ipairs? Kolejna zagadka? Ot??... kurde, to si? da opisa? po ludzku? Nie wiem, jak wam opisa? po "informatycku", zatem zrobi? to po swojemu - opisz? na przyk?adzie.
Mamy sobie skrypcik:
A oto efekt kocowy:
1 1
2 no hej!
yo 76.2
x 6
Jak widzimy pairs "przekopuje" tablic? w jakiej? chi?skiej kolejno?ci... zamiast posuwa? si? w praw? stron, on najpierw wy?wietla zawarto?? pierwszego pola, po czym ostatnie, i zaczyna i?? w lew? stron? xd.
ipairs dzia?a podobnie do pairs z t? r??nic?, ?e ipairs dzia?a tylko gdy k jest liczb?. Przypatrzmy si? na to:
Czym tak naprawd? s? pairs i ipairs? S? to funkcje wbudowane LUA (jak unpack, print i inne), kt?rych parametrem musi by? tablica oraz zwracaj? dwie warto?ci! Wi?cej o zwracaniu dw?ch warto?ci z funkcji w rozdziale "Returny".
To teraz troszk? praktyczniej. Do czego mo?e nam si? przyda? pairs i ipairs? B?dzie to bardzo u?yteczne np. w tablicy, kt?rej warto?ciami s? uid stworze?, przedmiot?w itd. ?atwiej b?dzie na przyk?ad napisa? skrypt, kt?ry wysy?a do ka?dego gracza jak?? wiadomo??:
Inaczej m?wi?c pairs i ipairs jest nieocenione, kiedy trzeba u?y? wszystkich warto?ci z tablicy. Przyk?ad: M
Mamy w tablicy pozycje, chcemy sprawdzi?, czy s? na nich gracze.
Jak by?my to zrobili bez u?ycia pairs i ipairs.
Oraz z u?yciem naszych dw?ch funkcji.
R??nica jest tylko jedna - positions zast?puje v. Mimo tego przyjemniej u?ywa si? tej drugiej metody.
Jeszcze tak na zako?czenie. i, v oraz k, v s? tylko nazwami zmiennych. Mo?emy za nie podstawi?, co tylko zechcemy - np. zenek, mietek czy te? kanapka, kosmita itp.
To by by?o na tyle z tej cz??ci.
Mamy sobie skrypcik:
I chcemy wy?wietli? wszystkie warto?ci zawarte w tabeli (jak wiemy, unpack wy?wietli tylko liczby). Co mamy zrobi?? Zastosujemy p?tl?! Tak!local tbl = {1, 567, 123, 7856, "xDD", "yo u"}
Takie co? wy?wietli nam:local tbl = {1, 567, 123, 7856, "xDD", "yo u"}
for i = 1, #tbl do
print(tbl)
end
1
657
123
7856
xDD
yo u
Ok, wszystko fajnie... tylko co, gdy mamy tak? tabel??
657
123
7856
xDD
yo u
Zastosujmy i w tym przypadku t? sam? p?tl?:local tbl ={1, x=6, ["yo"] = 76.2, "no hej!"}
Oto, co ujrzymy:local tbl = {1, x=6, ["yo"] = 76.2, "no hej!"}
for i = 1, #tbl do
print(tbl)
end
1
no hej!
W takich przypadkach pomo?e nam... w?a?nie pairs. Pairs odczytuje wszelkie wartosci z tablicy, ?adna nie zostanie omini?ta. Przyk?ad z zastosowaniem pairs.no hej!
pairs jest funkcj?, kt?rego parametrem musi by? tablica.local tbl = {1, x=6, ["yo"] = 76.2, "no hej!"}
for k, v in pairs(tbl) do
print(k, v)
end
A oto efekt kocowy:
1 1
2 no hej!
yo 76.2
x 6
Jak widzimy pairs "przekopuje" tablic? w jakiej? chi?skiej kolejno?ci... zamiast posuwa? si? w praw? stron, on najpierw wy?wietla zawarto?? pierwszego pola, po czym ostatnie, i zaczyna i?? w lew? stron? xd.
ipairs dzia?a podobnie do pairs z t? r??nic?, ?e ipairs dzia?a tylko gdy k jest liczb?. Przypatrzmy si? na to:
W konsoli uj?ymy:local tbl = {1, x=6, ["yo"] = 76.2, "_/!", 4, 7}
for k, v in ipairs(tbl) do
print(k, v)
end
1 1
2 _/!
3 4
4 7
My?l?, ?e wida?, dlaczego.2 _/!
3 4
4 7
Czym tak naprawd? s? pairs i ipairs? S? to funkcje wbudowane LUA (jak unpack, print i inne), kt?rych parametrem musi by? tablica oraz zwracaj? dwie warto?ci! Wi?cej o zwracaniu dw?ch warto?ci z funkcji w rozdziale "Returny".
To teraz troszk? praktyczniej. Do czego mo?e nam si? przyda? pairs i ipairs? B?dzie to bardzo u?yteczne np. w tablicy, kt?rej warto?ciami s? uid stworze?, przedmiot?w itd. ?atwiej b?dzie na przyk?ad napisa? skrypt, kt?ry wysy?a do ka?dego gracza jak?? wiadomo??:
PHP:
for i, v in ipairs(getPlayersOnline()) do
doPlayerSendTextMessage(v, MESSAGE_INFO_DESCR, "Tresc wiadomosci.")
end
Mamy w tablicy pozycje, chcemy sprawdzi?, czy s? na nich gracze.
Jak by?my to zrobili bez u?ycia pairs i ipairs.
PHP:
local positions = {{x=1000, z=1000, z=7, stackpos=253}, {x=584, y=972, z=8, stackpos=253}}
for i = 1, #positions do
if(not isPlayer(getThingfromPos(positions[i]).uid)) then
return false
end
end
PHP:
local positions = {{x=1000, z=1000, z=7, stackpos=253}, {x=584, y=972, z=8, stackpos=253}}
for i, v in ipairs(positions) do
if(not isPlayer(getThingfromPos(v).uid)) then
return false
end
end
Jeszcze tak na zako?czenie. i, v oraz k, v s? tylko nazwami zmiennych. Mo?emy za nie podstawi?, co tylko zechcemy - np. zenek, mietek czy te? kanapka, kosmita itp.
To by by?o na tyle z tej cz??ci.