This is an old revision of the document!
În cadrul acestei teme veți avea de realizat un editor de construcție a unei nave spațiale, pe care o veți utiliza în cadrul unul joc ales de voi din cele 3 tipuri de joc (pong, breakout și space invaders).
La începutul jocului jucătorul va proiecta propria navă folosind un editor. Editorul va arată în felul următor.
Nava este formată din blocuri de 1×1 așezate pe o grilă. În partea stângă a editorului se află celule ordonate vertical, câte una pentru fiecare tip de bloc. Grila în care jucătorul proiectează nava se află în partea din dreapta jos a ferestrei și este de dimensiuni minim 5×5. În dreapta sus se află o bară orizontală în care se află pătrate verzi ce reprezintă numărul de blocuri pe care îl mai poate așeza jucătorul pe grila pentru construcția navei spațiale (nava are maxim 10 blocuri). În colțul din dreapta sus se află butonul pentru începerea jocului (numit buton start).
Fiecare bloc este de dimensiuni 1×1 dar conțin elemente decorative care pot să fie în afara blocului. Orice bloc care nu este folosit în jocul pe care alegeți să îl implementați poate să lipsească din editor.
Culorile vârfurilor modelelor 2D sunt la alegerea voastră cât timp elementele distincte (pătrate, flăcări, arcuri de cerc, țeava tun) din fiecare model au o culoare diferită.
Pentru a asigura corectitudinea navei și pentru a nu suprapune elementele decorative editorul trebuie să verifice următoarele constrângeri înainte de a porni jocul:
Acțiunea de construcție a vehiculului se realizeaza printr-un proces de drag&drop după următorii pași:
În momentul în care se apasă butonul dreapta de la mouse când cursorul se află într-una din celulele grilei care conține deja un bloc, acel bloc este scos din celulă și nu se mai afișează.
Butonul de start va avea culoarea verde cât timp vehiculul proiectat respectă constrângerile, roșu altfel. Pentru a începe jocul, jucătorul dă un click pe butonul de start verde. Nava proiectată este copiată și folosită în joc.
Jocul Pong este unul dintre cele mai simple și iconice jocuri video din istorie, reprezentând o simulare minimalistă a unui meci de tenis de masă. Scopul jocului este ca fiecare jucător să controleze o paletă (o bară verticală) care se deplasează pe axa verticală, pentru a respinge o bilă care se deplasează continuu între cele două părți ale ecranului. Fiecare jucător încearcă să împiedice mingea să treacă de propria paletă, iar când acest lucru se întâmplă, adversarul primește un punct. Câștigă jucătorul care ajunge primul la un număr prestabilit de puncte.
Scopul principal al jocului este ca fiecare jucător să evite trecerea mingii dincolo de propria paletă și, simultan, să trimită mingea în așa fel încât adversarul să nu o poată returna. Fiecare dată când mingea trece de un jucător, adversarul primește un punct. Jocul se reia imediat, mingea fiind resetată în centrul ecranului și pornind în direcția jucătorului care a pierdut punctul anterior.
Jocul continuă până când unul dintre jucători atinge un scor prestabilit (de exemplu, 10 puncte), moment în care acesta este declarat câștigător, iar jocul se oprește
Desenare scenă: Două palete, bila, linii de delimiatare ale terenului, o linie punctată în mijlocul tablei și scorul jucătorilor (poate fi desenată fie ca o serie de bile fie ca text pe ecran)
Control paletă: Un jucător folosește tastele W și S, celălat foloseste tastele ↑ și ↓. Paletele nu pot depăși marginile superioare și inferioare ale ecranului.
Coliziuni: Bila este un cerc și blocurile paletelor sunt AABB(axis-aligned bounding boxes). La contactul bilei cu marginile stânga și dreapta ale hărții un gol este înregistrat. La contactul bilei cu marginile sus și jos componenta verticală a vitezei își schimbă semnul, simulând o reflexie perfect elastică.
La contact cu paletele bila are direcția de mișcare modificată în funcție de punctul de contact, pentru a permite jucătorilor să ghideze bila în direcția dorită. Matematic, putem calula astfel:
Resetarea bilei: Atunci când un gol este detectat, se incrementează scorul jucătorului care a dat gol, mingea este resetată în centru și viteza ei este inversată (pentru a porni spre jucătorul care a dat gol).
Creșterea vitezei bilei: la fiecare ricoșeu a bilei de o componentă de tip bumper. Bumperul este aproximat cu un dreptunghi.
Animație paletă: la coliziune cu bila. Animația este una de scalare înainte-înapoi pe verticală și/sau orizontală timp de o secundă.
Lansare de bile. Această cerință înlocuiește cerința de bază Resetarea bilei. Se va folosi componenta tun pentru a lansa bile noi în scenă. Când începe o nouă rundă de joc din fiecare tun va fi lansată o bilă. Bilele sun tratate separat și runda se termină atunci când toate bilele sunt în porțile jucătorilor.
Jocul Breakout este un clasic al genului arcade, bazat pe mecanica de distrugere a unui perete format din cărămizi colorate, folosind o bilă care ricoșează între limitele ecranului. Jucătorul controlează o paletă amplasată în partea inferioară a scenei, pe care o poate deplasa orizontal pentru a respinge bila și a o direcționa către cărămizi. La fiecare impact, o cărămidă este distrusă, iar jucătorul primește puncte. Obiectivul principal este eliminarea tuturor cărămizilor de pe ecran fără a pierde mingea. Dacă bila cade sub paletă, jucătorul pierde o viață, iar jocul se reia din poziția inițială. Breakout combină precizia, reflexul și planificarea unghiului de lovire, oferind o experiență de joc simplă, dar captivantă și dinamică.
Scop și logică de progres: Jucătorul începe partida cu 3 vieți. De fiecare dată când bila ajunge sub paletă, o viață este pierdută, iar bila și paleta se resetează în pozițiile inițiale. La distrugerea unei cărămizi, se adaugă un punct. Jocul se termină când jucătorul pierde toate viețile sau când sunt distruse toate cărămizile de pe ecran.
Desenare scenă: Pe ecran se va desena nava cu paleta, împreună cu un grid alcătuit din blocuri colorate care reprezintă cărămizile destructibile. În partea superioară sau laterală vor fi afișate inimile care indică numărul de vieți rămase. Scorul va fi scris fie în consolă, fie direct pe ecran prin intermediul componentei text renderer.
Control paletă: Paleta se află în josul ecranului și se deplasează folosind tastele ← și →.
Eliberarea bilei: La începutul jocului bila este lipită de marginea de sus a paletei. La apăsarea tastei SPACE bila va fi lansată în sus pe o direcție oblică (45°).
Coliziuni Bila este de formă circulară, iar componentele paletei vor fi aproximate cu AABB (axis-aligned bounding boxes)
Animație spargere cărămizi: Când se sparge o cărămidă aceasta va deveni din ce în ce mai mică până când dispare de tot. Cărămizile care sunt în proces de distrugere nu influențează bila.
Cărămizi rezistente: Pentru a distruge o cărămidă este necesar să fie atins de mai multe ori de bilă sau de un proiectil. Se vor desena cărămizile în culori diferite. Fiecare culoare indică câte lovituri mai sunt necesare pentru a distruge cărămida.
Jocul Chicken Invaders este de tipul Shoot'em up și are ca scop distrugerea tuturor inamicilor pe ecran folosind nava spațială.
Inamici: La începutul jocului va fi prezentă o formație de inamici de cel puțin 2 linii pe 5 coloane. Fiecare inamic va coborî încet și în același timp va trage periodic un proiectil în josul hărții.
Inamicii vor avea următorul aspect:
Pentru bonus se poate folosi următorul aspect:
Comportament de bază jucător: Nava jucătorului se mișcă stânga-dreapta și folosind Space va trage din tunurile sale proiectile. Viteza jucătorului depinde de numărul de blocuri de tip motor prezente în vehicul.
Coliziuni
Coborâre sinusoidală a inamicilor: Pe măsură ce inamicii coboară, aceștia se vor mișca și stânga-dreapta într-un mod sinusoidal
Sistem valuri: Când toți inamicii sunt distruși pe ecran, după încă 5 secunde, alți inamici vor fi creați în scenă. Acești noi inamici vor fi mai rapizi decât cei precedenți (coboară mai repede, trag mai des și proiectilele lor vor fi mai rapide)
Mișcare verticală a jucătorilor: Se permite folosirea celor patru taste săgeți (↑←↓→) pentru a mișca jucătorul.
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.