Am parcurs un drum lung în ghidul acestui începător pentru programarea orientată-obiect, discutând principiile coeziune, cuplare, încapsulare, și abstracție. În acest articol final, vom discuta principiul OOP de moştenire și utilizările sale în dezvoltarea jocurilor.
Notă: Deși acest tutorial este scris folosind Java, ar trebui să puteți folosi aceleași tehnici și concepte în aproape orice mediu de dezvoltare a jocului.
Moștenirea este principiul ierarhiei de clasă. Este capacitatea unui obiect de a prelua stările, comportamentele și funcționalitatea unui alt obiect.
Un exemplu real al mostenirii este moștenirea genetică. Cu toții primim gene de la ambii părinți care apoi definesc cine suntem. Împărtășim calitățile ambilor părinți, dar, în același timp, suntem diferiți de ei.
Obiectele din POR pot face același lucru. Clasele parentale pot avea clase de copii (cunoscute și sub denumirea de superclase și subclase) care pot avea aceleași proprietăți ale clasei părinte și pot defini noi stări, comportamente și funcționalități proprii.
Ca exemplu, luați în considerare următoarea clasă care ar putea fi folosită ca clasă părinte pentru diferite forme:
clasa publică Shape protejat int height; lățimea protejată int; Forma publica (int h, int w) inaltime = h; lățime = w; zonă public int () înălțime retur * lățime; public int getHeight () înălțimea de retur; public int getWidth () retur latime; public void setHeight (int h) înălțimea de retur; void public setWidth (int w) întoarcere lățime;
Pentru a extinde această clasă pentru a implementa un triunghi, ar arăta astfel:
triunghiul public triunghi extinde Forma public Triangle (int h, int w) super (h, w); public area int () return super.area () / 2;
Triunghi
are toate aceleasi stari si functii ca Formă
, dar redefinește zonă()
funcția de a returna zona corespunzătoare a Triunghi
(jumătate de înălțime de bază).
Cuvântul cheie super
este folosit pentru a face referire la superclama și oricare dintre stările și funcțiile sale. De aceea putem folosi super()
pentru a apela constructorul superclasei și super.area ()
pentru a apela zonă()
funcția superclasei. Deci, în acest caz, super.area ()
se intoarce Înălțime lățime
.
protejat
cuvântul cheie este ultimul modificator al nivelului de acces. Se comportă ca un modificator de nivel privat de acces, dar permite, de asemenea, oricărei subclase să aibă acces la variabila sau funcția.
După cum puteți vedea, moștenirea poate ajuta foarte mult la reducerea redundanței de cod între obiecte similare, luând în comun acele obiecte și plasându-le într-un singur loc. Acest lucru creează, de asemenea, un cod mai sustenabil, deoarece ajută la respectarea principiului DRY și la prevenirea efectului de ripple în modificările de cod.
Dacă toate acestea par familiare, probabil că abstractizarea a avut beneficii foarte asemănătoare (precum și majoritatea celorlalte principii ale OOP). Abstracția este strâns legată de moștenire, deoarece o clasă abstractizată poate fi folosită ca superclasă pentru a crea subclase. Singura diferență dintre o clasă abstractă și o clasă normală este aceea că o clasă abstractă nu poate fi utilizată pentru a crea un obiect.
Să ne întoarcem încă o dată la cele trei jocuri pentru a descrie cum să aplicăm moștenirea.
Reamintim că am definit o clasă abstractă pentru mutarea obiectelor pe un ecran. Reamintim, de asemenea, că am definit a Navă
pentru obiectul navei. Pentru a aplica moștenire Asteroizilor, putem avea Navă
clasa extinde Mobil
clasa după cum urmează:
/ ** * Clasa navei * / navă de clasă publică extinde funcția Movable / ** * Funcția de a roti nava * / void rotate public () // Cod care transformă nava / ** * Funcție de foc * / public void fire () // Cod de foc
Codul necesar pentru mutarea navei este îngrijit în Mobil
clasa abstractă, astfel încât să o putem elimina din Navă
clasă. Toate celelalte obiecte pentru Asteroizi ar putea moșteni de la Mobil
clasa, ceea ce face extrem de ușor să schimbați modul de mutare a unui obiect.
Un lucru de observat despre moștenire este capacitatea de a avea mai multe moșteniri sau capacitatea unei clase de a moșteni din mai multe clase în același timp. Unele limbi o permit, altele nu.
Java este una dintre limbile care nu permite moștenire multiplă. Prin urmare, nu ați putut avea obiectul Ship să moștenească din ambele deplasabil
clasa și a drawable
clasă.
Moștenirea poate fi aplicată la Tetris prin faptul că are Tetrimino și toate vizualele jocului moștenesc de la drawable
clasa, pe care am definit-o în ultimul articol.
Reamintim că pentru Pac-Man am identificat obiectele: Pac-Man, o fantomă și un pac-punct. De-a lungul acestei serii am discutat doar aceste trei obiecte și ne-am oprit să menționăm ceva despre ultima piesă critică a lui Pac-Man: peleta electrică. Cu moștenire, suntem acum gata să vorbim despre asta.
O peletă de putere este un pac-punct special care îi permite lui Pac-Man să mănânce fantome. Stările și comportamentele sale sunt exact aceleași ca un pac-dot, cu singura diferență fiind dimensiunea și capacitatea de a clipi (amintiți-vă că pentru a menține jocul cuplat slab, vrem ca o altă clasă să fie monitorizată când se consumă o peletă electrică și activă changeState ()
metoda fantomelor). Aceasta este momentul în care moștenirea vine la îndemână.
Întrucât un pac-punct și o peletă de putere sunt practic același obiect, putem crea o PowerPellet
clasa care extinde PacDot
clasă. PowerPellet
clasa ar trebui doar să modifice câteva state pentru a le face mai mari și să adauge comportamentul creșterii și micșorării pentru a crea un efect intermitent. Și asta este - acum avem o peletă electrică cu puțină muncă suplimentară. Nu e prea ciudat.
Codul cum ar arata acest lucru ar putea fi urmatorul:
/ ** * Clasa Pac-dot * / clasa publică PacDot extinde mărimea int protejată protejată; prag intrat protejat; public PacDot () size = 10; scor = 10; / ** * Returnează valoarea pac-punct pentru a adăuga la scorul jucătorului atunci când a mâncat * / public int getScore () return score; / ** * Returnează dimensiunea pac-dotului * / public int getSize () return size; / ** * Clasa Power Pellet * / clasa publică PowerPellet extinde PacDot private int sizeModifier; // nu trebuie să definiți mărimea și scorul deoarece acestea sunt deja definite în PacDot - PowerPellet le moștenește. public PowerPellet () size = 20; scor = 50; sizeModifier = -2; / ** * Funcția de clipire care ar fi apelată de fiecare dată când este extrasă pelletul de putere *. Modifică dimensiuneaModificatorului pentru a simula un efect intermitent * / public void blink () size + = sizeModifier; dacă (dimensiunea < 10 || size > 20) sizeModifier = -size Modificator;Merită să menționăm că, pentru a vă ajuta să urmăriți toate clasele noastre și moștenirea claselor pentru Pac-Man, ați putea folosi o diagramă de clasă pentru a vedea vizual cum totul este legat.
Moștenirea este foarte utilă pentru crearea unui cod mai sustenabil, deoarece ne permite să creăm obiecte similare fără a duplica codul dintre ele. De asemenea, ajută la crearea unui cod organizat prin afișarea ierarhiei de clasă.
Si asta e! Acum am terminat seria OOP aici pe Gamedevtuts +. Sper că v-ați bucurat de aceste articole și că acestea v-au ajutat să înțelegeți mai bine modul în care principiile OOP pot fi aplicate dezvoltării jocurilor. Asigurați-vă că urmați-ne pe Twitter, Facebook sau Google+ pentru a fi la curent cu ultimele postări.