Zaloguj się by uzyskać pełen dostęp. Nie masz jeszcze konta? Założ je już teraz w kilka sekund.

Wysłany: 2018-02-26, 00:27


marcin778

Krytyk serwerów MTA






Wiek: 31
Na forum: 1671 dni
Posty: 2236
Nick w MP: Marcineg

Piwa: 5289

Respekt: 1316,8
Respekt: 1316,8


Witam!
W dzisiejszej części zajmiemy się funkcjami tonumber,tostring, pętlą next o której zapomniałem wspomnieć, budową warunku z operatorów też zapomniałem o tym wspomnieć w operatorach. I funkcją interpolateBetween. Oraz falą sinusoidalną (sinusoidą), która jest dla wielu czarną magią. Omówimy tez loadstring i type.

tonumber
Funkcja tonumber, jak sama nazwa brzmi zmienia string na liczbę.


local x "100"

10

print(y)

Taki kod nam co prawda zadziała. Ale tylko w lua. Na przykładzie


local x getElementData(localPlayer,"data")
setElementData(localPlayer,"data",15)

Może zwrócić błąd, w zależności od wartości elementdaty. Dlatego trzeba użyć tonumber.


local x tonumber(getElementData(localPlayer,"data"))
setElementData(localPlayer,"data",15)


tostring
Funkcja tostring działa odwrotnie. Zamienia liczbę na string.


local x 100

print(tostring(x) + 15)
Też zadziała, ale w lua.

Natomiast w mta


local count getElementData(localPlayer,"data") -- zwraca nam liczbę np10a chcemy zapisać "data: ilosc"

setElementData(localPlayer,"data",tostring("data: "..count))
Co prawda z liczbą też by zadziałało, ale nie mam pomysłu na inny przykład :P

loadstring
Funkcja loadstring, 'ładuje' string. Możemy do niej przekazać funkcję w postaci stringa a ona ją wykona jeśli ją wywołamy. Obecnie w lua nie ma już funkcji loadstring, zastępuje ją funkcja load, ale mta korzysta ze starszej wersji lua, gdzie loadstring jeszcze jest.


text "test"

local result loadstring("print("Text"..text)")

print(result())

Taki kod zwróci błąd, w loadstring wrzucamy w cudzysłów, a tekst w print też przyjmuje string, więc nie możemy go dać w cudzysłowie również bo finalnie 'zamkniemy' string od loadstring. Więc musimy użyć apostrofów. Natomiast jeśli otwieramy loadstring w apostrofach to w print musimy użyć cudzysłowów.



text "test"

local result loadstring("print('Text: '..text)")

print(result)
Taki kod owszem zadziała, ale zwróci
Kod:

function: x
x dla nas nie jest ważne. Musimy więc tą funkcję wywołać.


text "test"

local result loadstring("print('Text: '..text)")

print(result())


Taki zwróci nam
Kod:

Text: test
:)

Warunek z AND i OR
Niestety zapomniałem wspomnieć o tym w części z operatorami.

Zamiast


local x 10

if 15 25 then
   x 15
else 
  5
end
Jeśli x + 15 jest mniejsze od 25 to dodajemy 15, jeśli nie to odejmujemy 5. Możemy takiego czegoś uniknąć,

15 25 and 15 or -5

Już tłumaczę. Tutejsze "and" zadziała tak jak "if" w pierwszym przykładzie. Czyli jeśli x + 15 jest mniejsze od 25 to dodajemy 15. Natomiast "or" zadziała jak else w pierwszym przykładzie. Czyli jeśli nie jest mniejsze od 25 to odejmujemy 5.

Pętla next
Pętla next.. także zapomniałem o niej w części z pętlami.


local tbl = {"a","b","c","d","e"}

function getIndex()
   local k,next(tbl)
      while do
         print(k,v)
         k,next(tbl,k)
     end
end

getIndex()
Tak więc, pętla next zwraca nam kolejny indeks i jego wartość z tabeli. while k do - sprawdzamy czy taki indeks istnieje, jeśli tak to lecimy tak długo aż będzie się spełniał nasz "warunek" while. k,v = next(tbl,k) - ustawiamy następny indeks, czyli local k,v zwraca nam następny indeks (pierwszy) a potem jak już wyświetlimy nasze pierwsze k,v ustawiamy k,v na następny indeks. W drugim przypadku ustawiamy drugi argment na k, czyli od którego obecnego indeksu ma być ten następny. Skoro local k,v zwraca pierwszy indeks czyli 1, to k,v po print zwraca nam 2, czyli next(tbl, 2) - Pętli tej mało kto używa, i mało kto ją niestety zna. Możemy takiej pętli użyć zamiast czegoś takiego


local tbl = {"a","b","c","d","e"}
local i 1

function getIndex()
 print(i,tbl[i])
   --1 dajmy przykład warunku z and or :D
      i <= #tbl and i + 1 or 1 -- jesli i + 1 jest mniejsze lub równe od ostatniego indeksu to dodajemy 1, jeśli nie to ustawiamy od nowa 1.
end

-- aby nasz kod poprawnie wyświetlił wszystkie rekordymusimy dać while w getIndex lub możemy dać wywołanie w pętli.
for 1,#tbl do
getIndex()
end
To jest przykład z pętlą.

Przykład z while


local tbl = {"a","b","c","d","e"}
local i 1

function getIndex()
 while <= #tbl do
 print(i,tbl[i])
     1
  end
end

getIndex()
Tutaj już nie musimy sprawdzać warunkiem, bo pętla while wykona się tyle razy aż i będzie mniejsze lub równe od największego indeksu (ostatniego indeksu 5). Możemy też zastosować tą pętlę w taki sposób


local tbl = {"a","b","c","d","e"}

for k,v in nexttbl do
print(k,v)
end


type
Funkcja type zwraca dosłownie "typ" zmiennej.


local x 10

print(type(x))
Z racji iż x to liczba to wyprintuje nam "number".


local x "10"

print(type(x))
A tutaj "string".


local x true

print(type(x))
Tu "boolean"


local x nil

print(type(x))
Tutaj "nil". Możemy to wykorzystywać do warunków, np


addCommandHandler(plr,cmd,number)
  --if tonumber(numberthen możemy też tak.
      if type(number) == "number" then
         print(number)
     end
end)


interpolateBetween
Funkcja ta jest już funkcją typowo z mta.

Więcej informacji znajdziesz w Wikipedii MTA:

interpolateBetween

Funkcja ta wykonuje podane przez nas animacje. Może to być animowana zmiana koloru,alphy,pozycji,rozmiarów.

Nie będę rozpisywał tutaj składni, gdyż jest na wiki wszystko opisane.

Najważniejszymi argumentami i wymaganymi jest x1,y1,z1,x2,y2,z2,progress i easing.

x1,y1,z1 Jest pozycją od której podana animacja ma się dziać. Pozycją w kontekście argumentów, dosłownie są to wartości określające wartość początkową animacji.
x2,y2,z2 To wartości określające końcową wartość animacji.
progress To wartość określająca długość trwania animacji. Standardowo jest to różnica pomiędzy
Więcej informacji znajdziesz w Wikipedii MTA:

getTickCount
.
easing Jest to rodzaj/typ animacji, spis typów można znaleźć tutaj

To nie jest tak, że musimy przekazać wartości do wszystkich 6 argumentów, czyli x,y,z,x2,y2,z1. Jeśli chcemy zmienić np kolor to wypełniamy dwie wartości z tych sześciu i pokolei. Czyli x1 będzie początkowym kolorem, a x2 będzie końcowym R.
Jeśli chcemy zmieniać całość czyli R,G,B to podajemy x1,y1,z1 jako początkowe R,G,B i x2,y2,z2 jako końcowe R,G,B.


local r,g,255,0,0
local marker createMarker(0,0,2,"cylinder",1.4,r,g,b,255)
local start getTickCount()
addEventHandler("onClientRender",root,function()
  local progress = (getTickCount() - start) / 1000
  local r,g,interpolateBetween(255,0,0,0,0,255,progress,"Linear")
  setMarkerColor(marker,r,g,b,255)
end)
No, i jak widać kolor zmieni się z czerwonego na niebieski płynnie. Jeśli chcemy zmienić powiedzmy rozmiar czegoś płynnie, powiedzmy szerokość. To operujemy dwoma wartościami x1,x2


local start getTickCount()
addEventHandler("onClientRender",root,function()
   local progress = (getTickCount() - start) / 1000
   local width,_,interpolateBetween(10,0,0,50,0,0,progress,"Linear")
   dxDrawRectangle(0,0,width,60,tocolor(255,255,255,255),false)
end)
Operujemy na x1 i x2. Możemy na y1,y2, z1,z2 ale po co, lepiej robić sobie po kolei. Czym jest podłoga? (_) - Otóż podłoga daje nam trochę więcej pamięci. Nie musimy deklarować zmiennych, które są nam nie potrzebne. Równie dobrze, nie musimy ich podawać, możemy po prostu zrobić np width = interpolateBetween. Nie będę więcej się tu rozpisywał, bo jest poradnik na ten temat bardzo dobry tutaj.

sinusoida
Sinusoida, jest to sama matematyka, więc bez matematyki dużo nie zdziałamy.

Wzór na sinusoidę w mta wygląda następująco:
sin(w) * a

Gdzie
Kod:


y - zwykła zmienna.
sin - sinus, w lua jest to math.sin.
w - pulsacja, określa jak szybko ma się powtórzyć nasze zjawisko.
a - amplituda, liczba nie ujemna określająca wielkość przebiegu funkcji okresowej, w tym przypadku sinus. Jest to po prostu największe wychylenie z położenia równowagi w ruchu drgającym.
Konkretnie by to zrozumieć trzeba przeczytać następujące linki:
https://pl.wikipedia.org/wiki/Amplituda
https://pl.wikipedia.org/wiki/Pulsacja
https://pl.wikipedia.org/wiki/Fala_sinusoidalna

Przykładem sinusoidy może być zmiana pozycji, zmiana alphy, zmiana koloru. Identycznie jak w przypadku interpolacji.


addEventHandler("onClientRender",root,function()
 local al math.sin(getTickCount() / 300) * 120
 dxDrawRectangle(0,0,40,40,tocolor(255,255,255,al),false)
end)
Da nam to efekt "migającej" alphy. getTickCount() / 300 da nam efekt pulsacji, a 120 to amplituda przykładowa.

Możemy również sinusoidy użyć w interpolacji. Podając ją jako progress.


addEventHandler("onClientRender",root,function()
 local progress math.sin(getTickCount()) * 300
 local x,interpolateBetween(0,0,0,50,50,0,progress,"Linear")
 dxDrawRectangle(x,y,30,tocolor(255,255,255,255),false)
end)
Taki kod będzie nam dosłownie ciągle zmieniać pozycję z 0 do 50. Gdy nasza pozycja dojdzie do 50, to wróci do 0 i na odwrót. Da to taki efekt "odbijania", jakbyśmy odbijali piłkę od ściany - wraca ona do nas po rzucie.

To tyle z dzisiejszego poradnika.

Przydatne linki

Lua demo online (do testowania różnych funkcji LUA, nie obsługuje funkcji mta.): https://www.lua.org/cgi-bin/demo


Podpis
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 2018-02-26, 07:54, w całości zmieniany 2 razy  
Postaw piwo autorowi tego posta
 

 
Więcej szczegółów
Wystawiono 4 piw(a):
ProBaton, Kuks*, SOURCE12, Szydlo
Wysłany: 2018-02-26, 05:58


Kuks*

Dziad zdziadziały






Wiek: 8
Na forum: 551 dni
Posty: 226
Nick w MP: Kuks*

Piwa: 1358

Respekt: 85,8


Dzięki, przydał się, czekałem na niego długu ;D
pzdr

Podpis
Tak
Postaw piwo autorowi tego posta
 

 
Wysłany: 2018-02-26, 06:04


SOURCE12

Uczeń PAWN






Wiek: 17
Na forum: 783 dni
Posty: 31
Nick w MP: Dubstep

Piwa: 26

Respekt: 60


Ostrzeżeń: 20%
Coś takiego powinni też do pawno robić. Takie lekcje jak tu... Daje ci browca za prowadzenie takich lekcji :) tylko szkoda że to nie do pawn :c

Postaw piwo autorowi tego posta
 

 
Wysłany: 2018-03-01, 22:19


boszboszek

HEY






Wiek: 18
Na forum: 1027 dni
Posty: 160
Nick w MP: boszboszek

Piwa: 1726

Respekt: 141
Respekt: 141


No. I to jest porządny poradnik. Ładnie wytłumaczone, nawet oporni powinni to zrozumieć!

Postaw piwo autorowi tego posta
 

 
Wysłany: 2019-04-14, 11:37


hinox







Wiek: 16
Na forum: 130 dni
Posty: 1
Nick w MP: Hinox



Respekt: 50


No i to jest porządny poradnik!

Postaw piwo autorowi tego posta
 

 
Tagi: lua :: kurs :: lekcja :: nr.
Anonymous





Na forum: 245 dni
Posty: 1



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
Dodaj temat do Ulubionych
Wersja do druku

Skocz do: