Witamy na GTAOnline Obecny czas to 2018-06-20, 07:59 Użytkowników: 74895
Strona główna | Użytkownicy | Grupy | Faq | Regulamin | Zaloguj


Poprzedni temat :: Następny temat
Lua Kurs Lekcja nr. 5
Autor Wiadomość

marcin778 
Krytyk serwerów MTA





Informacje
Nick w MP: Marcineg
Wiek: 30
Na forum: 1243 dni
Posty: 2234
Piwa: 4088
Respekt: 1046,8
Respekt: 1046,8

Wysłany: 2017-10-19, 20:08   Lua Kurs Lekcja nr. 5



Witam!

W części piątej już poradników postaram się jak najlepiej opisać działanie wszystkich pętli w lua.


for
Pętla for jest najczęściej stosowaną przez nas w lua pętlą. Za pomocą pętli możemy pobrać coś z tabeli, pętla zwraca nam zazwyczaj klucz oraz wartość z tej tabeli.
Przykładowo
local tbl = {
[1] = 10,
[2] = 20,
[3] = 30,
[4] = 40,
}

for key,value in ipairs(tbl) do
  print(key.. ": "..value)
end
taki kod zwróci nam wynik w postaci
Kod:


1: 10
2: 20
3: 30
4: 40

Słowa key oraz value to kolejno klucz oraz wartość, jest to zwykła zmienna więc zamiast key,value możemy dać sobie cyferka,wynik jak chcemy. Musimy też zwrócić uwagę na słowo po operatorze przynależności in, czyli w tym przypadku "ipairs", jest to ważne, ponieważ ipairs iteruje tylko po kluczach, które są kolejnymi liczbami naturalnymi, klucze w tym przypadku to te cyfry w nawiasach kwadratowych, więcej o części z tabelami/tablicami. W przypadku takiej tabeli:

local tbl = {
['cukierki'] = 10,
['chipsy'] = 15,
['czekolada'] = 20,
}
nasza pętla przerwie działanie, ponieważ jak widać klucze nie są już liczbami naturalnymi tylko słowami/ciągami znaków (stringami), w takim wypadku trzeba użyć nie ipairs a pairs, gdyż pairs iteruje po wszystkim czyli i po liczbach i po stringach po każdych kluczach. Nasz kod z taką tabelą musi wyglądać tak:

local tbl = {
['cukierki'] = 10,
['chipsy'] = 15,
['czekolada'] = 20,
}

for key,value in pairs(tbl) do
 print(key..": "..value)
end
tutaj słowa key,value również nie są konieczne bo mogą być jakiekolwiek. Taki kod zwróci nam następujący wynik
Kod:


cukierki: 10
chipsy: 15
czekolada: 20


Pętla for kończy się słowem "do" i każda pętla for ma swojego end'a. Pętlą możemy też pobrać tylko klucz z tabeli.

local tbl = {
['cukierki'] = 10,
['chipsy'] = 15,
['czekolada'] = 20,
}

for k in pairs(tbl) do
 print(k)
end
taki kod zwróci nam
Kod:


cukierki
chipsy
czekolada


W przypadku takiej tabeli:

local tbl = {
{"tekst",1,2,3},
{"tekst2",3,2,1},
}


Kluczem będzie ilość indeksów tabeli, w tym przypadku 2 bo są dwa indeksy/rekordy. Czym jest index itd. dowiecie się w części z tabelami/tablicami.
Wszystkie te powyższe pętle/przykłady stosuje się najcześciej w przypadku tabel. Jest jeszcze jedna metoda pętli for, jest to pętla wykonująca się ilość razy w zmiennej.
 for zmienna wartoscwartosc koncowa do

W przypadku takiej pętli to zmienna zazwyczaj jest literą 'i' aczkolwiek to bez znaczenia. Przykładowo
for cola 0,do
print("Ilość butelek napoju: "..cola)
end
wynikiem takiego kodu będzie
Kod:


Ilość butelek napoju: 0
Ilość butelek napoju: 1
Ilość butelek napoju: 2
Ilość butelek napoju: 3
Ilość butelek napoju: 4
Ilość butelek napoju: 5

Pętla wykona się od 0 do 5 razy.

Każda pętla wykonuje się ileś razy, w zależności od pętli. Przykładowo

local tbl = {
{1,2,3},
{4,5,6},
}

for k,v in ipairs(tbl) do
print(k,v)
end
w przypadku takiego kodu pętla wykona się dwa razy, ponieważ wykona się ona tyle razy ile jest wszystkich indeksów w tabeli, dla jasności indeks/index w tabeli to
Kod:

{1,2,3},
w tym przypadku. Pętla wykonuje się tyle ile jest indeksów danej tabeli, wyjątkiem jest pętla for gdzie podajemy sami wartość od , której pętla ma zacząć i wartość na której pętla ma się skończyć. Możemy także zrobić tak

local tbl = {
{1,2,3},
{4,5,6},
}

for 1,#tbl do
print(i)
end

wtedy pętla wykona się od 1 do wielkości tabeli, czyli do tylu razy ile jest indeksów w niej ( w tym przypadku 2). Z pomocą takiej pętli też możemy wyciągnąć klucz oraz wartość z tabeli, tyczy się to już bardziej tabel ale pokażę skromny przykład.

local tbl = {
{1,2,3},
{4,5,6},
}

for 0,#tbl do
print(i,tbl[i][1],tbl[i][2])
end


Taki kod zwróci nam
Kod:

1 1 2
2 4 5
Po prostu podajemy wartość z pętli jako numer indeksu tabeli. Jest również jeszcze trzeci argument pętli numerycznej. Odpowiada on za przeskok wartości, czyli

for 1,10,do
 print(i)
end
taki kod nie zwróci nam liczb od 1 do 10 kolejno, tylko
Kod:


1
3
5
7
9
Jeśli pętla ma wykonywać się w dół czyli ujemnie to trzeci argument należy po prostu podać jako liczbę ujemną.

for 10,1, -do
print(i)
end
taki kod zwróci nam:
Kod:


10
9
8
7
6
5
4
3
2
1
Takie zastosowanie
 for 10,do
print(i)
end
nie zadziała.

Myślę, że z pętli for to byłoby chyba na tyle.

while
Pętla while jest rzadziej używana ale jest spotykana również. Pętla while działa jak powtarzający się warunek, czyli działa na zasadzie warunku if. Prosty przykład

local liczba 0

while liczba do
print(liczba)
liczba liczba 1
end
Taki kod wykona nam pętle, która ma za zadanie do zmiennej liczba dodawać po 1 przez cały czas, gdy zmienna liczba jest mniejsza niż 5, wynikiem takiego kodu będzie
Kod:


0
1
2
3
4
Jak można zauważyć, ostatnią liczbą jest 4, ponieważ jest to ostatnia liczba mniejsza od 5. Pętla while działa jak warunek if. Zamiast np
local s 1
if 10 then
s 1
end
można zrobić tak

local s 1
while 11 do
print(s)
1
end
do momentu gdy s jest mniejsze od 11 czyli nie jest większe od 10 to jest dodawana jedna wartość. Wynikiem będzie
Kod:


1
2
3
4
5
6
7
8
9
10
Czyli przykładowo możemy zrobić w zasobie pod mta zamiast

local ped createPed(0,0,0,0)

if isElement(pedthen
print("Ped już stoi")
end
można zrobić tak

local ped createPed(0,0,0,0)

while isElement(ped) do
print("Ped już stoi.")
end
Z pętli while też już raczej na tyle.

repeat until
Pętle repeat until czyli pętla powtórzeniowa jest chyba najrzadziej używaną pętlą w lua (przynajmniej pod mta). Pętla repeat until wykonuje się jak samo słowo until oznacza "aż" a repeat "powtórz" czyli powtarza się tak długo aż coś. Przykładowo

local z 0
repeat
z 1
print(z)
until (5)
taki kod powtórzy się tyle razy aż z będzie większe od 5. Wynik będzie
Kod:


1
2
3
4
5
6
z będzie równe 6 więc będzie większe od 5 i pętla zakończy swoje działanie. Możemy też użyć pętli powtórzeniowej z operatorem not.

local z 0
repeat
z 1
print(z)
until not (5)
"aż nie" czyli aż z nie będzie mniejsze od 5 to dodaje nam 1 do z Czyli wynik:
Kod:


1
2
3
4
5
. Jest to jedyna pętla, która nie potrzebuje swojego end'a oraz słowa "do".

Funkcja dotycząca pętli


Istnieje jeszcze coś takiego jak funkcja, niszcząca/przerywająca działanie pętli.

break
Funkcja break niszczy/przerywa pętle. Przykładowo

for 0,do
 print(i)
 if == 3 then
   break
 end
end
taka pętla nie dojdzie do 5, czyli nie wykona się 5 razy tylko 3, ponieważ mamy warunek, że jeśli pętla wykonała się 3 razy to ją przerywamy. Czyli wynikiem nie będzie
Kod:


1
2
3
4
5
tylko
Kod:

1
2
3


To wszystko o funkcji break.

Funkcja print nie jest funkcją mta ani nie jest funkcją dotyczącą pętel., działa ona w mta i wyświetla ona rezultat w debuggerze (/debugscript 0-3)


Przydatne linki

Pętle for numeryczne: https://www.lua.org/pil/4.3.4.html
Pętle for: https://www.lua.org/pil/4.3.5.html
Pętle while: https://www.lua.org/pil/4.3.2.html
Pętle repeat until(powtórzeniowe): https://www.lua.org/pil/4.3.3.html
Funkcja print: https://www.lua.org/pil/2.html (Funkcja print wyświetla tekst na ekranie, w przypadku mta w debuggerze)
Edytor lua online: https://www.lua.org/cgi-bin/demo - Bardzo dobra rzecz do testowania sobie kodów i uczenia się. Nie jest to narzędzie pod mta tylko pod lua, czyli funkcje mta tam nie działają bo nie istnieją.

W razie jakichś przeoczeń, lub jeśli czegoś zapomniałem to piszcie z chęcią poprawię.

_________________
Pomagam w miarę możliwości Discord: marcin778#7316
Również robię skrypty na zamówienie.

Moje prace: https://www.youtube.com/c...MuaWGHPp1mhlGnw

Jak to rzekł pewien mądry człowiek, są ludzie, którym lepiej ustąpić. Nie z powodu strachu lecz z powodu ich głupoty, która prowadzi donikąd.

-- obecnie
-- obecnie
-- dawniej
-- dawniej
-- obecnie
Ostatnio zmieniony przez marcin778 2017-10-21, 14:45, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
Więcej szczegółów
Wystawiono 4 piw(a):
STOPseba, kaMMi, BarteQ03, NoKill1997

BarteQ03 
LUA <3





Informacje
Nick w MP: Avenged
Wiek: 15
Na forum: 604 dni
Posty: 428
Piwa: 468
Respekt: 215,3
Respekt: 215,3Respekt: 215,3

Wysłany: 2017-10-20, 10:46   



A,co to jest to print? Działa to na zasadzie outputChatBox czy jak? :)

Postaw piwo autorowi tego posta
 

marcin778 
Krytyk serwerów MTA





Informacje
Nick w MP: Marcineg
Wiek: 30
Na forum: 1243 dni
Posty: 2234
Piwa: 4088
Respekt: 1046,8
Respekt: 1046,8

Wysłany: 2017-10-20, 15:07   



BarteQ03, Funkcja print w lua wyświetla rezultat na ekranie czyli jak outputChatBox w mta, tyle tylko, że funkcja print w MTA nie działa jak outputChatBox tylko jak
Więcej informacji znajdziesz w Wikipedii MTA:

outputDebugString
tyle tylko, że nie ma tam innych argumentów poza text'em. Czyli w przypadku czegoś takiego:


addCommandHandler("pr",function(plr,cmd)
 print("Wpisano komendę.")
end)
informacja "Wpisano komendę" po wpisaniu /pr pojawi się w debuggerze (debugscript) Jak wiadomo lua nie jest językiem używanym tylko w mta, print w lua to tak jak echo w php :)

_________________
Pomagam w miarę możliwości Discord: marcin778#7316
Również robię skrypty na zamówienie.

Moje prace: https://www.youtube.com/c...MuaWGHPp1mhlGnw

Jak to rzekł pewien mądry człowiek, są ludzie, którym lepiej ustąpić. Nie z powodu strachu lecz z powodu ich głupoty, która prowadzi donikąd.

-- obecnie
-- obecnie
-- dawniej
-- dawniej
-- obecnie
Postaw piwo autorowi tego posta
 

Jurandovsky 
Kurdebele





Informacje
Wiek: 9
Na forum: 1932 dni
Posty: 924
Piwa: 2314
Respekt: 945,3
Respekt: 945,3Respekt: 945,3

Wysłany: 2017-10-20, 22:35   



W pętli for: "for i = wartosc start, wartosc end do" nie wspomniałeś o jednej ważnej rzeczy, mianowicie, testowałem coś takiego jak:

for i = 10, 1 do
print(i)
end

na lua.org oraz w MTA i kompilator nie wiedział co zrobić.

Ta rzecz o której mianowicie zapomniałes to 3 argument takiej pętli, który sygnalizuje wartość przeskoku :


for 110do
print(i)
end

-- 1
-- 3
-- 5
-- 7
-- 9


Gdy pętla ma iterować od góry do dołu, to wtedy taki argument trzeba uwzględnić jako minus:


for 101, -do
print(i)
end -- dobrze


for 10do
print(i)
end -- niedobrze


_________________
Jedyny kontakt ze mną to PW forum

Kod:


local noobs = getElementsByTitle("player", "Programista LUA")
for k, v in ipairs(noobs) do
outputChatBox("Bez mózgu jest użytkownik o nicku: "..getPlayerName(v), root)
destroyElement(v)
end
Postaw piwo autorowi tego posta
 
Więcej szczegółów
Wystawiono 1 piw(a):
marcin778

Szydlo 
Stance Works





Informacje
Nick w MP: Szydlo
Wiek: 17
Na forum: 679 dni
Posty: 341
Piwa: 3
Respekt: 85,3

Wysłany: 2017-10-21, 13:17   



marcin778, Dobry poradnik, tylko mam pytanie. Ile masz jeszcze zamiar zrobić poradników?

[ Dodano: 2017-10-21, 13:23 ]
A, i czy masz zamiar skończyć kurs?

_________________
Aktualny najlepszy kontakt do mnie: Szydlo#8134 (Discord)
Postaw piwo autorowi tego posta
 

marcin778 
Krytyk serwerów MTA





Informacje
Nick w MP: Marcineg
Wiek: 30
Na forum: 1243 dni
Posty: 2234
Piwa: 4088
Respekt: 1046,8
Respekt: 1046,8

Wysłany: 2017-10-21, 14:39   



Jurandovsky, Rzeczywiście, dzięki za poprawę i uzupełnienie wiadomości.

Szydlo, Przeszkadzają ci moje poradniki? Nie wiem, staram tłumaczyć się bardziej podstawy ale na pewno jeszcze trochę części będzie. Czy kiedyś skończę kursy? No wiadomo nic wiecznie nie trwa, tematy się w końcu wyczerpią i kiedyś ten ostatni poradnik/kurs się pojawi jako już ostatnia część ale to daleka przyszłość :)

_________________
Pomagam w miarę możliwości Discord: marcin778#7316
Również robię skrypty na zamówienie.

Moje prace: https://www.youtube.com/c...MuaWGHPp1mhlGnw

Jak to rzekł pewien mądry człowiek, są ludzie, którym lepiej ustąpić. Nie z powodu strachu lecz z powodu ich głupoty, która prowadzi donikąd.

-- obecnie
-- obecnie
-- dawniej
-- dawniej
-- obecnie
Postaw piwo autorowi tego posta
 

Szydlo 
Stance Works





Informacje
Nick w MP: Szydlo
Wiek: 17
Na forum: 679 dni
Posty: 341
Piwa: 3
Respekt: 85,3

Wysłany: 2017-10-21, 18:34   



marcin778, Nie, właśnie i są potrzebne i rób je. Najpierw Zrób te najważniejsze rzeczy(z których najczęściej używa), a potem takie poboczne.

[ Dodano: 2017-10-21, 18:34 ]
No i szanuje, bo zrobiłeś więcej niż dwa kursy.

[ Dodano: 2017-10-22, 10:18 ]
MonsteR2002, Lepiej żeby najpierw wytłumaczył podstawy, a potem samemu zrozumiesz, oraz samemu zrobisz.

Postaw piwo autorowi tego posta
 

PolskiSebek12 
Programista





Informacje
Nick w MP: CrosRoad95
Wiek: 20
Na forum: 1440 dni
Posty: 320
Piwa: 2014
Respekt: 263
Respekt: 263Respekt: 263Respekt: 263

Wysłany: 2018-01-07, 19:47   



nie pokazałeś jak zrobić pętle "bez pętli" czyli rekurencje

_________________
]Ätśń”\ń¶Ă0ĺ)óń†”3ŃyPXçˇ.+U´]Đ®'„ëŠPK&ú°íb‹!R$ƒƒśac\+¤¬„`,U„ŕ#1vXŞ•”&ĐƒraFş¸ˇdiź«·ç%eŚŞŞ(FĄ.Şe-ĄaÖ˙Ă/ţĂß˙-oĺÚţ”ďáÇö%ŕ˙r÷Yxßő›ż'ćőwlĽnće)VŤłFŤčDĘ…®ëčşŔš¬ĺ„U%dúˆŹxŹ1Đő=±ß˛¬•ižpĆPŇŠµo ¤Ç̇'¤TpÖś
Postaw piwo autorowi tego posta
 

DevJumpDj 
Developer





Informacje
Nick w MP: DeMoNeK_
Wiek: 19
Na forum: 568 dni
Posty: 85
Piwa: 405
Respekt: 105,3
Respekt: 105,3

Wysłany: 2018-01-09, 15:25   



Bardzo dobre lekcje piszesz muszę przyznać. Oby tak dalej bo naprawdę nowe osoby uczące się lua mogą wyciągnąć dużo z twoich lekcji :D

_________________

Project: Apocalipse - Przeżyj w świecie postapo!

Discord: https://discord.gg/FTxP7ee

Postaw piwo autorowi tego posta
 
Tagi: lua :: kurs :: lekcja :: nr.
Anonymous



Dołaczył: Wczoraj 0:00
Posty: 1
Skad: google.com


Anonymous Koniecznie zajrzyj na:







Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Wersja do druku

Skocz do:  


phpBB by Przemo modified by xXx 2003-2016

Template GTAONLINE created by gtaonline.pl



Strona wygenerowana w 0,39 sekundy. Zapytań do SQL: 18