FUNDAȚIA PENTRU CULTURĂ ȘI ÎNVĂȚĂMÂNT IOAN SLAVICI [630115]
FUNDAȚIA PENTRU CULTURĂ ȘI ÎNVĂȚĂMÂNT “IOAN SLAVICI”
TIMIȘOARA
UNIVERSITATEA “IOAN SLAVICI” TIMIȘOARA
FACULTATEA DE INGINERIE
DOMENIUL CALCULATOARE ȘI TEHNOLOGIA INFORMAȚIEI
FORMA DE ÎNVĂȚĂMÂNT – ZI
PROIECT DE DIPLOM Ă
CONDUCĂTOR ȘTIINȚIFIC
Prof. Dr. Ing. Mircea Vladuțiu
ABSOLVENT: [anonimizat] 2017 –
FUNDAȚIA PENTRU CULTURĂ ȘI ÎNVĂȚĂMÂNT “IOAN SLAVICI”
TIMIȘOARA
UNIVERSITATEA “IOAN SLAVICI” TIMIȘOARA
FACULTATEA DE INGINERIE
DOMENIUL CALCULATOA RE ȘI TEHNOLOGIA INFORMAȚIEI
FORMA DE ÎNVĂȚĂMÂNT – ZI
CONCEPEREA JOCULUI
“WAR ZONE ”
CONDUCĂTOR ȘTIINȚIFIC
Prof. Dr. Ing. Mircea Vladu țiu
ABSOLVENT: [anonimizat]
2017
Introducere ………………………….. ………………………….. ………………………….. ………………………….. ……….. 1
Capitolul I Componente de structura ………………………….. ………………………….. ………………………….. …. 2
1.1 Modulul Unreal Engine 4 ………………………….. ………………………….. ………………………….. ……………………. 2
1.2 Modulul Vis ual Studio ………………………….. ………………………….. ………………………….. ……………………….. 3
1.3 Noțiuni de limbaj C++ utilizate la dezvoltarea aplicației ………………………….. ………………………….. ……… 3
Capitolul II Specificațiile aplicației ………………………….. ………………………….. ………………………….. ……. 5
2.1 Documentul de dezvoltarea a jocului ………………………….. ………………………….. ………………………….. …… 5
2.2 Ciclul iterativ ………………………….. ………………………….. ………………………….. ………………………….. ………… 7
Capitolul III Documentația tehnică a aplicației ………………………….. ………………………….. ……………….. 9
3.1 Creerea mediului înconjurător ………………………….. ………………………….. ………………………….. ……………… 9
3.2 Clasele C++ ………………………….. ………………………….. ………………………….. ………………………….. ………… 13
3.2.1 Dependența claselor ………………………….. ………………………….. ………………………….. …………………… 14
3.2.2 Clasa Tank ………………………….. ………………………….. ………………………….. ………………………….. ……. 15
3.2.3 Clasa TankAiming ………………………….. ………………………….. ………………………….. ……………………… 16
3.2.4 Clasa TankPlayerController ………………………….. ………………………….. ………………………….. ………… 19
3.2.5 Clasa TankAiController ………………………….. ………………………….. ………………………….. ………………. 21
3.2.6 Clasa TankBarrel ………………………….. ………………………….. ………………………….. ……………………….. 21
4.2.7 Clasa TankTurret ………………………….. ………………………….. ………………………….. ……………………….. 22
3.2.8 Clasa Projectile ………………………….. ………………………….. ………………………….. ………………………….. 22
3.2.9 Clasa TankTr acks ………………………….. ………………………….. ………………………….. ………………………. 24
3.2.10 Clasa TankMovementComponent ………………………….. ………………………….. ………………………….. . 25
3.3 Blueprints ………………………….. ………………………….. ………………………….. ………………………….. …………… 27
3.3.1 Interfețe Blueprint cu elemente de limbaj C++ ………………………….. ………………………….. …………… 27
3.3.2 Tank Blueprint ………………………….. ………………………….. ………………………….. ………………………….. . 29
3.3.3 TankPlayerController Blueprint ………………………….. ………………………….. ………………………….. …… 33
3.3.4 TankAiController Blueprint ………………………….. ………………………….. ………………………….. ………… 34
3.3.5 Projectile Blueprint ………………………….. ………………………….. ………………………….. …………………….. 34
3.4 Interfața v izuală a utilizatorului ………………………….. ………………………….. ………………………….. ………….. 35
3.4.1 Interfața meniului principal ………………………….. ………………………….. ………………………….. …………. 35
3.4.2 Interfața Selectări de nivel ………………………….. ………………………….. ………………………….. …………… 39
3.4.3 Interfața jucătorului ………………………….. ………………………….. ………………………….. ……………………. 40
3.4.4 Meniul intermediar ………………………….. ………………………….. ………………………….. …………………….. 41
Capitolul IV Ghidul utilizatorului ………………………….. ………………………….. ………………………….. ……. 42
4.1 Rularea jocului ………………………….. ………………………….. ………………………….. ………………………….. ……. 42
4.2 Meniu principal ………………………….. ………………………….. ………………………….. ………………………….. …… 42
4.3 Selectarea niv elului ………………………….. ………………………….. ………………………….. ………………………….. 42
4.4 Niveluri de joc ………………………….. ………………………….. ………………………….. ………………………….. …….. 42
4.5 Meniu intermediar ………………………….. ………………………….. ………………………….. ………………………….. .. 43
Capitolul V Concluzii ………………………….. ………………………….. ………………………….. …………………….. 44
5.1 Concluzii ………………………….. ………………………….. ………………………….. ………………………….. ……………. 44
5.2 Evaluări de la utilizatori ………………………….. ………………………….. ………………………….. ……………………. 44
5.3 Potențiale dezvoltări ulterioare ………………………….. ………………………….. ………………………….. …………… 45
Bibliografie ………………………….. ………………………….. ………………………….. ………………………….. ……… 46
UNIVERSITATEA DIN ORADEA
FACULTATEA de Inginerie Electrică și Tehnologia Inf ormației
DEPARTAMENTUL Calculatoare și tehnologia informației
TEMA _________________
Proiectul de Finalizare a studiilor a studentului Alin Alexandru Cîrstea
1). Tema proiectului de finalizare a studiilor : Conceperea jocului „ WarZone ”
2). Termenul pent ru predarea proiectului de diplomă 31. Mai. 2017
3). Elemente inițiale pentru elaborarea proiect ului de finalizare a studiilor: programarea
funcționalității jocului în limbajul de programare C++, Blueprint Scripting și design de nivel cu
modulul Unreal Eng ine 4.
4). Conținutul proiectului de finalizare a studiilor: Succint, capitolul introductiv cu precizarea
domeniului căruia îi aparține lucrarea și strictura lucrării; elemente de descriere de teorie acoperind
tematica conceperea jocului pe calculator ; partea aplicativă referitoare la funcționalitatea joculuiș
concluzii rezumative; lista surselor consultate.
5). Material grafic : după caz, scheme bloc și de detaliu pentru părțile proiectate, ordinograme,
reprezentări grafice corespunzătoare rezultatelor.
6). Locul de documentare pentru elaborarea proiectului de diplomă: Manuale pentru programare
C++ și Unreal Engine, documentația oferită de Unreal Engine.
7). Data emiterii temei : 20. Oct. 2016
Coordonatori științifici
Prof. Dr. Ing. Mircea Vladuțiu
UNIVERSITATEA DIN OR ADEA
FACULTATEA DE INGINERIE ELECTRICĂ
ȘI TEHNOLOGIA INFORMAȚIEI
Adresa Oradea, Cod 41 0087, Bihor, Romania, Strada Universității, nr. 1 ,
Tel/Fax :+40 259/408412, Tel:+40 259/408104; +40 259/408204
REFERAT
PRIVIND PROIECTUL DE DIPLOMĂ
A
ABSOLVENTULUI / ABSOLVENTEI : Alin Alexandru Cîrstea
DOMENIUL Calculatoare și tehnologia informației
SPECIALIZAREA Tehnologia informației
PROMOȚIA 2017
1. Titlul proiectului: Conceperea jocului „ WarZone ”
2. Structura proiectului
Introducere
Capitolul I Componente de structura
Capitolul II Specificațiile aplicației
Capitolul III Documentația tehnică a aplicației
Capitolul IV Ghidul utilizatorului
Cpitolul V Concluzii
Bibliografie
3. Aprecieri asupra conținutului proiectului de DIPLOMĂ ( finalizare a studiilor ), mod
de abordare, complexitate, actualitate, deficiențe
Lucrarea se carac terizează printr -o construcție echilibrată cu o bună pondere între dezvoltarea
unor noțiuni teoretice și descrierea aplicației. Lucrarea este corect divizată pe capitole și paragrafe
între care există o bună coerență. Lucrarea conține o parte aplicativă co nsistentă implicând soluții atât
hardware cât și software. Capitolele cuprind o descriere detaliată a modulelor software implica te.
4. Aprecieri asupra proiectului (se va menționa: număr ul titlurilor bibliografice
consultate, frecvența notelor de subsol, calitatea și diversitatea surselor consultate;
modul în care absolventul a prelucrat informațiile din surse teoretice)
Sunt utilizate referințe bibliografice de marcă din domeniu, totuși investigația din literatura
de specialitate este limitată. Sursele bibliogr afice sunt alese în mod corespunzător. Considerăm
tematica dată spre rezolvare ca fiind soluționată.
(se va menționa: opțional locul de documentare și modul în care absolventul a realizat
cercetarea menționându -se contribuția autorului)
Materialul grafic este executat îngrijit fiind complementar părții redactate. Redactarea lucrării
este realizată în manieră concisă cu unele scăderi de claritate ale detaliilor.
5. Concluzii (coordonatorul proiectului trebuie să aprecieze valoarea proiectului
întocmit, relevanța studiului întreprins, competențele absolventului, rigurozitatea pe
parcursul el aborării proiectului, consecvența și seriozitatea de care a dat dovadă
absolventul pe parcurs)
În baza celor mai sus menționate, apreciez că lucrarea elaborată de absolventul Alin
Alexandru Cîrstea este valoroasă, absolventul dovedind competențe în domeniul jocurilor.
6. Redactarea proiectului respectă …………………………………………………. cerințele
academice de redactare (părți, capitole, subcapitole, note de subsol și bibliografie).
7. Consider că proiectul îndeplinește/ nu îndeplinește condițiile pentru susținere în
sesiunea de Examen de LICENȚĂ ( finalizare a studiilor ) din IULIE 2017 și propun
acordarea notei ………………
Oradea,
Data Coordonator științific
Prof. Dr. Ing. Mircea Vladuțiu
1
Introducere
În prezenta lucrare prezint conceperea jocului ”WarZone”.
”WarZone” este un joc video înfățișând în timp real mediul vehiculelor de luptă, jocul este
calificat drept single player versus inteligență artificială sau player versus player , cu elemente de
strategie și împușcături. S copul lui este relaxare și distractie între prieteni sau o singu ra persoana
contra ta ncurilor controlate de inteligență artificial ă și are ca obiectiv intrarea pe piața dezvoltatorilor
independenți de jocuri în aproximativ un an de zile.
Dezvoltarea independentă a jocurilor video este procesul pentru creerea de jocu ri indie.
Acestea sunt jocuri video create în mod obișnuit de echipe individuale sau mici de dezvoltatori și,
deobicei, fară suport financiar semnificativ al unei surse externe sau al unui editor de jocuri. Aceste
jocuri pot dura ani să fie construite de l a bază sau pot fi finalizate in câteva zile, în funcție de
complexitate, participanți ș i obiectivul de proiectare.
Alegerea acestei teme pentru proiectul de diplomă vine după mulți ani de pasiune pentru
calculatoare , jocurile fiind cele care pot atinge o gamă largă de oameni, indiferent de vârstă, sex sau
dacă se joacă o oră la cateva zile pentru relaxare , ori sunt pasionați care se joaca 30+ ore pe
saptămană. În decursul facultății am avut ocazia de a aprofunda sau aduce cunoștințe noi despre
limbajele de programare cu materii ca Limbaje de programare, Programarea orientată pe obiecte.
Învățarea despre structura din spate a lucrurilor precum Rețele, Tehnici internet, Baze de date sau
Arhitectura sistemelor de calcul.
În capitolele următoare se vor preze nta etapele de proiectare , de la documentația de proiectrare
a jocului la ciclul iterativ de creere a actorilor, obiectelor sau mediului înconjurator, cât și etapele de
creere a funcționalității prin funții C++ și blueprints.
În capitolul II vă voi prez enta componentele folosite în dezvoltarea jocului cât și prezentarea
unor facilități oferite.
În capitolul III reprezintă documentația de dezvoltare a jocului. De la transcrierea ideeilor
într-un document de dezvoltare care elaborează modul în care jocu l trebuie să se comporte, regulile
jocului, activele necesare, de la care se pot dezvolta anumite părți, aducerea de ideei noi sau scoaterea
anumitor lucruri care ulterior nu se încadrează în standardele propuse. Dar și ciclul iterativ folosit în
dezvoltar ea jocului, lucrându -se treptat la fiecare parte a jocului propriu zis.
În capitolul IV reprezintă partea tehnică, reprezentarea claselor C++, implementarea
funcționalității create în C++ asupra obiectelor statice cu ajutorul Blueprint
Capitolul V pre zintă ghidul utilizatorului, prez entarea opțiunilor oferite în materie de setări
de calitatea grafică si rezoluție , descrierea scurtă a nivelelor oferite .
Capitolul VI vă prezintă concluziile personale formate în decursul conceperii jocului, ideei
pentru dezvoltări ulterioare cât și păreri de la persoane implicate în faza de teste.
2
Capitolul I Componente de structura
1.1 Modulul Unreal Engine 4
Figura 1.1. Sigla Unreal Engine 4
Unreal Engine (UE) este un Engine dezvoltat de Epic Games , destinat in ițial pentru jocuri
first-person sh ooters, este folosit cu succes ș i pentru o varietate mare de alte genuri, cum ar stealth,
MMORPG. Codul Engine -ului este scris in C++ și are un mare grad de portabilitate și este folosit de
mulți dezvoltatori de jocuri s au aplicații [1].
În 2015 UE 4 devine gratis, punând la dispoziție toate uneltele cât si codul sursa utilizatorilor .
UE 4 vizează compatibilitatea cu toate platformele majore ca și Microsoft Windows și Xbox
One prin DirectX 11 și 12; OS X, Linux, PlayS tation 4,iOS, Android prin OpenGL; cât și HTML5
prin JavaScript. El ofera posibilitatea de a creea aplicații prin programare C++ , Blueprints c ât și o
combinație a celor două [2].
Multitudinea de unelte puse la dispoziția utilizatorilor:
Șabloane predefi nite pentru principalele tipuri de jocuri .
Conținut inițial, care cuprinde obiecte, particule de efect, audio , etc..
Program de control al sursei (Source Controll).
Magazin virtual de unde se pot vinde sau cumpara obiecte create de alti utilizatori.
Tutor iale create de cei de la Epic Games.
Forumul comunitații.
Multe altele.
Figura 1.2 Șabloane predefinite.
3
1.2 Modulul Visual Studio
Figura 1 .3 Sigla Visual Studio
Visual Studio include un set complet de instrumente de dezvoltare pentru generarea de
aplicații ASP.NET, Servicii Web XML, aplicații desktop și aplicații mobile. Visual Basic, Visual
C++, Visual C# și Visual J# toate folosesc același mediu de dezvoltare integrat ( Integrated
Development Enviroment – IDE) care le permite p artajarea instrumentelor și facilitează crearea de
soluții folosind mai multe limbaje de programare [3].
Visual Studio este mediul integrat de dezvoltare recomandat de Epic Games pentru Unreal
Engine 4 pe platforma Windows, respectiv Xcode pentru OSX. Sis temul de IntelliSense recunoscând
funcțiile și macro -urile prezente in codul sursă a l Engine -ului. La creerea unui proiect nou folosind
C++, UE 4 afișează eroare in cazul in care Visual studio nu este prezent în sistem.
1.3 Noțiuni de limbaj C++ utilizate la dezvoltarea aplicației
Dezvoltat de Bjarne Stroustrup având prima lansare comerciala în 1985, alegerea de a
dezvolta peste limbajul de programare C are la bază protabilitatea și rapiditatea lui.
Au fost adaugate facilitații precum clase, clase der ivate, clase virtuale, funcții virtuale,
supraîncărcarea operatorilor și a funcțiilor, referințe, constante, moștenire multiplă, și multe altele
[4].
Unreal Engine are propria conventie de numire a variabilelor și a claselor cât și recomandări
în scrier ea codului propriu zis. Precum și funcții macro care ajuta la refolosirea unor funcții C++ in
Blueprints sau transmiterea de mesaje in jurnalul de iesi re [5].
Exemple [5]:
1. Clase:
Clasele șablon (template) au prefixul T (TMyTemplateClass).
Clasele care moștenesc din UObject au prefixul U (UMyObject).
Clasele care moștenesc din AActor au prefixul A (A MyActor).
Enumeratile au prefixul E (E MyEnum).
Variabilele de tip boolean au prefixul b (bIsThisTrue).
Etc…
2. Variabile: fața de convenția de scriere clasi ca a C++ Unreal folosește
int32 in loc de int
FString in loc de std::string
FName
auto cand trebuie legata o lambada de o variabila, deoarece tipurile lambada
nu pot fi exprimate in cod
Protejarea pointerilor cu „ensure”, care verifică expresia și genereaz ă
callstack în acel punct.
4
3. Recomandări în scrierea codului propriu zis:
Numele variabilelor, metodelor și clasele să fie cât mai clare, lipsite de
ambiguitate ș i descriptive. Cu cat sfera de cuprindere a numelui este mai
mare cu atât mai mare este impo rtanța unui nume bun și descriptiv. De
evitat supra -abrevierile.
Comentariile să fie utile, a nu se scrie comentarii explicând o porțiune de
cod neclar, rescrieți codul, comentarile nu trebuie să contrazică codul.
4. Macro:
De transmiterea mesajelor in jurn alul de ieșire:
UE_LOG(LogTemp, Warning, TEXT(" %s Mesaj de afisat %f") *var1, *var2 );
macro -ul poate prelua 0 sau pană la 2 variabile de afișat cu condiția ca tipul
de variabile să fie specificate ca și în cazul ”printf” din C.
De expunere a funcțiilor in blueprints: UPROPERTY când se declara
proprietăți, pot fi adăugați specificatori în declarație pentru a controla modul
în care proprietatea se comportă cu diferite aspecte ale Engine -ului și
editorului. Prezentarea mai larga a câtorva specificatori se va face in capitolul
IV. [6]
De expunere a functiilor in blueprints in vederea rescrieri valorilor:
UFUNCTION la fel ca și in cazul UPROPERTY, specificatori pot fi adaugați
in declarație pentru a controla comportamentul. Prezentarea mai larga a
câtorva sp ecificat ori se va face in capitolul IV [7].
5
Capitolul II Specificațiile aplicației
2.1 Documentul de dezvoltarea a jocului
Un document de dezvoltare a jocului (Game Development Document – GDD) este un
document de design viu foarte des criptiv al designului unui joc video. Documentul este creat de
echipa de dezvoltare ca rezultat al colaborării dintre designeri, artiști și programatori care este folosită
pe tot parcursul procesului de dezvoltare a jocului.
În continuare vă voi prezent a prima versiune a documentului de dezvoltare a jocului
WarZone.
WarZone
GDD v 1.0(@02 Feb 2017)
Fluxul jocului:
1. Meniu principal
2. Startul jocului
3. Determinarea dacă jocul este caștigat sau pierdut
Reguluile jocului(un singur jucator):
Obiectivul jocului este de a elimina toate tancurile inamice prin tragerea asupra lor cu proiectile
navigând în același timp pe terenul nivelului. Fiecare tanc pornește cu același numar de proiectile,
aceași cantitate de viața și aceleași principii de funcționare, care vor duce la un mediu echilibrat pentru
jocator.
Statusul jocului:
1. În curs de desfașurare – atunci când un tanc inamic și tancul jucatorului sunt pe câmpul de
luptă.
2. Joc câștigat – doar tancul jucătorului este pe câmpul de luptă.
3. Joc pierdut – tancul jucatorului a fost eliminat.
4. Status necunoscut – starea implicită.
5. Pauză – jocul este pe pauză și este afișat meniul intermediar.
Statusul actorilor:
1. Eliminat – nivelul de viata a tancului este redus la 0 sau mai puțin. Se aplică urmatoarele
efecte:
a. Corpul tancului ramâne pe câmpul de luptă.
b. Efectele speciale sunt declanșate : sune t explozie și particule.
c. Tancul pierde comenzile de control (mișcare, tragere, țintire).
6
2. Activ – nivelul de viață a tancului este mai mare decât 0. Are toate comenzile de control.
Mecanici:
1. Viața – reprezintă durabilitatea tancului. Când viața tancului es te redusa la 0 sau mai puțin,
acesta este eliminat.
2. Viteza – reprezintă cât de mobil este tancul. Viteza mai mare crește rata de mișcare. Viteza
poate fi redusă de terenul pe care se află sau după un anumit nivel de daune primite.
3. Daune per proiectil – reprezinta nivelul de viață ce urmează să fie scăzut după ce un tanc a
fost lovit de un proiectil.
4. Muniție – nivelul de muniție este finit, fiecare tanc va incepe jocul cu același numar de
proiectile.
Interfața vizuală:
1. Elemente vizuale afișate în timpul jocu lui
a. Ținta – indică turelei și țevii tancului locul de rotire și țintire, cât si statusul de tragere:
i. Roz: perioadă de reîncarcare a proiectilului.
ii. Galben: Turela sau tunul este în mișcare și dacă se trage este posibil ca
proiectilul să nu ajungă la destina ția dorită.
iii. Verde: turela și tunul este statică și tragerea este mai precisă.
iv. Roșu închis: cantitatea de muniție a ajuns la 0.
b. Bara de viață – afișează nivelul curent de viață a tuturor tancurilor.
c. Muniție – afișează cantitatea muniției rămase.
2. Camera ju catorului:
a. Camera cu vedere la persoana a -3a – permite navigare mai buna a terenului de luptă.
b. Camera cu vedere la persoana întâi – permite o precizie mai bună la tragere.
3. Meniul intermediar:
a. Reîntoarcere la joc.
b. Opțiuni – permite schimbarea rezoluției sau a nivelul calității.
c. Schimbarea nivelului.
d. Părăsire joc.
Comenzile de control asupra jocului:
1. Țintire – se face cu ajutorul mouse -ului pe axele X și Y.
2. Mișcarea tancului:
a. Tasta „W” mișcarea tancului înainte.
b. Tasta „S” mișcarea tancului înapoi.
c. Tasta „A” acționează șenila din partea stânga.
7
d. Tasta „D” actionează șenila din partea dreapta.
3. Tragere –click buton mouse stânga pentru a lansa proiectilul în direcția dorită.
4. Pauză:
a. Tasta „ESC” schimbă statusul jocului din activ în inactiv și afișează meniul
intermediar.
b. Planarea cursorului deasupra buonului cu opțiunea dorită și click stânga pentru
alegerea ei.
Active necesare:
1. Efecte sonore:
a) Sunete motorului de tanc în repaus cât și accelerare.
b) Tragere proiectil.
c) Explozie proiectil.
d) Explozie tanc.
2. Modele 3D:
a) Mod el tanc.
b) Model proiectil.
3. Efecte particule:
a) Explozie.
2.2 Ciclul iterativ
Figura 2.1 Graficul Ciclului iterativ Mediu
înconjurător
Tanc
Controler Interfața
Vizuală
Jucatorul 2
8
În cursul dezvoltării jocului sa folosit un ciclu iterativ, parcurgând treptat fiecare nod al
acestuia. La primu l ciclu fiind creeate activele necesare, urmând ca la următoarele cicluri să se
implementeze treptat funcționalitatea fiecăruia și retușarea jocului sau rezolvarea de probleme pe
principiul „what's the least fun”.
Primul ciclu de iterație:
Mediu înconjură tor – hotărârea asupra care ar fi mărimea ideală a terenului de luptă și
creerea, modelarea acestuia, pentru început, pentru testarea funcționalității tancului
terenul va fi drept cu munții pe margine pentru a delimita planșa de joc.
Tanc – după creerea ș i asamblarea modelului de tanc, modelul tancului se va seta ca
actorul implicit la rularea jocului.
Controler – se va seta camera la persoana a 3a care se va controla mișcarea turelei.
Jucatorul 2 – se va poziționa pe hartă modelul tancului, acesta va dev enii tancul inamic și
va primi funcții de inteligență artificiala de bază.
Interfața vizuala – se va crea un simplu meniu principal, cu opțiuni de începere și închidere
a jocului, cât și activarea vizibilității cursorului mouse -ului, începerea sau oprirea jocului
prin apăsarea butoanelor din meniu cu click stânga, tastei „A” de pe Gamepad pentru
începere respectiv „Back” pentru ieșire sau pentru tastatură, tasta „Enter” pentru începere,
tasta „ESC” pentru ieșire.
La începerea celui de al 2lea ciclu, se veri fică ce este creat și se pune întrebarea „Ce este cel
mai puțin distractiv la joc?”:
Mediu înconjurător: Terenul de luptă este lipsit de texturi, delimitări de rellief.
Tanc: momentan acesta nu este prioritar.
Coltroler: avem camera setată dar turela tancu lui nu urmăreste camera.
Jucatorul 2: pentru echilibrul jocului acesta va moșteni funcționalități de la controler.
Interfața vizuala a utilizatorului: creerea țintei .
Procesul se repetă pană se ajunge la produsul final, se trateaza o singură problemă per n od per
ciclu pentru a evita supraîncarcarea, pentru a ușura procesul de debug în caz că rezultatul nu
este cel dorit. Este recomandată creerea unei copi backup sau, daca un software Source
Controll este folosit, salvarea în repertoriu a modificărilor adus e.
9
Capitolul III Documentația tehnică a aplicației
3.1 Creerea mediului înconjurător
UE4 oferă unealtă pentru creerea de medii înconjurătoare. Avantajele folosind această
unealtă:
Folosește doar 4 octeți de memorie per vertex( grafica compu terizată – structura
de date care descrie anumite atribute în mai multe puncte de pe o suprafață), pe
când dacă importăm un mediu înconjurător creat in Maya sau Blender, acesta va
folosi 24 – 28 octeți per vertex.
Suportă nivelul de detaliu (Level Of Detail – LOD) și streaming, care mărește
eficiența redării prin scăderea volumului de lucru pe etapele grafice.
Posibilitatea de a creea medii de pana la 8km x 8km.
Unelte incorporate pentru scluptarea nivelului.
Fereastra de creere a mediului înconjurător:
Figura 3.1 Fereastra de creere a mediului înconjurător
1
2
3
4
5
6
8 7
9
10
1. „Manage” – permite creerea și ajustarea peisajului.
2. Avem opțiunea de a creea un mediu nou sau de a importa unul deja existent sau creeat în alt
mediu de dezvoltare, precum și adăuga rea unui material de bază pe peisajul ce urmează a fi
creat.
3. Folosind „Location”, „Rotation”și „Scale” putem determina locația planșei.
4. „Section Size” este folosit de nivelul de detaliu al planșei, secțiuni mai mici permit ca nivelul
de detaliu sa fie ma re dar cu cost ridicat asupra CPU -ului, pe când secțiunile mai mari permit
un nivel de detaliu per secțiune mai mic dar și un cost mai redus asupra CPU -ului. Dacă se
dorește o planșă mare, se vor folosi secțiuni mari pentru a evita suprasolicitarea CPU -ului.
5. „Sections per Component” ajuta nivelul de detaliu al planșei, fiecare secțiune este unitatea de
masură pentru nivelul de detaliu.
6. „Number of Components” împreună cu „section size” ajută la determinarea marimii finale a
planșei. Valoarea acestuia es te plafonată 32 x 32, deoarece fiecare componentă are asociat un
cost asupra CPU -ului și depasirea acestei valori poate creea probleme majore de performanță.
7. „Overall Resolution” permite setarea numarului de noduri pe care peisajul le va utiliza.
Această o pțiune este utilă atunci când se încearca potrivirea unui mediu înconjurator creat
extern peste peisajul creat în UE4.
8. „Fill World” extinde planșa pentru a umple o parte mai mare din lume.
9. „Create” creează nivelul cu setările selectate.
Fereastra de scluptare a terenului:
Figura 3.2 Fereastra Scluptare
1
2
3
5 4
7 6
8
11
1. „Sculpt” pornește modul de scluptare a peisajului.
2. „Tool” procesul de scluptare a peisajului implică folosirea uneltelor în modul de s cluptare
pentru a modifica aspectul planșei cu o multitudine de unelte, de la unelte simple care doar
ridică sau coboară terenul, la unelte complexe care aplică efecte mai intresante precum
eroziunea.
3. „Brush” definește aspectul, marimea și forma ariei plan șei care va fi afectată când se
scluptează, poate avea diferite forme, marimi și falloff.
4. „Falloff” definește variația tipurilor de falloff care se pot folosi, care vor schimba felul în care
va arata precum si duritatea marginilor periei.
5. „Tool Strength” d etermină impactul periei asupra terenului, dacă este folosită o tableta cu
senzori de presiune, presiunea cu care este apasat pe ecracul tabletei afectează puterea uneltei.
6. „Brush Size” determină marimea pensulei în unitatea de masură a editorului.
7. „Brush Falloff” determină duritatea marginilor periei.
8. „Use Clay Brush” această unealtă verifică media fețelor secțiunilor de sub perie și mută
planșa in funcție de medie, utilă în situații în care trebuie umplute goluri sau saparea unor
gropi.
Figura 3.3 Unelte disponibile pentru scluptare, pensulă și duritate a marginilor pensulei
12
Fereastra de pictare:
Înainte de a începe pictarea planșei trebuie definite straturile acesteia și desemnarea unui
material sau culori pentru fiecare strat pe care îl av em, în cazul meu doar două straturi, iarba si
pământ. Uneltele sunt aceleași ca și în cazul scuptării.
Figura 3.4 definirea texturilor folosite în straturi și transformarea terenului într -un teren low poly.
Alegerea de a transforma terenul din unul cu s uprafete fine și cu multe fețe pe secțiune în una
low poly a fost facută dorind un cost mai redus asupra CPU -ului.
Figura 3.5 Rezultatul final în creerea nivelului
13
3.2 Clasele C++
UE4 oferă C++ Class Wizard oferă o modalitate rapidă și ușoară de a adăuga clase native C++ în
proiect, pentru a extinde cu funcționalitatea proprie [8].
Figura 3.6 Clase implici te
La creerea unei clase noi, avem de ales dintr -o multitudine de clase șablon, în funcție de ce
dorim să dezvoltăm alegem clasa de la care s ă moștenim funcționalitatea de bază și adaugăm sau
suprascriem cu funcții propri. Prima fereastră este cu clasele cele mai des folosite, dacă clasa pe care
dorim să o dezvoltăm nu se regăsește printre acestea, va trebui vizualizată întreaga ierarhie a clas elor:
Figura 3.7 Toate clasele oferite de UE
14
Este recomandat pentru claritatea proiectului ca clasa creata să aibe prefixul clasei părinte,
spre exemplu clasa Tank are părinte clasa Actor din UE4, astfel ea va fi denumita ATank. Îndată ce
este creată, se va deschide automat Visual Studio (sau Xcode) cu clasa creată și codul generat automat
pentru clasa aleasă.
3.2.1 Dependența claselor
Într-un proiect C++ importanța unei structuri a dependențelor între clase bine definite crește
odată cu dimensiunea fișierelor din care este alcătuit. Impactul asupra unui proiect mare cu structura
dependențelor neclară sau structurată la întamplare:
Compilare: crește timpul de compilare drastic.
Complexitate: dependențe inutile sau incomode adaugă la complexitate acci dentală.
Dificultate : crește dificultatea de restructurare sau refactorizare a codului și de a testa izolat
modulele.
Documentație: îngreunarea procesului de documentare, când știm că header -ul reflectă cu
exactitate ceea ce este folosit în fișier, aceste informații pot ajuta la înțelegerea codului.
Figura 3 .8 Dependența claselor a aplicației WarZone
TankAiming Tank
TankPlayerController TankAiController
Projectile TankTurret TankBarrel
TankMovementComponent TankTracks
15
Pe baza ciclului iterativ prezentat ulterior, clasele create au căpătat treptat funcționalitate, dar
dependența acestora nu era ideală, în momentul în care codul a căpatat funcșionalitatea dorită a urmat
o amplă acțiune de refactorizare a codului, ajungânduse la dependențele prezentate în figura 4.2.1.1.
3.2.2 Clasa Tank
Moștenește clasa părinte Pawn . Clasa Pawn este cl asă șablon oferită de UE4 care se ocupă de
toți actori care pot fi posedați de jucători sau inteligență artificială, este reprezentarea fizică a
jucătorilor sau a vietății din nivel. Clasa Tank s e va ocupa de starea tancului prin:
Variabile pentru determin area:
o Cantitatea de viață pe care tanc ul o primeste cand începe jocul, se definește ca
proprietate Unreal cu parametrii de permisiune editării doar a obiectulului
implicit, pentru a evita situația ca un tanc sa primească o valoare mai mare
decât adversarul său, și parametru de denumire a categoriei.
Figura 3 .9 Variabila pentru determinarea vieții de început
o Cantitatea de viață curentă, inițializat cu valoarea cantității de viață de la
începutul jocului, din care se scade valoarea daunelor pr imite. Se definește ca
proprietate Unreal cu paramentrul vizibil oriunde și numele categoriei.
Figura 3 .10 Variabila cantității de viață curenta
Supr ascriem funcția TakeDamage din libră ria UE4, pentru a determina
daunele primite.
o Pentru a folosi variabila DamageAmount din funcție folosim RoundToInt din
clasa F PlatformMath și stocăm valoare in variabila de tip int DamagePoints .
o Pentru a determina punc tele de daune ce trebuie aplicate atunci când tancul
este lovit de proiectil și pentru a ne asigura cantitatea de viață nu scade sub 0,
iar maximul este setat ca nivelul actual de viață .
o Daca după scaderea daunelor de aplicat din viața curentă, valoarea vi eții este
mai mica sau egală cu 0, tancul este considerat eliminat . și pierde controlul
asupra tancului și este deposedat din modelul tancului
16
Figura 3 .11 Funcția de determinarea daunelor primite.
3.2.3 Clasa TankAiming
Moșteni tă din clasa părinte Actor. Clasa Actor este clas a șablon oferită de UE4, este clasa
de bază pentru obiecte care pot fi plasate sau născute în nivel, poate conține o colecție de
ActorComponents care pot fi folosite pentrua controla cum se vor mișca actori i.
Figura 3 .12 Structura funcționalității sistemului de ochire
Clasa TankAiming va implementa:
Inițializarea turelei și a țevii , Barrel fiind obiect de tipul UTankBarrel, respectiv
Turret tipul UTankTurret.
Figura 3 .13 Inițializar ea componentelor Barrel și Turret .
Sistemul de ochire : folosim funcția SuggestProjectileVelocity implementată în clasa
Engine -ului UG amePlayStatistics pentru a determina punctul de pornire, velocitatea
și punctul de aterizare a proiectilului.
TankPlayerController TankAiController
Tank
TankAiming Eveniment Blueprint
care se va ocupa de
rotația turelei AimAt(Crosshair) AimAt(Player)
)
AimAt( Crosshair)
Delegat la
17
Figura 3 .14 Implementarea sistemului de ochire.
Mișcarea țevii, în decursul implementării sa întâmpinat o problemă la rotire, anume,
când sistemul de ochire începea rotirea d e la 0° la 180° sau peste, tunul nu depășea
aceasta valoare și se începea rotația în directia opusă pană ajunge în punctul dorit.
Figura 3 .15 Funcția de miscare a tunului tancului
Starea de tragere, este verificată în fiecare cadru starea de tragere a tancului pentru a
determina în care din cele patru stari se regăsește
o Fară muniție, atunci când nivelul muniției ajunge la 0.
o Reîncărcare, când timpul scurs de la ultima tragere este mai mic decât timpul
de încarcare.
18
o Țintire, dacă tunul tancului este în mișcare
Figura 3 .16 Funcția de verificare a stării de tragere.
o Blocată, când tunul tancului este nemișcat iar tragerea se poate efectua cu
acuratețe.
Figura 3.17 Funcția de verificare a mișcării țevii tancului
Tragere
Figura 3 .18 Funcția de tragere
19
3.2.4 Clasa TankPlayerCo ntroller
Moștenește funcționalitatea clasei PlayerController a cărui părinte este clasa Actor , și este
folosită de jucatori să controleze Pawn . Clasa se va ocupa de modul cum tancul jucătorului folosește
sistemul de ochire și pornirea modului spectator după eliminarea acestuia.
Pentru pornirea modului spectator după eliminarea tancului posedat de jucător, trebuie
specificat exact care tanc este al jucătorilui, acest lucru se va face prin rescrierea funcției
SetPawn (APawn* InPa wn) oferită de engine:
Figura 3 .19 Implementarea funcției SetPawn
Figura 3 .20 Pornirea modului spectator
Folosirea sistemului de ochire de către tancul jucătorului se bazează pe capabilitatea tancului
de a urmari ținta. Ținta este creeată cu aju torul interfeței vizuale în plan 2D, locația acestuia în cod
este reprezentată de variabilele float CrosshairXLocation pentru axa X respectiv CrosshairYLocation
pentru axa Y. Pentru funcționare a mai fost nevoie de :
Deproject poziția țintei pe ecran la o poziție a nivelului
Figura 3 .21 funcția de obținere a direcției de vizualizare
Line Trace din punctul țintei pe ecran. Folosim funcție care returnează parametru
output, true daca loveste nivelul .
20
Figura 3 .22 Func ția line trace
Obținerea locației a obiectului lovit, dacă acesta este în raza maximă de acțiune.
Figura 3 .23 Funcția determinare locației lovite de vector
Odată obținute datele anterioare, se poate seta ca sistemul de ochire să urmărească
poziția țintei pe ecran pentru tancul posedat de jucător. Această funcție este apelată în
fiecare cadru pe durata jocului.
Figura 3 .24 Sistemul de ochire în poziția țintei pe ecran
21
3.2.5 Clasa TankAiController
Moșteneste funcționalitatea clasei AIController din cla sa părinte Actor, este clasa de bază a
comenzilor pentru Pawn controlați de inteligență artificială. Comenzile sunt actori non -fizici care pot
fi atașați unui Pawn pentru a le controla acțiunile.
Funcționalitatea inteligenței artificiale este de bază, mi șcarea și țintire asupra tancului
controlat de jucător, actualizat la fiecare cadru pentru un mediu mai echilibrat.
Figura 3 .25 Funcționalitatea AIController
Pentru evenimentele după eliminarea tancului controlat de inteligența artificială refolosim
funcția SetPawn prezentată în figura 4.2.4.1, iar OnDeath() va declașa alt eveniment.
Figura 3 .26 Funcția OnDeath
3.2.6 Clasa Tank Barrel
Moștenește din clasa StaticMeshComponent care este folosită pentru a creea o instanță a unei
UStaticMesh, a carui p ărinte este ActorComponent care se ocupă de componente care definesc
comportament reutilizabil care poate fi adăugat la diferiți actori.
Clasa se va ocupa de mișcarea țevii de tun, valorile implicite inițializate pot fi modificate de
catre designer în blu eprint :
Cât de rapid se va mișca în grade per secundă.
Valoarea minimă și maximă a mișcarii țevii de tun pe axa Y.
22
Figura 4.27 Funcția de miș care a țevii de tun
3.2.7 Clasa Tank Turret
Moștenește din clasa StaticMeshComponent care este folosită pentr u a creea o instanță a unei
UStaticMesh, a carui părinte este ActorComponent care se ocupă de componente care definesc
comportament reutilizabil care poate fi adăugat la diferiți actori.
Clasa se va ocupa de rotația turelei, valorile implicite inițializat e pot fi modificate de catre designer
în blueprint.
Figura 3 .27 Funcția de mișcare a ture lei
3.2.8 Clasa Projectile
Moștenită din clasa părinte Actor , la declanșarea evenimentului de tragere se va da naștere
proiectilului. Clasa se va ocupa de evenime ntele generate de proiectil, cât și de creerea unor
componente folosite în partea de blueprint. Funcționalitate:
În constructorul clasei se vor inițializa componentele folosite în blueprint , aceste componente
vor fi prezentate în subcapitolul Projectile Bl ueprint.
23
Figura 3 .28 Constructorul Projectile
Lansarea proiectilului – ProjectileMovement este pointer către clasa
UProjectileMovementComponent din codul sursă oferit de UE4. În editorul UE4,
coordonatele se pot obține la spațiu global coordonatele s e vor alinia conform rețelei globale,
respectiv la spațiu local, coordonatele se vor alinia conform obiectului selectat. Lansarea
proiectilului se va face cu viteza în spațiu local.
Figura 3 .29 Funcția de lansare a proiectilului
Eveniment OnHit – când pr oiectilul lovește un obiect declanșarea evenimentelor:
Figura 3 .30 Generarea evenimentelor la coliziunea dintre proiectil și alt obiect.
24
3.2.9 Clasa TankTracks
Asemenea claselor Turret și Barrel prezentate anterior, clasa TankTracks moștenește
StaticMeshComponent, se va ocupa de mișcarea tancului. Tancul creat nu are șenile funționale, el se
va mișca pe baza forței aplicate asupra tancului, sa presupus masa tancului de 40 tone, accelerația de
1250 m/s², folosind formula lui Newton(forța = masă *accel erație) obtinem 50000000 N forța aplicată
asupra tancului.
Figura 3 .31 Funcția de aplicare a forței asupra tancului
În decursul implementării acestei funcționalități s -au ivit câteva probleme majore precum ,
din cauza coliziunilor complexe a părților d in care este alcătuit tancul, la viteză mai mare sau la
coliziunea proiectilului cu acesta zbura. În timpul schimbarii direcției de mers tancul efectua derapaje
greu redresat.
Pentru rezolvarea probleme i derapajului sa creat o funcție care calculează și aplică forțe
laterale de corectarea acceleratiei asupra tancului:
Figura 3 .32 Forța de corecție laterală
Problema de zbor a tancului , am ajuns la concluzia că acesta genera forț e chiar daca nu era în
contact cu solul, rezolvarea este generarea de evenimente la contactul senilelor cu solul și întreruperea
forțelor când evenimentele nu sunt generate , funcție găsită în codul sursa al UE4
FComponentHitSignature . Pentru a registra evenimente la contact trebuie:
Înregistrarea delegatului la începerea jocului:
25
Figura 3 .33 Înregistrarea delegatului
Utilizarea semnăturii delegatului, în blueprint ambele șenile să aibe activat „Simulation
Generates Hit Events”, funcția OnHit să fie UFUNCTION privat.
Figura 3 .34 Semnătura delegatului
Odată cu rezolvare a problemelor, mai trebuie blocată viteza tancului din motive de egalitate între
jucător si inteligență artificială.
Figura 3 .35 Blocarea vitezei între valorile -1 și 1
3.2.10 Clasa TankMovementComponent
Clasă moștenită din clasa pătinte NavMovementC omponent, definește funcționalitatea de
bază pentru MovementComponents care poate fi implicată în inteligență artificială. Clasa se va ocupa
de mișcarea în direcția dorită a tancului jucătorului dar și de logica inteligenții artificiale de găsire a
drumulu i spre jucător.
Pentru mișcarea tancului de către jucător creem obiecte moștenite din clasa TankTracks și le
inițizăm pentru a aplica funcționalitatea de mișcare (înainte, înapoi, stânga și dreapta):
Figura 3 .36 Inițializarea șenilelor ca obiecte de tip TankTracks
Punerea în mișcare a tancului constă în aplicarea forțelor pe ambele șenile pentru mersul înainte,
respectiv valoare negativă pentru mersul înapoi (valoare setată în setările proiectului),
Figura 3.37 Funcția de mișcare pe direcția înainte
26
Iar pentru virare, aplicare de forțe pozitive pe o șenilă și negativă pe cealaltă:
Figura 3 .38 Funcție de virare dreaptă
Inteligența artificiala va folosi Nav Mesh Bounds Volume pentru a delim ita aria pe care tancurile
controlate de inteligență artificia lă vor folosi logica pathfinding către tancul inamic indiferent de
obstacole.
Stiind că clasa AiControler este clasa de bază a Pawn controlați de inteligența artificială,
moștenim din aceasta în clasa TankAiControler funcția MoveToActor() căruia ii pasăm variabilele
tancului care vrem sa il urmărim și marimea distanței minime la care se poate apropia.
MoveToActor() pasează inform ația logicii de pathfinding din interiorul engine -ului care în fiecare
cadru va scoate un vector, o direcție în care vrea să se miște pentru a ajunge din locul în care este în
locul în care vrea sa ajungă sub forma funcției RequestDirectMove( const FVector& MoveVelocity,
bool BForceMaxSpeed ). Pentru a lucra mai ușor cu valoarea vectorului MoveVelocity și pentru că ne
interesează doa r direcția de mers îl transformăm cu ajutorul GetSafeNormal(), care obține o copie
normalizată a vectorului, verificându -se că este în siguranță în funcție de lungime, returnează vectorul
zero dacă lungimea vectorului este prea mică pentru a se normaliza î n siguranță.
Figura 3 .39 Logica pathfinding a inteligenței artificiale
27
Figura 3 .40 Funcția Request direct move
Prin folosirea DotProduct() asupra vectorilor TankForward și AiIntention, obtinem produsul
lor, pasăm această valoare funcției MoveForw ard() pentru a determina cât de mult trebuie să se miște
tancul controlat de inteligență artificială pentru a ajunge la tancul controlat de jucător.
Pentru obținerea direcției de rotire a tancului folosim CrossProduct() asupra vectorilor
TankForward și Ai Intention și coordonata Z.
3.3 Blueprints
3.3.1 Interfețe Blueprint cu elemente de limbaj C++
Sistemul Blueprints Visual Scripting în UE este un sistem complet de scripting bazat pe
conceptul de utilizare a unei interfețe bazate pe noduri pentru a crea elemente de joc în cadrul
editorului.
Acest sistem este extrem de flexibil și puternic, deoarece oferă designerilor posibilitatea de a
utiliza toata gama de concepte și instrumente disponibile în general pentru programatori. Marcajul
specific blueprint este disponibil în implementarea C++ a UE, permite programatorilor să creeze
sisteme de bază care pot fi extinse de către designeri [9].
Clasele C++ pot fi extinse cu blueprints, permițând programatorilor să configureze clase de
gameplaz în cod care pot fi construite și modificate cu blueprints de către designeri de nivel. Macro
oferite pentru extinderea claselor C++ sunt fie pentru a folosi intreaga clasa ca si componentă într -o
clasa blueprint, sau de permiterea accesării, modificării variabilelor în clas a blueprint.
28
1 3 4 5 6 7 8
2 9 10
Figura 3 .41 Prezentarea ferestrei de editare Blueprint
1. „Component s”, fereastra care prezintă componentele care formează blueprint -ul respectiv,
adăugarea de componente noi sau schimbarea ierarhiei comp onentelor. Componentele pot fi
cele standard oferite de UE, create cu ajutorul C++ sau obiectul după care este creat ă clasa
Blueprint.
2. „My BluePrint” fereastra care prezintă graficele, funcții, evenimente, macro sau variabile
prezente în Blueprint cu obțiu nea de a adăuga la nevoie altele.
3. „Toolbar” bara de unelte utile în timpul utilizării blueprint -ului.
4. Tab-ul „Viewport” oferă vizualizarea obiectului în cauză, oferă posibilitatea de modificare a
mărimii, rotirii sau a pozitiei componentelor sau a întregul ui ansamblu.
5. Tab-ul „Construction Script” rulează în urma listei de componente atunci când este creată o
instanță a unei clase Blueprint.
29
6. Tab-ul „Input Setup” se ocupă de acțiunea comenzilor de intrare definite în setările proiectului
sau legarea acestor a de o funcție C++.
7. Tab-ul „Event Graph” se ocupă de evenimentele de la începerea jocului.
8. Tab-ul „Details” afișează detaliile componentei selectate, acestea îl ajută pe designer să
modifice setările obiectelor la valoarea dorită. Dacă o componentă are var iabile definite în
clase c++ și sunt definite ca variabil e vizibile sau editabile în clasa Blueprint, ele vor apărea
în acest tab, sub categoria creata in definirea variabilei.
9. „Compiler Results” afișează rezultatul compilări clasei Blueprint.
10. Fereastra în care este prezentat tab -ul selectat, în figura 4.41 este prezentată fereastra tab -ului
„ViewPort”.
3.3.2 Tank Blueprint
Acest ă clasă blueprint reprezintă modelul construit al tancului din elemente statice creeate în
aplicația grafică Blender și importa te în UE 4 , funcționalitatea acestuia cât și evenimentele generate
la începerea jocului.
Modelul tancului este contruit din: corpul tancului, șenile, turelă și țeava de tun, ele sunt unite
prin soket -uri. Soketurile sunt create pe elementul de care este atașat, spre exemplu corpul tancului
are soket pentru șenila dreapta, șenila stânga și turelă, turela are soket pentru țeava de tun.
Figura 3 .42 Soket -urile corpului tancului
Componentele ta ncului (figura 3 .41, fereastra 1) :
TankBP(self), conține implementarile din c++ a variabilelor de începere a vieții prin macroul
UPROPERTY(EditDefaultsOnly, Category = ”Setup”), unde tag -ul EditDefaultsOnly va
permite m odificarea valorii variabilei doar din tank blueprint , și variabila de viața curenta prin
macro -ul UPROPERTY(VisibleAnywhere, Category = ”Health”), unde tag -ul
VisibleAnywhere permite vizualizarea variabilei de pe orice tanc plasat pe nivel.
Tank, conține elementul static al corpului de tanc și setarile d e simulare a fizicilor, masa
tancului în kilograme, variabilele linear și angular damping care reglează inertia tancului.
30
Figur a 3.43 implementările componentei Tank
Gimball împreună cu atașamentele Spring arm respectiv 3rdPerson și 1stPerson se ocupă de
camera de vizualizare în timpul jocului. La începutul dezvoltării jocului sa folosit doar
Spring arm, la miscările camerei pe axa X și Y acesta aduna valorile schimbarilor de
coordonate ale camerei și ajungea la un comportament instabil și incontrolabil, adaugarea
Gimball care este un suport pivotat care permite rotirea unui obiect în jurul unei singure axe,
rezolvând problema.
TankTurret și Tank Barrel, sunt legate prin socket și se vor roti împreuna în timpul luptei .
Conțin variabilele, din clasele C++ cu același nume, Max Degrees Per Second pentru mișcarea
turelei pe axa Y și Max Degrees Per Second, Max elevation și Min elevation care se vor
ocupa de miscarea tunului pe axele X și Y, daca valorile din editorul clasei blueprint sunt
modificate, ele vor rescrie valorile definite în clasele C++.
LeftTrack și RightTrack sunt atașate tancului prin soketurile cu același nume, ele sunt cele
care aplica forța de mișcare asupra tancului
HealthBar este un obi ect din categoria interfața utilizatorului, el va afișa deasupra tancurilor
o bară albastră care indică viața curentă .
31
TankMoveme nt și TankAiming sunt clase c++ definite ca și componente chemabile în
blueprint. Această procedură se face prin definirea macr o-ului înainte de definirea clasei în
header -ul clasei C++.
Figura 3 .44 Macro de definire a clasei ca componentă chemabilă în blueprint
Tab-ul „Input Setup” , conține seria de comezi de control asupra tancu lui controlat de
către jucător. Comenzi le, fie c ombinația de taste și mouse sau controller, sunt definite in
setările proiectului, iar funcționalitatea este definită de funcțile C++ sau funcții din blueprint,
legătura între acestea fiind facută î n acest tab al clasei blueprint. Comenzile de control asup ra
tancului sunt alcatuite din:
Comenzi pentru deplasarea tancului, este alcătuit din comenzi de intrare de la
tastatură sau controler, funcțiile C++ de mișcare pe direcția înainte și virare
dreapta și componenta blueprint Tank Movement. Comenzile de int rare sunt
definite în setarile proiectului, definite cu valore pozitivă pentru mișcare pe
direcție înainte respectiv virare dreapta și valoare negativă pentru miscare pe
direcția înapoi respectiv virare stânga, acestea sunt conectate la nodurile
funcțiilor prin pinurile de exectutare(pinul alb) și valoarea de accelerare la
parametrul Trow din funcție (pinul verde), componenta Tank Movement fiind
destinatara implementarilor
Figura 3.45 Comenzi de control pentru deplasarea tancului
Comenzile pentru miscar ea camerei și a turelei, comenzile de intrare sunt
primite de la mouse sau joystickul controlerului, sunt aplicate asupra
Gimbalului pentru controlul camerei și în fiecare cadru asupra rotației Yaw
pentru axa X respectiv Pitch pentru axa Y. În figura 4.46 este prezentată
comanda pentru mișcarea axei X, comenzile pentru axa Y fiind asemănatoare
cu diferența că valoarea axis multiplicată cu delta seconds va fi conectată la
rotația Y(pitch).
32
Figura 3.46 Comenzile mișcarii axelor.
Comanda de tragere, dă nașt ere proiectilului din soketul țevii de tun la apăsarea
butonului setat în setările proiectului și daca condițiile sunt îndeplinite. Acestă
comanda va fi aplicată asupra componentei Tank Aiming.
Figura 3.47 Comanda de tragere
33
Comanda de schimbare a modului de vizualizare , comută între modul de
vizualizare de la persoana a 3a la persoana întâi și invers
Figura 3 .48 Schimbarea modului de vizualizare
Tab-ul „Event Graph” se va ocupa de inițializările componentelor tancului la începerea jocului
cât și bara care indică viața curentă.
Figura 3 .49 Inițializarea componentelor tancului
3.3.3 TankPlayerController Blueprint
Clasa blueprint care se va ocupa de afișarea interfața vizuală „MyPlayerUI” atunci când
AimingComponent este găsit la tancul contro lat de jucător. interfața vizuală „MyPlayerUI” va fi
prezentată ulterior.
34
Figura 3.50 TankPlayerController Blueprint
3.3.4 TankAiController Blueprint
Clasa blueprint care oferă designerului posibilitatea de a ajusta raza minimă la care tancurile
contr olate de inteligență artificiala se pot apropia de tancurile controlate de jucători și componenta
care ajută la urmarirea tancului controlat de jucător „PathFollowingComponent”.
3.3.5 Projectile Blueprint
Clasa blueprint care se va pune la dispoziția des ignerului componentele și variabilele din clasa
Projectile din C++ care vor determina comportamentul acestuia dar și pentru a adauga efectele
speciale ale acestuia.
Componentele clasei blueprint Projectile:
Projectile_BP(self) pune la dispoziție variabila de daune aplicate asupra
tancurilor lovite și variabila de distrugere a proiectilului dupa impact.
Componenta radacină CollisionMesh activiează coliziunea proiectilului pentru
a determina obiectele lovite cât și forma, mărimea și textura acestuia.
Launch Blast va adăuga proiectilului particulele de lansare precum și
particulele de fum lasate în urma acestuia.
ImpactBlast va adăuga particulele de explozie la impactul proiectilului cu un
obiect.
ExplosionForce aplică o forță asupra tancului lovit sau care se află în raza de
actiune a acestuia, aceste variabile sunt oferite designerului pentru ajustare.
35
3.3.6 WarZoneGame Blueprint
Aceasta clasa blueprint este doar pentru a spune editorului să folosească clasele create în locul
celor implicite, nu c onține scripturi sau variabile.
Figura 3 .51 Folosirea claselor create în timpul jocului
3.4 Interfaț a vizuală a utilizatorului
Creerea interfeței vizuale constă în două părți:
Designer – în care se va construi ceea ce va fi aratat utilizatorului, se adaugă imagini,
butoane , text, etc. . Obiectele folosite se vor pune pe panoul de pânză, ținând cont de
ierarhia lor în cazul în care dorim suprapuneri.
Graph – în care se va adăuga funcționalitatea interfeței, afișarea cursorului în timpul
afișării interf eței vizuale, deciderea funcționalități butoanelor, deschiderea altui nivel,
ascunderea sau afișarea obiectelor sau accesarea de comenzi de consolă oferite de UE.
3.4.1 Interfața meniului principal
Interfața meniului principal conține butoanele:
Start – accesarea acestia va trimite utilizatorul la meniul de selectare a nivelului.
Options – acesarea acestuia va deschide meniul cu setările grafice ale jocului
Quit – părăsirea jocului.
Construirea părții de design a meniului principal . Obiectele pla sate pe pânza de lucru sunt
ancorate de o anumită parte a pânzei astfel încât acestea să își pastreze locația cât mai bine
atunci când marimea fersestrei crește sau scade. Butoanele meniului principal și butoanele
meniului de opțiuni nu vor apărea pe ecra n în același timp .
36
Figura 3 .52 meniu principal și submeniul de opțiuni – designer
Adăugarea funcționalității în secțiunea Graph:
Permiterea folosirii mouse -ului și arătarea cursorului pe ecranul principal
Figura 3.53 activare a mouseului în meniul principal
Adaugarea de eveniment la apăsarea butonului Start.
Figura 3 .54 funcționalitatea butonului start din meniul principal
37
Adaugarea de eveniment la eliberarea butonului Quit
Figura 3 .55 Funcționalitatea butonului Quit din meniul principal.
Adaug area evenimentului de a ascunde butoanele meniului principal și afișarea
submeniului de opțiuni la apasarea butonului Options.
Figura 3 .56 Funționalit atea butonului Options din meniul principal
Figura 3.57 Submeniul opțiuni
38
o Submeniul de op țiuni conți ne o serie de butoane care reglează calitatea grafică a
jocului în funcție de preferințe sau puterea PC -ului, la apăsarea unui buton, spre
exemplu, butonul LOW din categoria Textures, acesta va executa o comandă de
consolă pusă la dispoziție de UE4 care va schimba nivelul texturilor la cel mai
mic nivel, îmbunătățind performanțele sacrificând detaliile. În aceași manieră se
implementează toate butoanele de setarea a calității grafice și rezoluția , lista
comenzilor [10].
Figura 3 .58 Schimbarea calității t exturilor prin comenzi de consolă
Ieșirea din submeniul de opțiuni se face prin butonul Back to Main Menu, care ascunde
submeniul opțiuni și arată meniul principal.
Figura 3.59 Reîntoarcerea la meniul principal din submeniul opțiuni.
39
3.4.2 Interfața Selectări de nivel
Interfață care prezintă nivelele de joc disponibile și o mică prezentare a nivelelor printr -o pictogramă.
Acesta face legătura între meniul principal și nivelele de joc .
Figura 3.60 Selectarea nivelului
Funcționalitatea butoanelor i mplementate fiind de schimbarea nivelului în funcție de opțiunea aleasă
de către utilizator respectiv ieșire și activarea cursorului mouse -ului pentru navigare.
Figura 3 .61 Funcționalitatea interfeței de selectare a nivelului
40
3.4.3 Interfața jucătorului
Interfața jucatorului este creată și afișată pe ecran atunci cand jocul este început. Ea conține
informații pentru jucător, precum muniția curentă, tasta de pauză și punctul de ochire care la randul
lui afișează starea de tragere.
Figura 3 .62 Afișarea interfeței jucătorului.
Pentru a fișarea muni ției curente, sa creat funcția GetCurrentAmmo în cadru Widget
Blueprint, care transforma nivelul curent al muniției din intreger în string, apoi din string în format
text pentru a putea fi afișat pe ecran și u pdatat în timp real.
Figura 3.63 Funcția de afișare a muniției
Schimbarea culorii punctului de ochire în funcție de starea de tragere, folosim funcția C++
implementată în figura 4.16, pentru determinarea starea de tragere curentă și desemnarea unei culo ri
acesteia.
Figura 3 .64 Setarea culorii punctului de tragere
41
3.4.4 Meniul intermediar
Eveniment declanșat la apasarea tastei „ P”,trece jocul din stare activă în stare de pauză și
afișează pe ecran meniul intermediar.
Figura 3.65 Meniu intermedia r
Butonul Resume sc oate jocul din starea de pauză ș i revine în stare activă, retrage interfața meniului
de ecran și cursorul mouse -ului
Figura 3 .66 Funcționalitatea butonului resume.
Funcționalitatea butonului Options este la fel ca și cel din meniul pr incipal figura 4.56, 4.57, cu
diferența că în fiind în timpul jocului se pot observa schimbările grafice în timp real.
Butonul level select va trimite utilizatorul la ecranul de selectare a nivelului prezentat în figura
4.60- Butonul Quit va închide aplica ția.
42
Capitolul IV Ghidul utilizatorului
4.1 Rularea jocului
În mo mentul terminării proiectului sau unei părți a acestuia și se doreste trimiterea către
testare respectiv ca produs final, UE4 oferă posibilitatea de împachetare a jocului pentru platforma
pentru care a fost produs proiectul.
Accesul în aplicație se face prin lansarea executabilului „WarZone.exe” din directorul
aplicației.
Cerințele minime pentru rularea jocului, după testări, sunt: Intel Core2Duo 2.2Ghz, 4Gb
DDRAM, placă video cu suport DirectX 9c, microsoft visual redistributable c++ 2012 .
4.2 Meniu principal
În continuare va apărea fereastra care conține m eniul principal, prezentat în figura 3 .52.
Meniul conține în partea stânga sus numele jocului „War Zone”, pe fundal imagine repre zentativă a
unui câmp de luptă cu tancuri.
În mijlocul ferestrei apar cele trei butoane „Start”, „Options” și „Quit”. Pentru a continua
trebuie selectat primul buton, care va duce la meniul de selecție al nivelului de joc. Pentru a
schimba setările grafi ce ale jocului sau rezoluția ferestrei trebuie selectat butonul „Options”. Pentru
a ieși din joc trebuie selectat butonul „Quit” care va închide fereastra jocului.
4.3 Selectarea nivelului
În continuare va apărea meniul de selecție a nivelulu i de joc , prezentat în figura 3 .60, care
conține în momentul de față 4 butoane care pot fi selectate. Butonul „Back” se utilizează în cazul în
care se dorește întoarcerea la meniul anterior , Butonul „Quit” se utilizează în cazul în care se
dorește ieșirea din joc.
Pentru a ajunge în jocul propriu -zis trebuie selectat unul dintre cele doua nivele utilizând
butoanele „War Field” sau „Urban Assault”, deasupra butoanelor se află pictograme cu imagine din
nivelul respectiv.
4.4 Niveluri de joc
Jocul începe odată cu sel ectarea unuia din nivelele de joc, tancul putând fi controlat de pe
tastatură cu ajutorul tastelor „ W S A D „ pentru mișcarea tancului înainte, înapoi, stânga și dreapta
și cu ajutorul mouse -ului pentru a controla rotația turelei cât și locul în care se trage, click stânga
pentru a acționa sistemul de tragere și click dreapta pentru a schimba modul de vizualizare de la
persoana a 3a la persoana a 1a și invers la urmatoarea apăsare. La începerea nivelului toate
tancurile au aceași cantitate de muniție și viață scopul fiind cel de a distruge tancurile inamice.
43
Nivelul de joc „War Field” se desfășoară p e un câmp de luptă muntos cu denivelări și gropi
pentru a oferi o experiență distractivă.
Nivelul de joc „Urban Assault” este încă in curs de dezvoltare, d orind ca acțiunea să se
desfășoare într -un mediu urban, cu un labirint de case și blocuri. Acest nivel a fost creat inițial
pentru a testa o problemă cu terenul care apărea în timpul nivelului „War Field”, din cauza
coeficientului de frecare pe care textu ra ierbii o avea implementată , care cauza tancului coliziuni
neasteptate.
Inamicii, la începerea joclui tancurile inamice vor începe deplasarea spre tancul jucătorului
și tragerea asupra lui când acesta este în câmpul vizual. Delimitarea posibilității d e mișcare a
tancurilor controlate de inteligența artificiala este dată de „NavMeshBoundsVolume” plasată peste
nivel , reprezentată în figura 4 .1 de partea verde plasată asupra nivelului.
Figura 4 .1 NavMeshBoundsVolume a nivelului „War Field” vedere de su s.
4.5 Meniu intermediar
Prin apăsarea tastei „Escape” va apărea meniul de pauză care va opri timpul în joc și va oferi
utilizatorului opțiunea de a continua jocul, de a accesa setările grafice ale jocului, întoarcere la
meniul de selectare a nivelului sau de a închide jocul. Meniul interm ediar este prezentat în figura
3.65.
44
Capitolul V Concluzii
5.1 Concluzii
Aplicația realizată cu engine -ul Unreal , este alcătuit din meniuri ușor de navigat, îmbină un
stil grafic minimalist cu efecte speciale apropiate de realitate. Tancul jucătorului este ușor și intuitiv
de controlat prin câteva butoane și mouse.
Realizarea jocului a fost foarte mult ușurată datorită utilizării unui engine care a fost
conceput pentru dezvoltarea de jocuri video, datorită dis ponibilității codului sursă a acestuia,
materialelor și uneltele oferite dar și documentația oferită de creatorii UE. Aceste lucruri fac ca
industria de dezvoltare a jocurilor video să fie mai accesibilă pentru programatori începători.
Un aspect foarte im portant în dezvoltarea acestui joc a fost lipsa unui designer grafic, o
echipă de minim două persoane fiind necersar pentru a realiza chiar și un proiect de mică avengură.
Jocul a fost conceput pentru platforma Windows, care are nevoie de puțin spațiu de memorie
și resurse hardware relativ minime în comparație cu specificațiile sistemelor de calcul disponibile la
ora actuală.
5.2 Evaluări de la utilizatori
Odată cu terminarea primei versiuni a jocului, acesta a fost dat spre testare, urmând ca după
prim irea părerilor să urmeze o perioadă de retușare și rezolvarea problemelor care afectează
gameplay -ul.
Persoanele selectate pentru testare au oferit informații despre comportamente neprevăzute,
probleme ale interfeței vizuale pe anumite rezoluții, dar și i deei de dezvoltări ulterioare.
Comportamente neprevăzute:
La viteză mai mare tancul avea o coliziune cu terenul ceea ce producea un comportament
incontrolabil care ulterior ducea la răstunarea tancului. Engine -ul considera modelul
tancului ca fiind umanoi d cu skeletal mesh, fiecare componentă având coliziune complexe
și coliziuni simple, rezolvarea fiind schimbarea coliziunilor componentelor tancului,
dezactivând coliziunile complexe și creerea de coliziune simplă pe corpul tancului și
șenile.
45
Figura 5 .1 Coliziunile modelului de tanc
Combinația de mișcarea înainte și stânga ambele taste fiind apăsate în același timp este
executată de tanc cu viteză mai mică decât combinația de mișcare înainte și dreapta, nu a
fost descoperită rezolvare încă pentru aceast a
Problemele de interfață vizuală apăreau la rezoluții mici, fereastra jocului fiind
neîncapătoare pentru botoanele meniului iar acestea se supra puneau, rezolvarea fiind
rearanjarea ancorelor acestora în editorul jocului.
5.3 Potențiale dezvoltări ulteri oare
Pe viitor jocul va include mai multe nivele de joc, fiecare nivel va avea altă tematică,
dezvoltarea mediului inconjurător cât și adaugarea de muzică de fundal diferită pentru fiecare nivel.
Pentru diversitate cât mai mare, se vor adauga diferite m odele de tanc, fiecare venind cu
beneficii sau dezavantaje pe câmpul de luptă, cât și implementarea posibilității de ju cătorul doi
uman. Moduri de joc jucător contra jucător sau mod cooperativ unde cei doi jucători se vor lupta
contra tancuri contr olate de inteligență artificială. Implementarea de obiecte colectabile care apar
aleatoriu pe harta, precum cutii cu muniție sau cutii care vindecă o anumită cantitate de viață
De asemenea se va mai adauga un meniu de statistică la sfârșit de joc care va afișa timpul
petrecut în sesiunea de joc ce sa terminat, acuratețea jucătorului, daunele cauzate altor jucători cât si
cele primite.
Pentru moment jocul este dezvoltat pentru platforma windows, urmând ca mai apoi să se
implementeze și pe o versiune pentru brows er-ele web, dar și alte platforme, android, iOS sau OSX.
46
Bibliografie
[1] https://en.wikipedia.org/wiki/Unreal_Engine 2017
[2] https://www.unrealengine.com/blog/ue4 -is-free 2017
[3] https://ro.wikipedia.org/wiki/Microsoft_Visual_Studio 2017
[4] https://en.wikiped ia.org/wiki/C%2B%2B 2017
[5]
https://docs.unrealengine.com/latest/INT/Programming/Development/CodingStandard/#guidelines
2017
[6]
https://docs.unrealengine.com/latest/INT/Programming/UnrealArchitecture/Reference/Properties/
2017
[7]
https://docs.unrealengine.com/latest/INT/Programming/UnrealArchitecture/Reference/Functions/
2017
[8]
https://docs.unrealengine.com/latest/INT/Programming/Development/ManagingGameCod
e/CppClassWizard/ 2017
[9] ://docs.unrealengine.com/latest/INT/Engine/Blueprints/ 2017
[10] https://docs.unrealengine.com/latest/INT/Engine/Performance/Scalability/ScalabilityReference/
[11] https://docs.unrealengine.com/latest/INT/Programming/
[12] Bjarne Stroustrup „ The C++ Programming Language, Fourth Edition”, Addison -Wesley, 2013
[13] John P. Doran: „ Unreal Engine Game De velopment Cookbook” , Packt Publishing, 2015
[14] William Sherif: „ Learning C++ by Creating Games with UE4”, Packt Publishing, 2015
[15] Peter L. Newton, Jie Feng: „Unreal engine 4 AI Programming Essentials”, Packt Publishing,
2016
[16] Aram Cookson, Rzan DowlingSoka, Clinton Crumpler: „Sams Teach Zourself Unreal Engine
4 Game development in 24 Hours” Sams, 2016
[17] Intel.com : https://software.intel.com/en -us/articles/unreal -engine -4-optimization -tutorial -part-1
, 13 feb 2017
[18] www.unrealengine.com : https://www.unrealengine.com/en -US/blog/how -to-improve -game –
thread -cpu-performance 17 oct 2014
[19] www.unrealengine.com : https://www.unrealengine.com/en -US/blog/damage -in-ue4 21 mai
2014
[20] github.com https://github.com/Allar/ue4 -style -guide
47
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: FUNDAȚIA PENTRU CULTURĂ ȘI ÎNVĂȚĂMÂNT IOAN SLAVICI [630115] (ID: 630115)
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.
