FUNDAȚIA PENTRU CULTURĂ ȘI ÎNVĂȚĂMÂNT IOAN SLAVICI TIMIȘOARA [309651]

FUNDAȚIA PENTRU CULTURĂ ȘI ÎNVĂȚĂMÂNT “IOAN SLAVICI” TIMIȘOARA

UNIVERSITATEA “IOAN SLAVICI” [anonimizat]. Mircea Vladuțiu

ABSOLVENT: [anonimizat] 2017 –

FUNDAȚIA PENTRU CULTURĂ ȘI ÎNVĂȚĂMÂNT “IOAN SLAVICI” TIMIȘOARA

UNIVERSITATEA “IOAN SLAVICI” [anonimizat]

“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 Visual 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 TankTracks 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 vizuală 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 nivelului 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 Informației

DEPARTAMENTUL Calculatoare și tehnologia informației

TEMA _________________

Proiectul de Finalizare a studiilor a student: [anonimizat]

1). Tema proiectului de finalizare a studiilor: Conceperea jocului „WarZone”

2). Termenul pentru predarea proiectului de diplomă 31. Mai. 2017

3). Elemente inițiale pentru elaborarea proiectului de finalizare a studiilor: programarea funcționalității jocului în limbajul de programare C++, Blueprint Scripting și design de nivel cu modulul Unreal Engine 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: [anonimizat], ordinograme, reprezentări grafice corespunzătoare rezultatelor.

6). Locul de documentare pentru elaborarea proiectului de diplomă: Manuale pentru programare C++ [anonimizat].

7). Data emiterii temei: 20. Oct. 2016

Coordonatori științifici

Prof. Dr. Ing. Mircea Vladuțiu

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

Titlul proiectului: Conceperea jocului „WarZone”

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

Aprecieri asupra conținutului proiectului de DIPLOMĂ (finalizare a studiilor), mod de abordare, complexitate, actualitate, deficiențe

Lucrarea se caracterizează 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ă consistentă implicând soluții atât hardware cât și software. Capitolele cuprind o descriere detaliată a modulelor software implicate.

Aprecieri asupra proiectului (se va menționa: numărul 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 bibliografice 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.

Concluzii (coordonatorul proiectului trebuie să aprecieze valoarea proiectului întocmit, relevanța studiului întreprins, competențele absolventului, rigurozitatea pe parcursul elaboră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.

Redactarea proiectului respectă ………………………………………………….cerințele academice de redactare (părți, capitole, subcapitole, note de subsol și bibliografie).

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

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. Scopul lui este relaxare și distractie între prieteni sau o singura persoana contra tancurilor 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 jocuri 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 la 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 prezenta 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 prezenta 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 jocul 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 dezvoltarea 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 prezintă ghidul utilizatorului, prezentarea 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.

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 inițial pentru jocuri first-person shooters, 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 sau 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, PlayStation 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 predefinite 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.

Tutoriale create de cei de la Epic Games.

Forumul comunitații.

Multe altele.

Figura 1.2 Șabloane predefinite.

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 partajarea 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. Sistemul de IntelliSense recunoscând funcțiile și macro-urile prezente in codul sursă al 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 derivate, 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 scrierea 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 iesire [5].

Exemple [5]:

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 (AMyActor).

Enumeratile au prefixul E (EMyEnum).

Variabilele de tip boolean au prefixul b (bIsThisTrue).

Etc…

Variabile: fața de convenția de scriere clasica 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.

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 importanț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.

Macro:

De transmiterea mesajelor in jurnalul 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 specificatori se va face in capitolul IV [7].

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 descriptiv 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 prezenta prima versiune a documentului de dezvoltare a jocului WarZone.

WarZone GDD v 1.0(@02 Feb 2017)

Fluxul jocului:

Meniu principal

Startul jocului

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:

În curs de desfașurare – atunci când un tanc inamic și tancul jucatorului sunt pe câmpul de luptă.

Joc câștigat – doar tancul jucătorului este pe câmpul de luptă.

Joc pierdut – tancul jucatorului a fost eliminat.

Status necunoscut – starea implicită.

Pauză – jocul este pe pauză și este afișat meniul intermediar.

Statusul actorilor:

Eliminat – nivelul de viata a tancului este redus la 0 sau mai puțin. Se aplică urmatoarele efecte:

Corpul tancului ramâne pe câmpul de luptă.

Efectele speciale sunt declanșate : sunet explozie și particule.

Tancul pierde comenzile de control (mișcare, tragere, țintire).

Activ – nivelul de viață a tancului este mai mare decât 0. Are toate comenzile de control.

Mecanici:

Viața – reprezintă durabilitatea tancului. Când viața tancului este redusa la 0 sau mai puțin, acesta este eliminat.

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.

Daune per proiectil – reprezinta nivelul de viață ce urmează să fie scăzut după ce un tanc a fost lovit de un proiectil.

Muniție – nivelul de muniție este finit, fiecare tanc va incepe jocul cu același numar de proiectile.

Interfața vizuală:

Elemente vizuale afișate în timpul jocului

Ținta – indică turelei și țevii tancului locul de rotire și țintire, cât si statusul de tragere:

Roz: perioadă de reîncarcare a proiectilului.

Galben: Turela sau tunul este în mișcare și dacă se trage este posibil ca proiectilul să nu ajungă la destinația dorită.

Verde: turela și tunul este statică și tragerea este mai precisă.

Roșu închis: cantitatea de muniție a ajuns la 0.

Bara de viață – afișează nivelul curent de viață a tuturor tancurilor.

Muniție – afișează cantitatea muniției rămase.

Camera jucatorului:

Camera cu vedere la persoana a-3a – permite navigare mai buna a terenului de luptă.

Camera cu vedere la persoana întâi – permite o precizie mai bună la tragere.

Meniul intermediar:

Reîntoarcere la joc.

Opțiuni – permite schimbarea rezoluției sau a nivelul calității.

Schimbarea nivelului.

Părăsire joc.

Comenzile de control asupra jocului:

Țintire – se face cu ajutorul mouse-ului pe axele X și Y.

Mișcarea tancului:

Tasta „W” mișcarea tancului înainte.

Tasta „S” mișcarea tancului înapoi.

Tasta „A” acționează șenila din partea stânga.

Tasta „D” actionează șenila din partea dreapta.

Tragere –click buton mouse stânga pentru a lansa proiectilul în direcția dorită.

Pauză:

Tasta „ESC” schimbă statusul jocului din activ în inactiv și afișează meniul intermediar.

Planarea cursorului deasupra buonului cu opțiunea dorită și click stânga pentru alegerea ei.

Active necesare:

Efecte sonore:

Sunete motorului de tanc în repaus cât și accelerare.

Tragere proiectil.

Explozie proiectil.

Explozie tanc.

Modele 3D:

Model tanc.

Model proiectil.

Efecte particule:

Explozie.

2.2 Ciclul iterativ

Figura 2.1 Graficul Ciclului iterativ

În cursul dezvoltării jocului sa folosit un ciclu iterativ, parcurgând treptat fiecare nod al acestuia. La primul 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 devenii 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 verifică 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 tancului 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 nod 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 aduse.

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 computerizată – 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

„Manage” – permite creerea și ajustarea peisajului.

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ăugarea unui material de bază pe peisajul ce urmează a fi creat.

Folosind „Location”, „Rotation”și „Scale” putem determina locația planșei.

„Section Size” este folosit de nivelul de detaliu al planșei, secțiuni mai mici permit ca nivelul de detaliu sa fie mare 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.

„Sections per Component” ajuta nivelul de detaliu al planșei, fiecare secțiune este unitatea de masură pentru nivelul de detaliu.

„Number of Components” împreună cu „section size” ajută la determinarea marimii finale a planșei. Valoarea acestuia este plafonată 32 x 32, deoarece fiecare componentă are asociat un cost asupra CPU-ului și depasirea acestei valori poate creea probleme majore de performanță.

„Overall Resolution” permite setarea numarului de noduri pe care peisajul le va utiliza. Această opțiune este utilă atunci când se încearca potrivirea unui mediu înconjurator creat extern peste peisajul creat în UE4.

„Fill World” extinde planșa pentru a umple o parte mai mare din lume.

„Create” creează nivelul cu setările selectate.

Fereastra de scluptare a terenului:

Figura 3.2 Fereastra Scluptare

„Sculpt” pornește modul de scluptare a peisajului.

„Tool” procesul de scluptare a peisajului implică folosirea uneltelor în modul de scluptare 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.

„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.

„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.

„Tool Strength” determină impactul periei asupra terenului, dacă este folosită o tableta cu senzori de presiune, presiunea cu care este apasat pe ecracul tabletei afectează puterea uneltei.

„Brush Size” determină marimea pensulei în unitatea de masură a editorului.

„Brush Falloff” determină duritatea marginilor periei.

„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

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 avem, î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 suprafete 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

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 implicite

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 claselor:

Figura 3.7 Toate clasele oferite de UE

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 accidentală.

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

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 clasă ș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 se va ocupa de starea tancului prin:

Variabile pentru determinarea:

Cantitatea de viață pe care tancul 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

Cantitatea de viață curentă, inițializat cu valoarea cantității de viață de la începutul jocului, din care se scade valoarea daunelor primite. Se definește ca proprietate Unreal cu paramentrul vizibil oriunde și numele categoriei.

Figura 3.10 Variabila cantității de viață curenta

Suprascriem funcția TakeDamage din librăria UE4, pentru a determina daunele primite.

Pentru a folosi variabila DamageAmount din funcție folosim RoundToInt din clasa FPlatformMath și stocăm valoare in variabila de tip int DamagePoints.

Pentru a determina punctele 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ță.

Daca după scaderea daunelor de aplicat din viața curentă, valoarea vieții este mai mica sau egală cu 0, tancul este considerat eliminat. și pierde controlul asupra tancului și este deposedat din modelul tancului

Figura 3.11 Funcția de determinarea daunelor primite.

3.2.3 Clasa TankAiming

Moștenită din clasa părinte Actor. Clasa Actor este clasa ș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 actorii.

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țializarea componentelor Barrel și Turret.

Sistemul de ochire: folosim funcția SuggestProjectileVelocity implementată în clasa Engine-ului UGamePlayStatistics pentru a determina punctul de pornire, velocitatea și punctul de aterizare a proiectilului.

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 de 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

Fară muniție, atunci când nivelul muniției ajunge la 0.

Reîncărcare, când timpul scurs de la ultima tragere este mai mic decât timpul de încarcare.

Țintire, dacă tunul tancului este în mișcare

Figura 3.16 Funcția de verificare a stării de tragere.

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

3.2.4 Clasa TankPlayerController

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* InPawn) 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 ajutorul 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.

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

3.2.5 Clasa TankAiController

Moșteneste funcționalitatea clasei AIController din clasa 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 TankBarrel

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 blueprint :

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.

Figura 4.27 Funcția de mișcare a țevii de tun

3.2.7 Clasa TankTurret

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 rotația turelei, valorile implicite inițializate pot fi modificate de catre designer în blueprint.

Figura 3.27 Funcția de mișcare a turelei

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 evenimentele 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 Blueprint.

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 se 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 proiectilul lovește un obiect declanșarea evenimentelor:

Figura 3.30 Generarea evenimentelor la coliziunea dintre proiectil și alt obiect.

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ă *acceleraț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 din 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 problemei 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:

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 rezolvarea 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 NavMovementComponent, 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 drumului 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

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 delimita aria pe care tancurile controlate de inteligență artificială 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ă informaț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ă doar 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

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 MoveForward() 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 AiIntention ș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 clasa blueprint.

Figura 3.41 Prezentarea ferestrei de editare Blueprint

„Components”, fereastra care prezintă componentele care formează blueprint-ul respectiv, adăugarea de componente noi sau schimbarea ierarhiei componentelor. Componentele pot fi cele standard oferite de UE, create cu ajutorul C++ sau obiectul după care este creată clasa Blueprint.

„My BluePrint” fereastra care prezintă graficele, funcții, evenimente, macro sau variabile prezente în Blueprint cu obțiunea de a adăuga la nevoie altele.

„Toolbar” bara de unelte utile în timpul utilizării blueprint-ului.

Tab-ul „Viewport” oferă vizualizarea obiectului în cauză, oferă posibilitatea de modificare a mărimii, rotirii sau a pozitiei componentelor sau a întregului ansamblu.

Tab-ul „Construction Script” rulează în urma listei de componente atunci când este creată o instanță a unei clase Blueprint.

Tab-ul „Input Setup” se ocupă de acțiunea comenzilor de intrare definite în setările proiectului sau legarea acestora de o funcție C++.

Tab-ul „Event Graph” se ocupă de evenimentele de la începerea jocului.

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 variabile definite în clase c++ și sunt definite ca variabile vizibile sau editabile în clasa Blueprint, ele vor apărea în acest tab, sub categoria creata in definirea variabilei.

„Compiler Results” afișează rezultatul compilări clasei Blueprint.

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 importate î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 tancului (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 modificarea 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 de simulare a fizicilor, masa tancului în kilograme, variabilele linear și angular damping care reglează inertia tancului.

Figura 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 obiect din categoria interfața utilizatorului, el va afișa deasupra tancurilor o bară albastră care indică viața curentă.

TankMovement și TankAiming sunt clase c++ definite ca și componente chemabile în blueprint. Această procedură se face prin definirea macro-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 tancului controlat de către jucător. Comenzile, fie combinaț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 asupra 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 intrare 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 miscarea 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).

Figura 3.46 Comenzile mișcarii axelor.

Comanda de tragere, dă naștere 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

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 controlat de jucător. interfața vizuală „MyPlayerUI” va fi prezentată ulterior.

Figura 3.50 TankPlayerController Blueprint

3.3.4 TankAiController Blueprint

Clasa blueprint care oferă designerului posibilitatea de a ajusta raza minimă la care tancurile controlate 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 designerului 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.

LaunchBlast 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.

3.3.6 WarZoneGame Blueprint

Aceasta clasa blueprint este doar pentru a spune editorului să folosească clasele create în locul celor implicite, nu conț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 interfeț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 plasate 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 ecran în același timp.

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 activarea mouseului în meniul principal

Adaugarea de eveniment la apăsarea butonului Start.

Figura 3.54 funcționalitatea butonului start din meniul principal

Adaugarea de eveniment la eliberarea butonului Quit

Figura 3.55 Funcționalitatea butonului Quit din meniul principal.

Adaugarea evenimentului de a ascunde butoanele meniului principal și afișarea submeniului de opțiuni la apasarea butonului Options.

Figura 3.56 Funționalitatea butonului Options din meniul principal

Figura 3.57 Submeniul opțiuni

Submeniul de opțiuni conține 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 texturilor 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.

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 implementate 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

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 afiș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 updatat î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 culori acesteia.

Figura 3.64 Setarea culorii punctului de tragere

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 intermediar

Butonul Resume scoate 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 principal 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.

Capitolul IV Ghidul utilizatorului

4.1 Rularea jocului

În momentul 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 meniul principal, prezentat în figura 3.52. Meniul conține în partea stânga sus numele jocului „War Zone”, pe fundal imagine reprezentativă 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 grafice 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 nivelului 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 selectarea 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.

Nivelul de joc „War Field” se desfășoară pe 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, dorind 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 textura 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 de 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 sus.

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 intermediar este prezentat în figura 3.65.

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ă disponibilităț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 important î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ă primirea 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 ideei 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 umanoid 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.

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 aceasta

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 ulterioare

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 modele de tanc, fiecare venind cu beneficii sau dezavantaje pe câmpul de luptă, cât și implementarea posibilității de jucătorul doi uman. Moduri de joc jucător contra jucător sau mod cooperativ unde cei doi jucători se vor lupta contra tancuri controlate 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 browser-ele web, dar și alte platforme, android, iOS sau OSX.

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.wikipedia.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/ManagingGameCode/CppClassWizard/ 2017

[9] https://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 Development 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

Similar Posts