Wysłany: 2015-01-03, 16:57
Albert221
MLG NOSCOPER
Wiek: 25 Na forum: 4175 dni Posty: 50
Nick w MP: Albert221
Piwa : 14
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 ( 432 , 0 , 0 , 0 )
ustawNiezniszczalno ?? Pojazdu ( pojazd , prawda )
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 ( 432 , 0 , 0 , 0 )
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:
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 ( 432 , 0 , 0 , 0 )
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
Wysłany: 2015-01-03, 18:20
MeeShuffle
Programista/Grafik
Wiek: 32 Na forum: 4394 dni Posty: 2758
Nick w MP: Shuffle
Piwa : 8575
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.
Wysłany: 2015-01-03, 19:20
Albert221
MLG NOSCOPER
Wiek: 25 Na forum: 4175 dni Posty: 50
Nick w MP: Albert221
Piwa : 14
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
Wysłany: 2015-01-03, 20:12
MeeShuffle
Programista/Grafik
Wiek: 32 Na forum: 4394 dni Posty: 2758
Nick w MP: Shuffle
Piwa : 8575
Albert221 , tak zrozumia?e? dobrze, a ja zrozumia?em, ?e metoda OOP nie jest dla mnie, dzi?ki
Wysłany: 2015-01-03, 23:05
Terr9909
Skrypter LUA
Wiek: 26 Na forum: 4234 dni Posty: 346
Nick w MP: Split
Piwa : 1043
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? ;-)
Wysłany: 2015-01-03, 23:28
Wittx
8===D
Wiek: 26 Na forum: 4794 dni Posty: 121
Nick w MP: wittula
Piwa : 1905
"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.
Wysłany: 2015-01-04, 09:57
Albert221
MLG NOSCOPER
Wiek: 25 Na forum: 4175 dni Posty: 50
Nick w MP: Albert221
Piwa : 14
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
Wysłany: 2015-01-05, 19:44
Tey
Wiek: 31 Na forum: 4876 dni Posty: 155
Nick w MP: l0nger
Piwa : 280
Sk?d Ty to wytrzasn??e?? Nie ma takiej metody jak na razie. ;-)
localPlayer : outputChatBox ()
Wysłany: 2015-01-05, 21:29
Albert221
MLG NOSCOPER
Wiek: 25 Na forum: 4175 dni Posty: 50
Nick w MP: Albert221
Piwa : 14
m?j b??d
Podpis
i7 4790k @ 4.6GHz - Macho HR-02 - Crucial Ballistix 2x8GB 1600MHz - GTX 970 SLI
Tagi: programowanie :: obiektowe :: (oop) :: lua
Anonymous
Na forum: 245 dni
Posty: 1
Anonymous Koniecznie zajrzyj na: