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

Wysłany: 2015-01-03, 16:57


Albert221

MLG NOSCOPER






Wiek: 25
Na forum: 4175 dni
Posty: 50
Nick w MP: Albert221

Piwa: 14

Respekt: 34,3

Na pocz?tek prosz? moderator?w o podpi?cie, poniewa? jest to bardzo przydatne zagadnienie.

OOP (ang. Object-Oriented Programming) czyli programowanie obiektowe, co to? W tym poradniku postaram si? wyt?umaczy? jego implementacj? (u?ywanie) w Lua.

Do czego przyda mi si? znajomo?? OOP?
B?dziesz m?g? pisa? kod o wi?kszej jako?ci, bardziej zrozumia?y i przejrzysty. Jak co? b?dziesz chcia? zmodyfikowa? b?dzie Ci pro?ciej znale?? to, czego szukasz. Same plusy. Minusy? Tylko jeden - trzeba przeczyta? ten poradnik.

Wst?p
Najpierw ?eby?cie mogli lepiej zrozumie? na czym polega programowanie obiektowe pos?u?? si? przyk?adem z Lua wzi?tego (u?yj? polskich nazw funkcji, ?eby?cie wszystko mogli zrozumie?).

pojazd utw?rzPojazd(432000)
ustawNiezniszczalno??Pojazdu(pojazdprawda)
napiszNaCzacie(podajTypPojazdu(pojazd), graczLokalny)


Z polskimi nazwami wygl?da to dosy? komicznie, ale zignorujcie to. wida? ?e wiele nazw si? powtarza, tak jakby?my m?wili dla przyk?adu "mamo daj zwierz?ciu pies obiekt ko??". Takie mas?o ma?lane. Poni?ej ten sam przyk?ad napisany obiektowo.

pojazd Pojazd(432000)
pojazd:ustawNiezniszczalno??(prawda)
napiszNaCzacie(pojazd:podajTyp())


Na pierwszy rzut oka widzimy nowe konstrukcje z dwukropkiem, zignorujmy je na razie. wszystko jest minimalnie bardziej przejrzyste. Od razu na pocz?tku linii widzimy na jakim obiekcie b?dziemy pracowa?, czyli np. pojazd, dalej funkcja kt?r? na nim wywo?amy czyli ustawNiezniszczalno??(). Bardzo pomaga to przy poprawkach lub szukaniu b??du. Widzimy od razu czemu co? zmieniamy, wi?c przez pomy?k? nie pope?nimy b??du i nie ustawimy tego czemu innemu.

Tyle ze wst?pu, teraz konstrukcja!
Aby?my mogli korzysta? z dobrodziejstw OOP MUSIMY doda? do pliku Meta.xml linijk?:

Kod:

<oop>true</oop>


Na wiki, pod wi?kszo?ci? funkcji widnieje napis OOP Syntax, to on Tobie pomo?e. Napisz? teraz powy?szy kod w wersji w?a?ciwej z w?a?ciwymi nazwami metod (czyli funkcji na obiektach):

pojazd Vehicle(432000)
pojazd:setDamageProof(true)
outputChatBox(pojazd:getVehicleType())


Sp?jrzmy w dokumentacj? funkcji createVehicle(): https://wiki.multitheftauto.com/wiki/CreateVehicle
Pod "OOP Syntax" widnieje obja?nienie jaka jest do tego przeznaczona metoda. W tym przypadku Vehicle(...) jest to prawie to samo co createVehicle. Czym si? to r??ni? createVehicle po prostu zwraca nam obiekt typu vehicle, a Vehicle to konstruktor obiektu vehicle. Ju? t?umacz? o co chodzi. Co znaczy konstruktor? Konstruktor to funkcja kt?ra "konstruuje" (tworzy - create) obiekt. Podajemy do niej takie same parametry jak do funkcji createVehicle().

Lecimy dalej, tym razem setVehicleDamageProof(): https://wiki.multitheftauto.com/wiki/SetVehicleDamageProof
Pod "OOP Syntax" widniej? 3 rzeczy: Method (metoda), Variable (pole - zmienna, kt?ra jest w obiekcie) oraz Pair (to nas nie interesuje). W metodach (NIE KONSTRUKTORACH!) nie podajemy obiektu (w tym przypadku pojazd), poniewa? to na nim wykonujemy t? metod?. Przyjrzyjcie si?:

pojazd:setDamageProof(true)


Jak widzicie w argumencie metody (to co? mi?dzy nawiasami) nie podali?my pojazdu. Dlaczego? bo na poje?dzie w?a?nie operujemy. Dlaczego? Bo pojazd jest na samym pocz?tku i to do niego jest "po??czona" metoda setDamageProof(). Mam nadziej? ?e nad??acie i rozumiecie. Dla pewno?ci jeszcze jeden przyk?ad tym razem z graczem (strona serwera):

gracz:setHudComponentVisible('radar'false)


Powy?szy kod schowa radar (map? w lewym dolnym rogu) graczowi gracz. Jak widzicie nie poda?em parametru thePlayer. Dlaczego? Jak ju? m?wi?em - poniewa? poda?em j? na pocz?tku.

Dziedziczenie
Obiekty mog? z siebie dziedziczy?. Co to znaczy? Przyk?adowo obiekt gracz (Player) dziedziczy z obiektu Element. Dlaczego tak jest? Dlatego, poniewa? gracz zawiera wszystkie metody/funkcje/pola/etc kt?re posiada Element i bez sensu jeszcze raz je dodawa?. S? po prostu wsp?lne. Tak jak np. Lew dziedziczy ze Zwierz?cia, tak Player dziedziczy z Elementu. Kurde, za du?o tego! Wydaje Ci si?, to proste, wystarczy to zrozumie?. Skoro Player dziedziczy z Elementu, to znaczy ?e na Player'ze mo?emy wywo?a? metod? setData tak? Tak! Sp?jrzmy do wiki: https://wiki.multitheftauto.com/wiki/SetElementData
Mamy OOP Syntax w kt?rym nazw? metody (setData) poprzedza element! Dobra, rozumiem, ale sk?d mam wiedzie? co dziedziczy z czego? Dobre pytanie, odpowied? jest banalna: z wiki! Zr?b to sam: wpisz na wiki Vehicle i sp?jrz co widzisz w tytule? Element/Vehicle! Czyli obiekt Vehicle dziedziczy z Elementu (Vehicle dziedziczy te? z Ped, czemu w wiki tego nie ma - nie mam poj?cia)!



Po tej d?ugiej lekturze powinni?cie wiedzie? jak zacz?? z pisaniem w Lua obiektowo, niestety nie wszystkie funkcje s? dost?pne obiektowo, nad czym ubolewam, ale ?ledz?c devblog MTA widz?, ?e powoli wszystko dodaj?.

Je?eli macie jakie? pytania, co? jest nie jasne, piszcie!

Rozpowszechnia? m?j poradnik mo?ecie tylko pod warunkiem do podlinkowania do TEGO tematu i podania mojej nazwy (Albert221) jako autora.

Ostatnio zmieniony przez Iggy 2016-01-15, 18:11, w całości zmieniany 2 razy  
Postaw piwo autorowi tego posta
 

 
Wysłany: 2015-01-03, 18:20


MeeShuffle

Programista/Grafik






Wiek: 32
Na forum: 4394 dni
Posty: 2758
Nick w MP: Shuffle

Piwa: 8575

Respekt: 535,3
Respekt: 535,3

Poradnik jest dosy? czytelny, lecz po paru latach bazowania w LUA na normalnej metodzie, wydaje mi si? to trudne. Skoro ELEMENT to odno?nik do player, vehicle itp, to jak mam w kodzie okre?li? dla kogo ma wykonywa? si? funkcja. Niekt?re funkcje wymagaj? podzielenia gracza i pojazdu.

Podpis

https://shufflecode.pl
Static Codes and Graphics - Join our discord!
Postaw piwo autorowi tego posta
 

 
Wysłany: 2015-01-03, 19:20


Albert221

MLG NOSCOPER






Wiek: 25
Na forum: 4175 dni
Posty: 50
Nick w MP: Albert221

Piwa: 14

Respekt: 34,3

Rozumiem o co Ci chodzi, jak jest funkcja dla elementu, to jak mamy ustali? komu dok?adniej ma dzia?a? - tak ja to zrozumia?em, mam nadziej? ?e dobrze. Ot?? nie martwimy si? tym, po prostu metod? kt?ra jest przeznaczona dla Elementu wywo?ujemy na Playerze, Vehicle'u czy czym chcesz (musi to dziedziczy? z Elementu). I taki ma?y-wielki szczeg??, na obiekcie wywo?ujemy metody, nie funkcje :)

Przyk?ad:

pojazd localPlayer:getOccupiedVehicle()
pojazd:getPosition() -- metoda przeznaczona dla Elementu


Podpis
i7 4790k @ 4.6GHz - Macho HR-02 - Crucial Ballistix 2x8GB 1600MHz - GTX 970 SLI
Postaw piwo autorowi tego posta
 

 
Wysłany: 2015-01-03, 20:12


MeeShuffle

Programista/Grafik






Wiek: 32
Na forum: 4394 dni
Posty: 2758
Nick w MP: Shuffle

Piwa: 8575

Respekt: 535,3
Respekt: 535,3

Albert221, tak zrozumia?e? dobrze, a ja zrozumia?em, ?e metoda OOP nie jest dla mnie, dzi?ki :D

Podpis

https://shufflecode.pl
Static Codes and Graphics - Join our discord!
Postaw piwo autorowi tego posta
 

 
Wysłany: 2015-01-03, 23:05


Terr9909

Skrypter LUA






Wiek: 26
Na forum: 4234 dni
Posty: 346
Nick w MP: Split

Piwa: 1043

Respekt: 182,8
Respekt: 182,8Respekt: 182,8

Bardzo ?adny poradnik, te? m?wi? to samo co kolega up, lepiej zosta? przy domy?lnych programowaniu LUA, ale browarek si? nale?y, mo?e za kilka miesi?cy spr?buje u?ywa? ;-)

Postaw piwo autorowi tego posta
 

 
Wysłany: 2015-01-03, 23:28


Wittx

8===D






Wiek: 26
Na forum: 4794 dni
Posty: 121
Nick w MP: wittula

Piwa: 1905

Respekt: 120
Respekt: 120

"Split" napisał/a:

lepiej zosta? przy domy?lnych programowaniu LUA

Dlaczego? Nie zawsze warto i?? na ?atwizn?. ;) Dzi?ki OOP kod jest kr?tszy i czytelniejszy.

Postaw piwo autorowi tego posta
 

 
Wysłany: 2015-01-04, 09:57


Albert221

MLG NOSCOPER






Wiek: 25
Na forum: 4175 dni
Posty: 50
Nick w MP: Albert221

Piwa: 14

Respekt: 34,3

Po?wiczy? mo?na na boku, a uwierzcie mi, warto :)

Podpis
i7 4790k @ 4.6GHz - Macho HR-02 - Crucial Ballistix 2x8GB 1600MHz - GTX 970 SLI
Postaw piwo autorowi tego posta
 

 
Wysłany: 2015-01-05, 19:44


Tey







Wiek: 31
Na forum: 4876 dni
Posty: 155
Nick w MP: l0nger

Piwa: 280

Respekt: 193
Respekt: 193Respekt: 193

Sk?d Ty to wytrzasn??e?? Nie ma takiej metody jak na razie. ;-)

localPlayer:outputChatBox()


Postaw piwo autorowi tego posta
 

 
Wysłany: 2015-01-05, 21:29


Albert221

MLG NOSCOPER






Wiek: 25
Na forum: 4175 dni
Posty: 50
Nick w MP: Albert221

Piwa: 14

Respekt: 34,3

m?j b??d :)

Podpis
i7 4790k @ 4.6GHz - Macho HR-02 - Crucial Ballistix 2x8GB 1600MHz - GTX 970 SLI
Postaw piwo autorowi tego posta
 

 
Tagi: programowanie :: obiektowe :: (oop) :: lua
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 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