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: 24
Na forum: 4149 dni
Posty: 2268
Nick w MP: Marcineg

Piwa: 4662

Respekt: 1436,8
Respekt: 1436,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 liczbnp10a 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?wietliwszystkie rekordymusimy da? while w getIndex lub mo?emy dawywo?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 tetak.
      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
Moje prace: https://www.youtube.com/c...MuaWGHPp1mhlGnw

-- obecnie
-- obecnie
-- dawniej
-- dawniej
-- dawniej
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 5 piw(a):
ProBaton, Kuks*, SOURCE12, Szydlo, N0TH1NG
Wysłany: 2018-02-26, 05:58


Kuks*







Wiek: 15
Na forum: 3030 dni
Posty: 246
Nick w MP: Kuks*

Piwa: 2208

Respekt: 115,8
Respekt: 115,8

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

Postaw piwo autorowi tego posta
 

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


SOURCE12

Skrypter






Wiek: 24
Na forum: 3261 dni
Posty: 34
Nick w MP: NitroGame888

Piwa: 125

Respekt: 45,3

Ostrzeżeń: 60%
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

Podpis
××× Skrypter SAMP ×××
××× Kierowca ×××
|•| SAMP 0.3-DL SURVIVAL [PL] |•|
IP: 51.83.217.86:7757
Discord: https://discord.gg/574Vxu9BEC
Postaw piwo autorowi tego posta
 

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


boszboszek

HEY






Wiek: 14
Na forum: 3505 dni
Posty: 146
Nick w MP: boszboszek

Piwa: 2172

Respekt: 261
Respekt: 261Respekt: 261Respekt: 261

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: 22
Na forum: 2608 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:






Skocz do:  
Wyświetl posty z ostatnich:   
GTAONLINE.PL » JĘZYKI PROGRAMOWANIA » LUA » Poradniki do LUA Ten temat jest zablokowany bez możliwości zmiany postów lub pisania odpowiedzi

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