Aproape am terminat cu această serie de programare orientată pe obiecte, iar în acest articol vom discuta principiul OOP de abstracție - adică generalizarea unui obiect - și utilizarea acestuia î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.
Abstracția este principiul generalizării. Acest lucru presupune trecerea de la o anumită instanță la un concept mai generalizat, prin gândirea la cea mai elementară informație și funcție a unui obiect.
Acest lucru poate părea un pic ciudat, dar deja suntem familiarizați cu conceptul de abstractizare. De exemplu, dacă spun cuvântul "mașină", de ce vă gândiți? Șansele sunt că nu ne gândim la aceeași mașină. Mă gândeam la un Mustang Boss negru 302, care este un exemplu specific al unei mașini. Nici unul dintre noi nu s-au înșelat din cauza cuvântului mașină este un concept foarte general al unui vehicul pe care îl folosim pentru transport (sau recreere în cazul meu).
Același lucru este valabil și pentru jocurile video. Jocurile video sunt clasificate în grupuri precum RTS, RPG, Racing etc. Aceste grupuri sunt concepte generalizate care descriu modul de joc al unui joc. StarCraft II, Elder Scrolls V: Skyrim și Need for Speed sunt toate exemple specifice ale acestor concepte generalizate.
Astfel, abstractizarea ia multe instanțe specifice de obiecte și extrage informațiile și funcțiile lor comune pentru a crea un singur concept generalizat care poate fi folosit pentru a descrie toate instanțele specifice ca unul.
Abstracția este utilă, deoarece scade totul până la principiile sale cele mai de bază. Acest lucru poate ajuta la încapsularea funcționalității unui obiect deoarece poate ajuta la identificarea informațiilor importante care ar trebui să fie făcute vizibile și informațiilor care nu pot fi ascunse.
Abstracția ajută și la principiul Nu repetați-vă. Luând ceea ce un grup de obiecte au în comun și abstractizându-l, putem ajuta la prevenirea codului redundant în fiecare obiect care la rândul său creează un cod mai sustenabil.
Ca și înainte, să folosim cele trei jocuri pentru a vedea câteva exemple concrete ale acestui principiu în acțiune.
Pentru a începe să aplicați abstractizarea către Asteroizi, gândiți-vă la obiectele sale. Reamintim că obiectele pentru asteroizi erau o navă, un asteroid, o farfurie zburătoare și un glonț. Acum gândiți-vă la ce au în comun fiecare dintre aceste obiecte. Împărtășesc aceleași stări, comportamente sau funcționalități? Prin luarea acestor elemente comune pe care toate obiectele le împărtășim, suntem capabili să abrogem aceste elemente într-o clasă mai generalizată.
De exemplu, o navă, un asteroid, o farfurie zburătoare și un glonț vor avea același comportament pentru a se deplasa pe ecran. Ați putea să abrogați acest comportament într-o clasă abstractă care deține calitățile comune necesare pentru a muta un obiect. Aceste calități ar fi state precum poziţie și viteză, și comportamentul lui in miscare.
Clasa abstractizată din Java ar putea arăta astfel:
/ ** * Clasa abstractă pentru mișcare * / clasă abstractă Movable float velocity public; viteza de flotare publică; pozitia plutitoare publicaX; poziția publică a flotorului; / ** * Funcție - efectuează comportamentul (sarcina) de mutare a navei * / move void publice () positionX + = velocityX; pozițiaY + = vitezaY;
Există și alte stări comune, comportamente și funcționalități pe care toate obiectele le împărtășesc. Te poți gândi la ele? Acestea pot fi adăugate într-o clasă abstractă.
Un lucru pe care doriți să vă faceți griji este crearea unei clase de blob. O clasă blob este orice clasă care încearcă să manipuleze totul dintr-un grup de obiecte, chiar dacă fiecare obiect nu împărtășește aceleași stări, comportamente și funcționalități. Doar pentru că o navă și o farfurie zburătoare pot trage nu înseamnă că trebuie să pui acel comportament în aceeași clasă abstractă care este folosită pentru a descrie toate cele patru obiecte.
Consultați tutorialul lui Iain Lobb despre compoziția entității pentru a vedea cum evită această situație.
După cum sa spus de mai multe ori înainte, Tetris are un singur obiect, un Tetrimino. Cu toate acestea, acest lucru nu împiedică Tetris să absoarbă o parte din funcționalitatea sa. Un Tetrimino este tras în aproape același mod ca și câmpul de joc și celelalte vizuale ale jocului. Aceasta înseamnă că ați putea abstracționa acest comportament de desen într-o singură clasă pe care aparțin toate lucrurile desenate pe ecran.
(Personal, îmi place să numesc o astfel de clasă drawable
, dar spiriduș
este, de asemenea, un nume utilizat în mod obișnuit.)
Pac-Man este un pic mai interesant din punctul de vedere al abstractizării. Pac-Man, o fantomă și un pac-dot nu împărtășesc cu adevărat stări, comportamente sau funcționalități comune. Ele pot fi atrase de ecran, în mod similar, astfel încât o clasă abstractă pentru manipularea desenului poate fi creată, dar nu mult mai mult decât atât. Deci ce faci? În acest caz, este bine să creați mai multe clase abstracte pentru a organiza codul.
Începeți cu clasa să se ocupe de desen pentru toate cele trei obiecte. Apoi, scoateți pac-dot din grup, deoarece acesta este obiectul care într-adevăr nu aparține celorlalți. Asta lasă pe Pac-Man și o fantomă. Acum gândiți-vă ce au în comun aceste două obiecte și creați o altă clasă abstractă pentru aceste obiecte. Această clasă ar putea cuprinde state precum direcţie și viteză, și comportamentul lui in miscare.
Cu două clase abstracte, reduceți codul redundant care ar fi fost necesar pentru a crea cele trei obiecte și mutați-l într-o singură locație care poate fi ușor schimbată și modificată.
Principiul abstracție ajută la reducerea codului redundant și la crearea unui cod mai sustenabil. Cu toate acestea, abstractizarea nu ne face nimic dacă nu facem nimic cu clasele abstracte. Pentru aceasta, trebuie să învățăm moştenire care vor fi discutate în articolul următor și final al acestei serii.
Urmăriți-ne pe Twitter, Facebook sau Google+ pentru a fi la curent cu cele mai recente postări.