This is an old revision of the document!


Tema 2 - Train Geeks

  • Responsabili: Anca Băluțoiu, Alexandra Chiper, Eduard Radu, Vlad Novetschi, Silviu Stăncioiu
  • Lansare: 16 noiembrie 2025
  • Termen de predare: 14 decembrie 2025, ora 23:59
  • Regulament: Regulament general
  • Notă: Orice informație ce nu a fost acoperită în acest document este la latitudinea voastră!

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

Detalii de Implementare Funcționalități de Bază

Observație! Funcționalitățile de bază sunt comune pentru toate cele trei mini jocuri propuse mai jos și vor trebui implementate indiferent de jocul ales.

Trenul

Construcție

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:

  • Un vagon va fi construit dintr-un paralelipiped. Acesta va merge pe patru roți, reprezentate prin câte un cilindru orizontal
  • Locomotiva va fi alcătuită din încăperea vatmanului (reprezentată de un paralelipiped vertical) și zona motorului (reprezentat de un cilindru orizontal). La rândul său, va merge pe mai multe roți, reprezentate tot de cilindri.

Control

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)

Generare Mediu Înconjurător

Teren

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

Stații

Î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.)

Șine

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

Detectarea Coliziunilor

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.

Mai multe informatii despre coliziuni si cum se pot implementa în 3D: https://developer.mozilla.org/en-US/docs/Games/Techniques/3D_collision_detection

Detalii de Implementare Funcționalități Avansate

Observație! Funcționalitățile avansate însumează 75 de puncte. Aveți libertatea să alegeți oricare dintre funcționalitățile avansate de mai jos pentru a acumula punctele, fără a fi necesară implementarea tuturor funcționalităților de la un singur tip de joc. Funcționalitățile suplimentare sunt considerate bonus. Pentru punctajele detaliate consultați baremul.

Sistem de semnalizare sau pathfinding sau relief deformat

  • Semnale luminoase care blochează/permit trenurilor accesul la intersecții.
  • Sistem de pathfinding pentru navigarea între stații.
  • Sistem de coliziune între trenuri.
  • Adăugare de munți, podișuri, câmpii. Astfel șinele vor trebui mapate pe elevația hărții

Sistem 3D de construcție a hărții (editor interactiv)

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.

UI

  • Bară de progres pentru reparații
  • Afișarea timpului de joc
  • Ecran de end game

Implementarea Split Screen

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.

Minimap

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.

Minigame 1: Rail maintenance

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

Traseu

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.m Traseul va fi format din mai multe segmente de șină și din minim 3 stații.

Avarierea șinelor

Fiecare segment trebuie să poată intra în starea “avariat” cu o probabilitate aleatorie. Segmentul avariat trebuie să fie vizual diferit prin:

  • deformare geometrică
  • schimbare de culoare / flicker / alte efecte vizuale.

Atenție! Trebuie ambele tipuri de schimbări, și de geometrie și de culoare

Dacă trenurile întâlnesc un segment avariat, acestea:

  • se opresc în fața lui
  • opțional, generează condiții speciale de joc (vezi trenul express)

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

Vehicule

Implementarea a cel puțin a două tipuri:

  • Trenuri compuse minim dintr-o locomotivă și un vagon.
  • Drezină controlată de jucător, animată. Exemplu de model 3D în imagine. Pentru animație, de exemplu, se poate considera o mișcare de balans pentru mâner.

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.

Gameplay

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

Minimap

Implementarea unui minimap 2D minimal în care să se vadă tot traseul:

  • Reprezentarea fiecărui segment printr-un simbol (de exemplu puncte sau linii).
  • Segmentele își schimbă culoarea când sunt avariate.
  • Simbol pentru poziția jucătorului pe hartă.

Cerințe avansate (la alegere)

egc/teme/2025/02.1763313885.txt.gz · Last modified: 2025/11/16 19:24 by silviu.stancioiu00
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0