This is an old revision of the document!
În cadrul temei 2, veți avea de implementat, la alegere, unul dintr-o serie de mini jocuri cu trenuri (hopefully merg mai bine ca CFR ;) ): mini metro, rail maintenance, cargo delivery.
Un tren va fi compus din minim o locomotivă și un vagon. În funcție de jocul ales, pe măsură ce avansează jocul, veți putea adăuga mai multe vagoane la tren. Atât locomotiva, cât și vagonul vor trebui construite de mână, astfel:
Trenul va merge automat și va urma traseul definit de șine. Pentru a realiza acest lucru vom considera ca acesta se misca cu viteza constanta pe sine. Considerand structura sinelor fie de Tree (daca avem bifurcatii) fie de Linked List, pentru fiecare unitate de sina trenul va interpola liniar pozitia dintre cele 2 capete ale acesteia. La finalul unei unitati de sina se va reseta animatia si se va trece la urmatoarea unitate.
Rail {
vec3 startPosition
vec3 endPosition
Rail* next / [Rail] children
}
Train {
Rail rail
float progress // 0.f to 1.f
float speed
vec3 position
}
railRoad : [Rail]
train : Train
train.progress += deltaTime * train.speed
if train.progress >= 1.f
train.progress = 0.f
train.rail = railRoad.next(train.rail)
rail = train.rail
start = rail.start
end = rail.end
train.position = lerp(start.position, end.position, train.progress)
Pentru funcționalitățile de bază ale temei, este suficient să considerați terenul fără denivelări vizuale. Va fi însă necesar să specificați relieful pe care stau șinele (de exemplu, harta poate fi alcătuită din mai multe quad-uri 2D colorate diferit și alăturate. Nu aveti nevoie de texturi, sunt suficiente culori simple. Exemplu de hartă în imagine.)
| Culoare | Relief | Șine |
|---|---|---|
| Verde | Câmpie | Normale |
| Albastru | Apă / Râu | Pod |
| Maron | Munte | Tunel |
În funcție de jocul ales, gările s-ar putea să aibă sau nu funcționalitate, dar este necesar ca în fiecare joc să se regăsească la un moment dat cel puțin trei gări diferite. Acestea pot fi reprezentate prin forme simple (paralelipiped, sferă, piramidă etc.)
Indiferent de jocul ales, traseul va include trei tipuri diferite de șină: suprafață, tunel, pod, etc. Acestea vor fi simulate printr-un aspect vizual diferit. De exemplu, segmentele de șine normale le puteți reprezenta prin paralelipipede negre, cele de șine de tip pod prin 4 paralelipipede de culori alternante alipite longitudinal, iar cele de tip tunel să fie alcătuite din 4 paralelipipede de culori alternante alipite transversal).
Indiferent de jocul ales, va trebui la un moment dat să simulați coliziuni între tren și diverse obiecte (de exemplu, trenul oprește în stație, drezina ajunge în punctul în care trebuie să repare șina, macaraua trebuie să ridice un pachet). În cazul acesta va trebui să implementați un sistem de coliziuni 3D. Astfel, puteți aproxima toate obiectele printr-un paralelipiped aliniat cu axele.
Puteti considera un volum 3d in care statiile, obstacolele si sinele se pot afla oriunde. Lumea poate fi reprezentata ca un grid3D sau Octree, in care fiecare casuta din grid poate contine fie o statie, fie o sina, fie un obstacol. Sinele pot fi vazute ca niste tuburi intre planete (sa le numim găuri negre; in a galaxy far far away) și pot fi reprezentate ca simple paralelipipede ce unesc 2 celule vecine din grid. Stațiile vor fi planete și vor reprezentate prin cuburi și/sau sfere.
Pentru a implementa split screen, va trebui să păstrați datele pentru două sau mai multe trenuri. Perspectiva fiecărui jucător va fi randată folosind un viewport dedicat: pentru primul jucător, viewport-ul va fi plasat în jumătatea stângă a ecranului, iar pentru cel de-al doilea jucător, se va folosi o altă cameră și viewport-ul va fi setat în jumătatea dreaptă a ecranului. Fiecare jucător va avea taste de control diferite. Indiferent de jocul ales, câștigător va fi jucătorul care rezistă cel mai mult în joc.
Pentru implementarea unui minimap, cea mai simplă variantă este ca, după ce ați desenat restul scenei, să curățați bufferul de adâncime (depth buffer) și să randati din nou scena folosind o cameră ortografică poziționată deasupra scenei, mutând viewport-ul într-un colț al ecranului. Pentru a face mai ușor de urmărit minimapul, puteți randa diferit elementele de interes: de exemplu, trenul ca o săgeată, șinele ca o linie, iar în funcție de specificul jocului, orice alt element va fi reprezentat printr-un simbol stabilit de voi.
În acest joc, traseul trenurilor este avariat în permanență iar jucătorul — în rolul unui mecanic — trebuie să parcurgă traseul cu o drezină pentru a repara șinele deteriorate. Traseul poate include porțiuni la suprafață, subterane sau suspendate, iar trenurile circulă automat pe acest traseu. Scopul jocului este menținerea caii ferate în stare funcțională cât mai mult timp posibil.
Implementarea unui track predefinit, cu un minim de 2 curbe. Se consideră curbă orice schimbare de direcție a traseului cu 90 de grade. Acesta nu se va schimba pe durata jocului. Traseul va fi format din mai multe segmente de șină și din minim 3 stații.
Fiecare segment trebuie să poată intra în starea “avariat” cu o probabilitate aleatorie. Segmentul avariat trebuie să fie vizual diferit prin:
Dacă trenurile întâlnesc un segment avariat, acestea:
Șinele se pot strica în mod continuu pe toată durata jocului (de exemplu – la fiecare 60 de secunde se verifică dacă vreun fragment s-a stricat). Segmentele reparate se pot strica din nou.
Implementarea a cel puțin a două tipuri:
Deplasarea trenurilor trebuie să fie autonomă, urmând traseul fără intervenția jucătorului. În varianta de bază nu se va ține cont de coliziuni între trenuri.
Trenurile au o stație destinație la care trebuie să ajungă. În varianta de baza trenurile circulă aleator pe traseu pana ajung în stația destinație. Când ajung în stație, vor staționa o perioada scurta de timp și vor primi o nouă destinație random.
Drezina va fi controlată din taste (de exemplu WASD pentru mișcare față/spate stânga/dreapta).
Deplasarea drezinei nu este afectata de trenuri. (Nu trebuie sa aștepte după ele, poate trece prin ele)
Camera va fi de tip TPS și va urmări drezina de sus din spate.
Scopul jucătorului este să mențină trenurile în mișcare cât mai mult timp prin repararea segmentelor afectate. Când drezina se află suficient de aproape de un segment avariat, jucătorul poate declanșa o acțiune de reparare – cât timp este în raza acestuia și apasă tasta F șina se va repara instant. Reparația readuce segmentul la forma și culoarea inițială. Trenurile pot circula din nou peste segmentul reparat. Jocul se termină fie când un tren așteaptă prea mult în fața unei avarii (de ex. peste 30 de secunde), fie când există prea multe segmente avariate simultan (de ex. mai mult de 50% din traseu este avariat).
Implementarea unui minimap 2D minimal în care să se vadă tot traseul:
Cerințe avansate (la alegere)
Scopul acestui joc este acela de a prelua pasageri de la stația la care se află și de a-i duce la stația în care își doresc.
Inițial, în scenă se vor afla 2 statii. La anumite momente de timp o nouă stație va apărea la o poziție aleatoare. Jucătorul va putea adăuga diferite tipuri de șină astfel încât să corespundă cu relieful hărții.
În fiecare stație, la un anumit interval de timp va apărea câte un pasager care va dori să ajungă la o altă stație aleatoare. În acest sens, fiecare gară va fi reprezentată sub forma unui simbol geometric (de exemplu, piramidă, paralelipiped, cilindru, sferă etc.). Toate gările vor avea aceeași culoare (de exemplu, mov). Toți pasagerii vor fi colorați în aceeași culoare (de exemplu, verde). Fiecare pasager va fi reprezentat de gara în care dorește să ajungă (de exemplu, un pasager care dorește să ajungă într-o gară paralelipiped va fi reprezentat sub forma unui paralelipiped mai mic).
Trenul se va mișca automat, iar scopul jucătorului va fi să plaseze șine de tren astfel încât să conecteze gările într-un mod cât mai eficient. Jocul se va termina în momentul în care o gară va fi prea aglomerată (de exemplu, vor fi mai mult de 10 pasageri în gară). Pentru a ilustra gradul de ocupare al gării la un anumit moment de timp culoarea acesteia va varia în shader (pornind de la culoarea sa de bază pâna la un roșu intens).
Implementarea unui minimap 2D minimal în care să se vadă tot traseul:
În acest tip de joc va exista o gară centrală care va emite comenzi. În plus, vor exista o serie de alte câteva gări de unde se vor putea prelua resursele necesare pentru a îndeplini comanda. Trenul se va mișca automat, dar harta va fi construită astfel încât să existe cel puțin trei intersecții diferite între șine. La fiecare intersecție jucătorul va trebui prin apăsarea tastelor WASD să aleagă direcția în care va merge trenul astfel încât să reușească să ia toate materialele într-un timp limită de un minut.
În scenă se va afla gara centrală și cel puțin alte 3 gări de resurse. Gările de resurse vor avea forme și culori diferite (de exemplu, paralelipiped, sferă, piramidă etc.) în funcție de resursa care poate fi colectată din ele. Gările vor fi conectate între ele prin șine, dar nu direct, ci prin cel puțin 3 intersecții diferite.
Gara centrală va emite o comandă de resurse. Fiecare resursă va avea asociată o culoare și o formă unică. Comanda emisă de gara centrală va fi compusă din 5 resurse aleatorii care se pot repeta. Acestea se vor plasa în dreptul gării centrale (pentru a știi comanda) sub forma unei liste. Când una din resurse este colectată ea va dispărea din listă. O resursă colectată dintr-o gară ea se va regenera după o perioadă de timp (de ex. 5 secunde).
Trenul se va mișca automat, iar scopul jucătorului va fi să selecteze la fiecare intersecție direcția de mers a trenului. Comanda trebuie terminată într-un minut. După ce toate resursele din comandă au fost colectate, trenul trebuie să se întoarcă la gara centrală, moment în care se va genera o altă comandă. Jocul se va termina în momentul în care jucătorul nu completează comanda în timp util. Pentru a ilustra timpul rămas pentru livrarea comenzii, culoarea gării centrale va varia în shader (pornind de la culoarea sa de bază pâna la un roșu intens).
Implementarea unui minimap 2D minimal în care să se vadă tot traseul:
Exemplu 1: daca implementati complet jocul shooter, si adaugati si un mod de joc tip capture the flag care implementează și toate functionalitatile de la jocul de livrari, veți avea punctajul maxim (75 p / 3 = 25p bonus)
Exemplu 2: implementand jocul de curse fără split-screen dar cu cele două moduri de control avansate (- 20p + 15p + 20p) veți obține 15p/3 = 5p bonus.
Pentru întrebări vom folosi forumurile de pe moodle. Orice nu este menționat în temă este la latitudinea fiecărui student!
Baremul este orientativ. Fiecare asistent are o anumită libertate în evaluarea temelor (de exemplu, să dea punctaj parțial pentru implementarea incompletă a unei funcționalități sau să scadă pentru hard coding). Același lucru este valabil atât pentru funcționalitățile obligatorii, cât și pentru bonusuri.
Tema va fi implementată în OpenGL și C++. Este indicat să folosiți framework-ul și Visual Studio.