GalaxyTrip joc interactiv pentru Android [308155]
GalaxyTrip – joc interactiv pentru Android
Lucrare de licență
Absolvent: [anonimizat] :
Ș.l. Dr. Ing. Raul Robu
Introducere
Un smartphone este un telefon mobil cu tastatură ”qwerty”, [anonimizat], [anonimizat], ce permite instalarea unor aplicații complexe și personalizarea extensivă a interfeței grafice.
Smartphone-[anonimizat] o mare platformă de comunicare și acces la o gamă largă de aplicații și jocuri.
[anonimizat], [anonimizat], [anonimizat]. Sistemul de operare Android a [anonimizat].
Platforma software și sistemul de operare Android este bazat pe nucleul Linux și este dezvoltat de Google.
[anonimizat] o multitudine de opțiuni. Totodată, Android este apreciat pentru libertatea pe care o [anonimizat]-ul Google (magazinul cu aplicații pentru sistemul de operare Android), [anonimizat].
[anonimizat] a [anonimizat], [anonimizat]. [anonimizat]-[anonimizat].
[anonimizat], sau chiar portarea jocurilor de tip arcade. [anonimizat] (1978), joc care a ținut sălile de jocuri pline până prin anii 1990.
GalaxyTrip este un joc care a pornit de la ideea de ”lupte în spațiu între navete”, [anonimizat], grafică si obiective.
Contextul actual
Acum este momentul oportun pentru dezvoltatorii de aplicații mobile. [anonimizat]-urile fiind alegerea cea mai des întâlnită pentru consumatori. Smartphone-[anonimizat], [anonimizat] o platformă ispititoare pe care să se creeze aplicații moblie inovatoare.
Figură -[anonimizat] a [anonimizat].
[anonimizat]. Folosindu-se de caracteristicile unice ale platformei Android ([anonimizat]), dezvoltatorii pot îmbunătății produsele existente sau pot implementa produse noi.
[anonimizat]. [anonimizat] a [anonimizat] a distra clienții.
Un joc video este un joc electronic care interacționează cu o interfață pentru a genera răspuns vizual pe un ecran. Jocurile video in general au un sistem de recompensare a utilizatorului, de obicei se ține scorul, acest sistem depinzând de indeplinirea anumitor obiective in joc.
Jocurile au fost întotdeauna ușor de clasificat după genul lor, din cauza constrângerilor tehnice a diferitelor platforme, cum ar fi cele legate de spațiul alocat. Deși multe jocuri sunt o combinație de mai multe genuri, există foarte puține care nu se încadrează in tiparele obișnuite, care atunci când au succes de obicei definesc un nou gen. Un joc care lansează un nou gen poate să nu fie primul de acel tip ci poate fi primul care are îndeajuns de mult succes comercial pentru ca alte companii să încerce sa reproducă acel succes.
Un joc de tip arcade este un dispozitiv folosit pentru divertisment care functionează cu monede, de obicei instalat în locuri publice. Epoca de aur a jocurilor evideo arcade a durat de la sfârșitul anilor 1970 până la mijlocul anilor 1990.
Unul din cele mai cunoscute jocuri video arcade este jocul Space Invaders, care odată cu evoluția tehnologiei, a fost portat pentru diferite platforme. Pentru consumatori, unul din cele mai întâlnite sisteme de operare fiind Android, portarea jocurilor vechi pentru această platforma este realizată pentru a aduce sentimentul de joc vechi, dar cu grafica și mecanismul de nivelul tehnologiilor actuale.
Baze Teoretice
Sistemul de operare Android
Android este o platformă open source proiectat pentru dispozitive mobile. Platforma a fost creată de Google și care este deținută de Open Handset Alliance. Scopul alianței este de a accelera inovarea și de a oferi consumatorilor o mai bogată, mai puțin costisitoare, si experiență mobilă mai bună. Platforma este cu adevărat deschisă si separă hardware-ul de software-ul care rulează pe ea. Asta permite unui număr mult mai mare de dispozitive să ruleze aceeași aplcație si crează un ecosistem mai bogat pentru dezvoltatori și consumatori.
Android permite dezvoltatorilor să scrie aplicații utilizând cod gestionat în limbajul Java, controlând dispozitivul prin intermediul bibliotecilor Java dezvoltate de Google. Aplicațiile pot fi scrise și in alte limbaje, precum C, și pot fi compilate în cod mașină ARM și executate, dar acest lucru nu este sprijinit în mod oficial de către Google.
Caracteristici
Sistemul de operare Android conține multe caracteristici utilizate în realizarea aplicațiilor, cum ar fi:
Sistem de operare open source: Android este o platformă open source, fiind licențiat sub Apache Linux, ceea ce ne permite să îl utilizam pentru scopuri diverse. Dezvoltatorii au acces la întregul cod sursă al platformei. De asemenea, aplicațiile dezvoltate pot fi publicate sub licență gratuită.
Portabilitatea aplicațiilor: Android permite rularea aplicațiilor pe o gamă largă de sisteme hardware, dar ținta principală o reprezintă platforma mobilă. Aplicațiile scrise în limbajul Java pot fi compilate în cod mașină Dalvik și executate de mașina virtuală Dalvik. În data de 12 Noiembrie 2014, Android a înlocuit mașina virtuală Dalvik cu o mașină proprie dezvoltată pentru acest sistem de operare numită Android Runtime. Spre deosebire de mașina virtuala Dalvik, care folosește tehnica de compilare JIT(just-in-time), Android Runtime folosește tehnica de compilare AOT(ahead-of-time).
Compilarea AOT(ahead-of-time) presupune compilarea codului din limbaje de programare de nivel înalt în cod mașină. La rulare, aplicația folosește doar codul mașină rezultat din compilare.
Compilarea prin interpretare presupune executarea unui cod de programare sau de script fără a compila mai întâi codul din limbaj de programare sau script în cod mașină.
Compilarea JIT(just-in-time) este o tehnică de compilare ce folosește atât tehnica de compilare AOT(ahead-of-time) cât și tehnica de compilare prin interpretare, preluând avantajele cât si dezavantajele celor două tehnici. Astfel, limbajele de nivel înalt (Java, .NET/C#) sunt interpretate din limbaj de programare în cod intermediar, iar codul intermediar este compilat în cod mașină. Avanajele compilării JIT(just-in-time) sunt:
Spațiul de stocare al codului sursă este redus.
Cantitatea de memorie utilizată pentru codul executabil este redusă.
Dar odată cu aceste avanataje, această tehnică a preluat și dezavantaje semnificative:
Timpul de execuție este prelungit deoarece codul utilizat este interpretat, compilat iar apoi executat doar în momentul accesării.
Presupune o putere de calcul mai mare decât în cazul tehnicii de compilare AOT(ahead-of-time).
Versiuni
Application Programming Interface(API) reprezintă o interfata pentru programarea de aplicatii, care stabilește în amănunt modul în care programele de aplicație pot accesa serviciile sistemului de operare sub care rulează.
Fiecare versiune a sistemului de operare Android are un nivel API, de care trebuie ținut cont în dezvoltarea aplicațiilor. Dacă o aplicație este proiectată pentru un nivel API corespunzător unei versiuni recente, aplicația nu va putea funcționa pe dispozitivele ce rulează versiuni anterioare, iar dacă o aplicație este proiectată pentru un nivel API corespunzător unei versiuni anterioare, aceasta va putea rula pe dispozitivele ce au versiuni superioare ale sistemului de operare.
Figură -Versiuni ale sistemului de operare Android
Nivelul API este un număr întreg pozitiv si are rolul de identificator unic al versiunii librăriilor API ce sunt oferite de o anumită versiune a unui sistem de operare Android.
Android pune la dispoziția dezvoltatorilor o multime de librării API ce pot fi folosite de către aplicții pentru a comunica cu sistemul de operare.
Librăriile API sunt alcatuite din:
Un nucleu de clase și pachete.
Un set de elemente și atribute XML ce compun un fișier manifest.
Un set de elemente și atribute XML ce compun un fișier ce specifică resursele sistemului ce pot fi accesate.
Un set de inteții pe care le poate avea o aplicație.
Platforma de dezvoltare pentru Android
ADT(Android Developer Tools) este o platformă de dezvoltare gratuită si este recomandată de Google pentru dezvoltarea aplicațiilor pentru Android.
Android SKD
Kitul de dezvoltare software Android(SDK) include un set complet de instrumente de dezvoltare. SDK include un program de depanare, biblioteci, emulator, documentație, mostre de cod și tutoriale.
Android Studio
Android Studio este mediul de dezvoltare integrat (Integrated Development Environment – IDE) oficial pentru dezvoltarea de aplicații Android. Oferă multe caracteristici care sporesc productivitatea pentru crearea de aplicații Android, cum ar fi:
Un sistem constructiv flexibil Gradle.
Un emulator rapid și bogat în caracteristici.
Un mediu unificat unde se poate dezvolta pentru toate dispozitivele Android.
Executare instantanee pentru a face modicări asupra aplicației, fără a construi un nou APK(Android application-package).
Coduri template și integrare GitHub pentru a ajuta la construirea caracteristicilor comune pentru aplicații și exemple de cod de import.
Instrumente extinse de testare si cadre.
Instrumente LINT pentru performanță, ușurință în utilizare, compatibilitate de versiune, și alte probleme.
Suport C++ și NDK(Native Development Kit).
Suport încorporat pentru Google Cloud Platform, facându-l ușor pentru a integra Google Cloud Messaging și App Engine.
Figură -Fereastra principală a Android Studio
Elementele ferestrei principale în Android Studio sunt:
Bara de instrumente(toolbar) permite să se efectueze o gamă de acțiuni, inclusiv rularea aplicației și lansarea instrumentelor Android.
Bara de navigare ajută la navigarea prin proiect și editarea fișierelor deschise. Aceasta oferă o vizualizare mai compactă a structurii vizibile în fereastra de unelte a proiectului.
Fereastra de editare este unde este creat și editat codul.
Fereastra de instrumente oferă acces la sarcini specifice, cum ar fi managementul de proiect, de căutare, de control al versiunii , și multe altele.
Bara de stare afișează starea proiectului și IDE, precum și orice avertismente sau mesaje.
Fiecare proiect în Android Studio conține unul sau mai multe module cu fișiere cod sursă si fișiere resursă.
Toate fișierele construite sunt vizibile la nivelul superior în cadrul Script Gradle și fiecare modul aplicației conține urmatoarele foldere:
Manifest: Conține fișierul AndroidManifest.xml.
Java: Conține cod sursă Java, inclusiv codul test JUnit.
Res: Conține toate resursele de bază non-cod, cum ar fi machetele XML, șiruri de caractere UI, și imagini.
Figură -Fișierele proiectului în Android
Aplicații Android
Aplicațiile Android sunt scrise în limbajul de progaramare Java și există mai multe componente de bază care sunt folosite pentru construirea unei aplicații:
Activitate(Activity)
Intenție(Intent)
Serviciu(Service)
Furnizor de conținut(Content Provider)
Fișier manifest
Activitate(Activity)
O activitate reprezintă o interfață cu utilizatorul, fereastră sau formular. O aplicație Android poate avea una sau mai multe activități, fiecare activitate având propriul său ciclu de viață, independent de ciclul de viață al procesului asociat aplicației.
Într-o aplicație Android , activitățile sunt gestionate prin pricipiul LIFO(Last In First Out). La începerea unei noi activități, aceasta este plasată în partea de sus a stivei și devine activitate de rulare, activitatea anterioară ramâne întotdeauna sub activitatea de rulare.
O activitate are patru stări:
Dacă o activitate este în prim-planul ecranului(în partea de sus a stivei), este activă sau ruleaza.
Dacă o activitate nu mai este în prim-plan, dar este înca vizibilă(o nouă activitate transparentă este în prim-plan), este pusă în așteptare. Activitatea pusă în așteptare este activă, dar poate fi distrusă de către sistem în cazul în care memoria este foarte scăzută.
Dacă o activitate este complet acoperită de o altă activitate, aceasta este oprită. Activitatea își pastrează informațiile și nu mai este vizibilă de către utilizator, și poate fi distrusă dacă este nevoie de memorie în altă parte.
Dacă o activitate este pusă în așteptare sau oprită, sistemul poate renunța la activitate din memorie, apelând comanda finish() sau prin uciderea procesului ei. Atunci când este din nou afișată pe ecran, trebuie restartată și readusă la starea anterioară.
Figură -Stările unei Activități
Intenție(Intent)
O inteție, sau un obiect de tip Intent, reprezintă o entitate folosită pentru a descrie o operațiune ce urmează să fie executată. Conține informații despre operațiile pe care ar trebuie să le facă o anumită componentă. Datorită obiectelor de tip Intent, este posibilă comunicarea cu diverse componente aflate fie în interiorul aceleiași aplicații, fie cu componente localizate în alte aplicații.
Există două tipuri principale de intenții:
Intenții explicite.
Intenții implicite.
Intențiile explicite au specificate o componentă(setComponent(ComponentName) sau setClass(Context, Class)), care furnizează exact clasa care urmează să fie rulată. Adesea, intențiile nu vor conține alet informații, fiind o modalitate pentru o aplicație să lanseze diverse activități interne pe care le are utilizatorul în interacțiunea cu aplicația.
Intețiile implicite nu au specificate nici o componentă, dar acestea trebuie să includa informații suficiente pentru ca sistemul să poată determina care din componentele disponibile vor rula cel mai bine pentru acea inteție.
Fișierul manifest
Fiecare proiect Android are un fișier de tip xml denumit AndroidManifest.xml, stocat în directorul rădăcină al proiectului.Fișierul manifest prezintă informațiile esențiale despre aplicație pentru sistemul Android, informații pe care sistemul trebuie să le aibe înainte de a rula orice cod al aplicației. Printre altele, manifestul face urmatoarele:
Numește pachetele Java pentru aplicație. Numele pachetului servește ca un indentificator unic pentru aplicație.
Descrie componentele aplicației. Numește clasele care implementează fiecare componentă si publică capacitățile lor. Aceste declarații permit sistemului Android să știe care sunt componentele și care sunt condițiile în care pot fi lansate.
Determină care proces va găzdui componentele aplicației.
Declară permisiunile pe care aplicațiile să le posede pentru a accesa părțile protejate API și să interacționeze cu alte aplicații.
Declară permisiunile pe care alții să le posede pentru a interacționa cu componentele aplicației.
Declară nivelul minim API pe care aplicația o necesită.
Enumeră bibliotecile la care aplicația trebuie conectată.
Limbajul de programare Java
Java este un limbaj de programare orientat-obiect. În comparație cu alte limbaje de programare, Java se apropie foarte mult de C. Cu toate acestea, chiar dacă folosește în cea mai mare parte sintaxa limbajului C, totuși este un limbaj diferit. Niciodată un compilator Java nu va reuși să compileze programe scrise în C și mai mult decît atât, un program scris în C va trebui să sufere schimbări majore pentru a deveni un program Java.
Unul din obiectivele echipei de proiectanți ai limbajului Java a fost posibilitatea de a scrie cât mai ușor un cod fără greșeli. Conform declarațiilor lui Bill Joy, programele scrise în C prezintă, în medie, un bug la 55 linii de cod. Cel mai important aspect care vine în întâmpinarea programatorilor, astfel încât aceștia să facă cât mai puține greșeli, este simplitatea limbajului.
Respectând sintaxa limbajului C++, Java a eliminat o mare parte dintre caracterisiticile care complicau prea mult limbajul și s-au dovedit mai puțin folositoare. Supraîncărcarea operatorilor, de exemplu, a fost eliminată din Java deoarece era o facilitate generatoare de mari erori.
Aproape jumătate dintre erorile unei aplicații apar din cauza proastei gestionări a memoriei. În acest sens, limbajul Java oferă managementul automat al memoriei. Odată alocat spațiul necesr unui obiect programatorul nu mai trebuie să-și facă probleme privind eliberarea spațiului respectiv deoarece colectorul de gunoaie al mașinii virtuale Java execută acest lucru automat.
Java a fost proiectat să fie portabil nu doar sub formă de cod sursă dar și sub formă de cod binar, compilat. Deoarece acest ideal este imposibil de atins ținând cont de arhitecturile procesoarelor, compilatoarele Java generează cod pentru o mașină abstractă cunoscută sub denumirea de mașina virtuală Java. Codul binar rezultat în urma compilării este denumit byte code.
Un program Java nu se execută niciodată în mod nativ pe mașina gazdă. În schimb, programul nativ special, denumit interpretorul Java sau mașina virtuală Java, citește byte code-urile și execută instrucțiunile mașină native corespondente. Byte code-urile sunt aceleași pe orice platformă, singurul lucru care diferă de la o platformă la alta fiind interpretorul.
În al doilea rând, Java este un limbaj independent de platformă deoarece s-au eliminat orice construcții dependente de arhitectura hard. Mai clar spus, o variabilă de tip întreg va ocupa întotdeauna patru octeți, indiferent dacă este vorba despre un procesor Pentium, SPARC sau un procesor PowerMac.
Adobe Illustartor
Adobe Illustrator este un editor grafic vectorial creat și distribuit de Adobe Systems. Cu Adobe Illustrator se pot realiza obiecte grafice vectoriale complicate, are facilitați pentru a produce animații, conținut web, obiecte 3D, materiale pentru un tipar.
Adobe Photoshop
Adobe Photoshop este un software folosit pentru editarea imaginilor digitale pe calculator, program produs și distribuit de compania americană Adobe Systems. Adobe Photoshop este un program cu o interfață intuitivă și care permite o multitudine extraordinară de modificări necesare în mod curent profesioniștilor și nu numai: editări de luminozitate și contrast, culoare, focalizare, aplicare de efecte pe imagine sau pe zone (selecții), retușare de imagini degradate, număr arbitrar de canale de culoare, suport de canale de culoare pe 8, 16 sau 32 biți, efecte third-party etc.
BFXR
BFXR este o elaborare a gloriosului FXRS, programul de alegere pentru mulți oameni care doresc să facă efecte sonore pentru jocuri.
Metodologie de dezvoltare
Aplicația „GalaxyTrip” este împărțită în următoarele module:
LoadingScreen;
MainMenuScreen;
PopUp;
MainActivity.
Modulul LoadingScreen este primul modul ce se încarcă la pornirea aplicației. După pornirea aplicației se face trecerea la modulul MainMenuScreen.
Modului MainMenuScreen conține elemente vizuale care la interacțiune vor declanșa diverse metode ale modului curent:
Părăsirea jocului.
Resetarea jocului.
Pornirea modulului PopUp.
Modulul PopUp este modulul care permite utilizatorului să pornescă jocul în funcție de nivelul actual prezentând totodată și nivelul actual de parcurgere a jocului, utilizând nivelul curent.
Modulul MainActivity este modulul care elementele vizuale ale jocului (de exemplu: naveta jucătorului, navetele inamice, elemente de decor etc).
Figură -Diagrama UML pentru arhitectura aplicației
Implementare
Figură -Diagrama UML a proiectului
LoadingScreen
Modulul LoadingScreen este reprezentat de clasa de tip Activitate numită LoadingScreen. Această clasă este setată, în fișierul AndroidManifest, ca fiind prima activitate cu care pornește jocul „GalaxyTrip”.
Obiectul de aspect loading_screen.xml este setat ca afișaj pentru această activitate astfel:
Acestă activitate face trecerea la clasa de tip Activitate MainMenuScreen prin următoarea secvență:
Variabila splashInterval generează o întârziere de 2000 milisecunde, fiind inițializată astfel:
MainMenuScreen
Modulul MainMenuScreen este reprezentat de clasa de tip Activitate numită MainMenuScreen. Obiectul de aspect menu.xml este setat ca afișaj pentru această activitate astfel:
Această clasă conține trei butoane cu diferite funcționalități:
Butonul EXIT: la apăsare se închide jocul.
Butonul RESET: la apăsare, informațiile salvate (nivelul actual) vor fi șterse, ceea ce va avea ca rezultat, reînceperea jocului de la primul nivel.
Butonul PLAY: la apăsare, va porni modulul PopUp.
La pornirea acestei activități este crea un fir de execuție, iar la pornirea unei alte activități, firul de execuție trece într-o stare de așteptare.
PopUp
Modulul PopUp este reprezentat de clasa de tip Activitate numită PopUp. Obiectul de aspect pop.xml este setat ca afișaj pentru această activitate astfel:
Această activitate este dimensionată proporțional cu activitatea principală, MainMenuScreen, astfel:
Din această activitate se poate începe jocul, apăsând pe unul din butoanele care reprezintă nivelul actual al jocului.
Această activitate face trecerea la clasa MainActivity unde se află jocul propriu-zis.
MainActivity
Modulul MainActivity este reprezentat de clasa de tip Activitate, numită MainActivity. În această clasă este creat obiectul jocului, care primește ca parametrii contextul , dimensiunile ecranului dispozitivului, și nivelul jocului. Această clasă are setat ca afișaj un obiect de tipul SurfaceView, acesta fiind obiectul jocului.
Această clasă are două metode, una pentru a pornii firul de execuție al jocului,apelând funcția resume() din clasa GTView, iar una pentru a oprii firul de execuție, apelând funcția pause() din clasa GTView.
Clasa GTView
Clasa GTView este o clasă care extinde subclasa SurfaceView și implementează interfața Runnable, ambele clase fiind incluse în pachetul de dezvoltare Android SDK.
SurfaceView este o subclasă a clasei View, care permite redarea conținutul direct pe ecran.
Interfața Runnable este implementată de orice clasă care intenționează să ruleze un fir de execuție.
La instanțierea unui obiect de tip GTView se generează obiecte care conțin informații despre jucător, inamici, și elemente de decor. Acestea conțin valori standard la începutul jocului.
Clasa GTView conține șapte metode principale, care la rândul lor apeleaza alte metode secundare.
Figură -Diagrama UML a clasei GTView
În constructor, sunt inițializate obiecte de tip Background, PlayerShip, Enemy, Bullet, Boss, DefenseBrick, Asteroid, Reaper și Extra, dar și efectele audio folosite pe parcursul jocului.
Metoda run() este o metodă supraîncărcată specifică interfeței Runnable. În această metodă este realizată partea de logică si partea vizuală a jocului.
Metoda update() realizează partea logică a jocului. Aici se realizează apariția și deplasarea obiectelor pe ecran, este verificată coliziunea între obiecte, și actualizează în timp real mecanisme specifice jocului (de exemplu: incrementarea scorului în funcție de inamicii distruși, incrementarea sau decrementarea vieților disponibile etc).
Exemple din interiorul metodei update():
Metoda draw() este metoda care se ocupă de partea vizuală a jocului. Această clasă fiind specifică subclasei SurfaceView, are nevoie să verifice dacă zona destinată părții vizuale este validă.
După ce este blocată zona destinată părții vizuale, sunt desenate elementele vizuale folosite în acel moment.
După finalizarea desenării elementelor dorite, acestea vor fi afișate pe ecran.
În clasa resume() este inițializat și apoi pornit firul de execuție al jocului.
Metoda pause() este folosită pentru a opri rularea firului de execuție al jocului.
Metoda onTouchEvent(MotionEvent motionEvent) este specifică subclasei SurfaceView și este folosită pentru a detecta atingerea ecranului.
În această metodă este împărțit ecanul în opt secțiuni. Pe ultima secțiune a ecranului este poziționată naveta jucătorului, iar dacă este atins ecranul pe oricare din cele șapte secțiuni rămase, naveta va apela funcția de shoot(), care îi permite jucătorului să tragă, adică să trimită proiectile către inamici.
Clasa Backgroud
În clasa Background se crează fundalul jocului și animația sa. În afară de constructorul său, unde sunt inițializate dimensiunile, imaginea și viteaza animației, această clasă conține o metodă draw() și o metodă update().
Metoda draw() este apelată în metoda draw() din clasa GTView pentru a desena fundalul ecranului.
Metoda update() este apelată în metoda update() din clasa GTView pentru a face animația fundalului.
Clasa PlayerShip
Clasa PlayerShip este o clasă care implementează interfața SensorEventListener. Această clasă este specifică navetei jucătorului.
Această clasă folosește senzorul numit accelerometru, inclus în dispozitivul folosit, pentru a deplasa naveta pe ecran în funcție de înclinarea dispozitivului.
Figură -Accelerometru
În constructor sunt inițializate dimensiunile navetei, poziția unde va apărea pe ecran, viteza cu care se va deplasa, dar și senzorul de tip accelerometru.
Fiind o clasă ce implementează interfața SensorEventListener, are două metode implicite supraîncărcate:
onAcuracyChanged: este folosită cand acuratețea senzorului înregistrat se schimbă.
onSensorChanged: este folosită atunci când există un nou eveniment de tip senzor.
Naveta jucătorului deplasându-se doar în stânga sau în dreapta, în metoda onSensorChanged este inițializată doar valoarea senzorului doar pe o singură axă, și anume, axa X.
Valoarea senzorului este folosită în metoda de update() care este apelată de metoda update() din clasa GTView pentru a deplasa navet jucătorului în funcție de valoarea pe care o are senzorul.
Pe lângă methoda de update(), mai avem și o metoda de draw(), apelată în metoda draw() a clase GTView, pentru as desena naveta jucătorului.
Această funcție conține și o variabilă de tip RectF(Rectangle) folosită la detectarea coliziunii cu alte obiecte (asteroizi, proiectile inamice). Această variabilă este inițializată în constructor.
Naveta este un obiect care își schimbă permanent poziția pe ecran, iar pentru a putea face coliziunea cu alte obiecte, aflate și ele în mișcare, trebuie să actualizăm mereu coordonatele navetei cu ajutorul variabilei de tip RectF.
Clasa Enemy
Clasa Enemy este clasa generatoare de inamici. Această clasă inițializează în constructorul său dimensiunea inamicilor, poziția pe ecran unde vor apărea, variabila de tip RectF, și viteza cu care se vor deplasa inamicii pe ecarn.
Această clasă deține o metodă de update() care este apelată de metoda update() din clasa GTView, unde este realizată deplasarea inamicilor pe ecran, dar si actualizate coordonatele inamicilor pentru a se putea face coliziunea.
În metoda draw() este realizată desenarea inamicilor pe ecran, la apelul metodei curente de către metoda draw() din clasa GTView.
Clasa enemy deține doua metode specifice, una pentru a decide felul în care se vor deplasa inamicii pe ecran, și una pentru a putea inamicii să lanseze proiectile.
Metoda leftToRight() este folosită pentru a face deplasarea inamicilor sa fie stânga-dreapta. Aceasta verifică dacă inamicii ajung la limita stângă sau dreaptă a ecranului, moment în care schimbă deplasarea inamicilor pentru a nu părăsi limitele spațiului de desenare.
Cealaltă metodă specifică acestei clase, este metoda de tip boolean, numită takeAim, care decide dacă inamicul va lansa proiectie sau nu. Această clasă verifică poziția navetei jucătorului și decide cu ajutorul unui număr generat aleator dacă va lansa proiectil exact la coordonatele navetei jucătorului.
Clasa Boss
Clasa Boss este asemanătoare clasei Enemy, ambele clase fiind generatoare de inamici pentru jucător.
În costructor sunt inițializate dimensiunile, poziția unde va apărea pe ecarn, variabila de tip RectF, și viteza cu care se va deplasa pe ecran.
Metoda update() a acestei clase va fi apelata de metoda update din clasa GTView, pentru a realiza deplasarea obiectului, dar și actualizează coordonatele obiectului pentru a se putea face coliziune.
Metoda draw() este apelată de metoda draw() din clasa GTView pentru a realiza desenarea obiectelor de tip Boss pe ecran.
Metoda leftToRight() este folosită pentru ca obiectul să nu depașească limitele spațiului de desenare, iar metoda takeAim este folosită pentru a decide lansarea proiectilelor. Această metodă diferă de cea din clasa Enemy prin faptul că este realizată sa decidă mai des lansarea proiectilelor.
Clasa Bullet
Clasa Bullet este clasa generatoare de proiectile atât pentru jucător cât și pentru inamici și inamicul final.
Constructorul acestei clase inițializează dimensiunile, poziția, și variabila de tip RectF, dar și viteza cu care se deplasează obiectul de tip Bullet.
Această clasă generează doua tipuri de proiectile pentru jucător, si câte un tip pentru fiecare inamic, inclusiv inamicii finali.
Metoda update() este apelată în metoda update() din clasa GTView pentru a realiza deplasarea pe ecran a obiectelor de tip Bullet. Este realizată și actualizarea coordonatelor obiectului prin intermediul variabilei de tip RectF, pentru a realiza coliziunea cu celelalte obiecte.
Metoda draw() este apelată de metoda draw() din clasa GTView pentru a realiza desenarea obiectelor de tip Bullet pe ecran.
Această clasă are și metode specifice tipului Bullet, cum ar fi de verificare daca obiectul de tip Bullet a depășit limitele zonei de desenare, sau de decidere pentru lansarea obiectelor.
Metoda getImpactPointY() este apelată de metoda update() din clasa GTView pentru a verifica dacă obiectele de tip Bullet au depășit limitele zonei de desenare.
Metoda shoot() este o metodă de tip boolean care returnează adevărat(true) sau fals(false) în cazurile în care obiectele de tip Bullet au fost lansate sau nu.
Clasa Asteroid
Clasa Asteroid generează asteroizii pentru primele stagii ale fiecărui nivel al jocului.
Constructorul inițializează dimensiunile, viteza de deplasare pe ecran, și poziția de unde va porni deplasarea, dar și variabila de tip RectF.
Obiectele de tip Asteroid sunt create ca un număr finit pentru fiecare nivel (de exemplu: primul nivel trei obiecte de tip asteroid), dar după ce a părăsit ecranul sau a fost distrus în urma coliziunii cu proiectilul jucatorului, acest obiect va fi repoziționat pe axa Y cu o poziție aleatoare pe axa X.
Metodele setX() și setY() sunt folosite pentru a repoziționa obiectul de tip sau după ce a făcută coliziunea cu alte obiecte. Aceste metode sunt apelate în metoda update() a clasei GTView.
Metoda draw() este apelată în metoda draw() din clasa GTView pentru a desena obiectele de tip Asteroid pe ecran.
Metoda update() este apelată în metoda update() din clasa GTView pentru a realiza deplasarea obiectelor de tip Asteroid pe ecran. În această metodă se realizează și actualizarea coordonatelor obiectului pentru a se putea realiza coliziunea cu alte obiecte, dar se realizează si repoziționarea în cazul în care se depașesc limitele ecranului.
Clasa DefenseBrick
Clasa DefenseBrick generează obstacolole imobile care protejează liderul inamic.
Generând obiecte imobile, aceastei clase îi lipsește metoda de update(), care în general este specifică obiectelor mobile.
Metoda draw() este apelată in metoda draw() din clasa GTView pentru a desena obiectele pe ecran.
În constructorul acestei clase sunt setate pozițiile obiectelor pe ecran, dimensiunea lor, și variabila de tip RecF, căreia îi sunt setate la inițializare coordonatele obiectelor. Obiectele sunt aranjate sub forma unei matirici.
Clasa Reaper
Clasa Reaper generează obiecte inamici care sunt independente de celelalte obiecte de tip inamic.
Obiectul de tip Reaper apare aleator într-unul din stagiile jocului, acesta având scopul de a lovi naveta jucătorului și de a bloca proiectilele jucătorului pentru a proteja inamicii. Totuși este o șansă ca jucătorul să evite să fie lovit de obiectul de tip Reaper, și acela este de a-l lovi cu un proiectil special care este disponibil doar când apare obiectul de tip Reaper.
Apariția aleatoare a obiectului de tip Reaper și inițializarea lui se face astfel:
În constructor sunt inițializate dimensiunile obiectului, poziția de unde va porni deplasarea, viteza cu care se va deplasa obiectul, dar și variabila de tip RectF.
Metoda update() este apelată în metoda update() din clasa GTView pentru a realiza deplasarea obiectului de tip Reaper pe ecran. În această metodă sunt actualizate și coordonatele obiectului pentru a se putea realiza coliziunea între obiect și proiectilul specia sau naveta jucătorului.
Metoda draw() este apelată în metoda draw() din clasa GTView pentru a desena obiectul pe ecran.
Această clasă are o metodă specifică, care stabilește modul de deplasare al obiectului. Este verificat dacă obiectul depășește limitele stânga și dreapta ale ecranului, când ajunge la una din limite schimbând direcția de deplasare (de exemplu:ajunge la limita stîngă, obiectul va începe să se deplaseze spre dreapta). Pe langă mișcare stânga-dreapta, acest obiect va avansa treptat către naveta jucătorului pentru a face coliziune cu ea.
Clasa Extra
Clasa Extra este clasa generatoare de bonusuri pe care jucătorul le poate colecta pe parcursul jocului.
Această clasă poate genera două tipuri de bonusuri:
ExtraLife: mărește viața jucătorului.
ExtraBullet: acest bonus activează proiectilul special, pentru a putea distruge obiectul de tip Reaper.
Constructorul inițializează dimensiunea obiectului, poziția de unde va începe deplasarea, viteza cu care se va deplasa obiectul, dar și variabila de tip RectF. Poziția de unde va începe deplasarea este aleatoare pe axa X, axa Y rămânând neschimbată.
Metoda draw() este apleată în metoda draw() din clasa GTView pentru a desena obiectele de tip Extra.
Metoda update() este apelată în metoda update() din clasa GTView pentru a realiza deplasarea obiectelor de tip Extra, dar și actualizează coordonatele obiectului pentru a se putea realiza coliziunea cu naveta jucătorului.
Utilizarea și testarea aplicației
Utilizare
În acasta secțiune voi explica cum se utilizează aplicația dezvoltată. Pentru acest exemplu de utilizare voi folosi smartphone-ul Samsung Galaxy S3(GT-I9300), care are sistemul de operare Android, versiune 4.3(Jelly Bean).
Pentru a utiliza aplicația vom parcurge următorii pași:
Acesta este ecranul de încarcare, și utlizatorul va aștepta ca aplicția să își încarce și celelalte module.
Figură -Ecranul de încarcare al aplicației
Acesta este meniul aplicației, unde utilizatorul va putea apăsa unul din cele trei butoane.La apăsarea butonului EXIT, aplicația se va închide.Figură 5-2
La apăsarea butonului ÎNAPOI al dispozitivului va apărea următorul dialog, la apăsarea butonului YES, aplicația se va închide, iar la apăsarea butonului NO, se va închide dialogul.Figură 5-2.1
Figură -Meniul Aplicției Figură 5-2.1 Afișare dialog de ieșire
La apăsarea butonului RESET va apărea un dialog, la apăsarea butonului YES,se vor reseta nivelurile jocului, setând nivelul actual ca fiind 1, la apăsarea butonului NO, se va închide dialogul.Figură 5-3
Figură – Afișare dialog resetare
La apăsarea butonului PLAY, va apărea o fereastră unde este prezentat nivelul curent. La apăsarea în exterioul ferestrei dedicată nivelelor, aceasta se va închide.
Figură -Apăsarea butonului PLAY Figură 5-4.1 Fereastra dedicată nivelelor
La apăsarea butonului PLUTO(primul nivel), va începe jocul propriu-zis.Figură 5-5
Figură -Apăsarea butonului PLUTO Figură 5-5.1 Începerea jocului
La începerea jocului, naveta jucătorului este poziționată la jumatatea ecranului, în partea de jos.Figură 5-6.1
Jucătorul poate deplasa naveta în stânga sau în dreapta, înclinând smartphone-ul spre stânga sau spre dreapta.Figură 5-6
Figură – Deplasarea Navetei Figură 5-6.1 Lansarea proiectilelor
Pentru a putea lansa proiectile, jucătorul trebuie sa atingă ecranul, exceptând secțiunea orizontală pe care se deplasează naveta.Figură 5-6.1
Testare
Android Studio ne pune la dispoziție o mașină virtuală pentru a putea testa aplicațiile, dar datorită faptului că folosește semnificativ resurse și are dificultăți în rulare, testarea a fost realizată, în principal, pe smartphone-ul Samsung Galaxy S3(GT-I9300), care are ca sistem de operare Android, versiunea 4.3(Jelly Bean).
Pentru a verifica funcționalitatea jocului pe dispozitive cu rezoluția ecranului mai mare, testarea a fost realizată deasemenea și pe un smartphone Samsung Galaxy S5 Neo, care are ca sistem de operare Android, versiune 6.
Versiune sistemului de operare Android 4.3 folosește tehnica de compilare JIT(just-in-time), ceea ce s-a observat, deoarece timpul de rulare al aplicației este mai mare decât atunci când este folosită tehnica de compila AOT(ahead-of-time),prezentă pe sistemul de operare Android, versiunea 6.
Deși am testat aplicația pe cele două versiuni ale sistemului de operare Android menționate mai sus, funcționalitatea aplicației a fost conform așteptărilor, fiecare element grafic redimensionându-se în funcție de rezoluția despozitivului pe care a rulat.
Această aplicație a fost testată și pe alte dispozitive decât cele menționate, aceasta fiind trimisă și la persoane online.
La orice modificare a codului aplicației, aplicația a fost testată, pentru a verifica dacă modificările făcute s-au realizat cu succes.
Concluzii și direcții de continuare a dezvoltării
Am dezvolat un joc dedicat sistemului de operare Android, idee preluată de la jocul de tip arcade Space Invaders, în mediul de dezvoltare Android Studio, folosind limbajul de programare Java.
Jocul se numește GalaxyTrip, este structurat pe niveluri, a câte patru stagii fiecare. Are un sistem de salvare automată a nivelului actual, după completarea unui nivel, pentru ca jucătorii sa poată continua jocul de la nivelul de unde au rămas. Jucătorul are două tipuri de proiectile: unul normal, care are o limită de cinci, folosit în lupta cu inamicii, iar unul special pentru distrugerea unui inamic numit Reaper, care apare aleator în stagii, scopul lui fiind de a proteja inamicii, prezenți în stagiul respectiv, de proiectilele normale ale jucătorului, și de a lovi naveta jucătorului pentru a-i lua mare parte din viață.
Pe viitor se urmărește publicare jocului în Android Store, dar pentru a face asta este nevoie de unele îmbunătățiri:
Proiectarea mai multor niveluri pentru joc.
Creșterea nivelului de dificultate.
Dezvoltarea unui sistem de îmbunătățire(upgrade) a navetei jucătorului.
Dezvoltarea unui sistem de lansare a mai multor tipuri de proiectile.
Figură 1-1Gradul de utilizare al sistemelor de operare [1] 5
Figură 2-1Versiuni ale sistemului de operare Android 9
Figură 2-2Fereastra principală a Android Studio [6] 11
Figură 2-3Fișierele proiectului în Android [7] 12
Figură 2-4Stările unei Activități [8] 14
Figură 3-1Diagrama UML pentru arhitectura aplicației 19
Figură 4-1Diagrama UML a clasei GTView 25
Figură 4-2Accelerometru [14] 29
Figură 5-1Ecranul de încarcare al aplicației 43
Figură 5-2Meniul Aplicției Figură 5-2.1 Afișare dialog de ieșire 44
Figură 5-3 Afișare dialog resetare 44
Figură 5-4Apăsarea butonului PLAY Figură 5-4.1 Fereastra dedicată nivelelor 45
Figură 5-5Apăsarea butonului PLUTO Figură 5-5.1 Începerea jocului 45
Figură 5-6 Deplasarea Navetei Figură 5-6.1 Lansarea proiectilelor 46
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: GalaxyTrip joc interactiv pentru Android [308155] (ID: 308155)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
