This is an old revision of the document!
Tema 1: Geometry Wars
Responsabil: Gabriel Ivanica
Perioada de lucru: 31 Octombrie - 13 Noiembrie (2 saptamani)
Termen de predare: 13 Noiembrie 2016, 23:59
Depunctare intarziere: 2.5p/zi pana la maxim 40p din totalul de 100p
Enunt
Scopul temei este implementarea unui joc simplu ce presupune utilizarea conceptelor invatate in primele 3 laboratoare:
Utilizarea evenimentelor de tastatura si mouse
Definirea si incarcarea de meshe simple in OpenGL
Utilizarea transformarilor 2D: translatie, scalare, rotatie
Sa se implementeze un joc OpenGL in care utilizatorul are posibilitatea de a controla o nava spatiala in 2D astfel:
prin intermediul tastelor W, A, S, D (sau orice alte 4 taste) nava se poate misca sus/jos/stanga/drapta pe cele 2 axe OX / OY
positia mouse-ului pe ecran va determina rotirea navei controlate in acea directie
O serie de inamici (kamikaze) vor aparea pe ecran la un interval de timp de 2 secunde. Acest interval se va micsora constant pe parcursul jocului pana la valoarea de 0.5 secunde.
Initial nava spatiala controlata de utilizator este plasata in centrul ecranului. Iar toti inamicii vor aparea pe un cerc virtual in jurul utilizatorului (cercul sa aiba o raza astfel incat inamicii sa apara aproape de marginea ecranului). Pozitiile de pe cerc ale inamicilor sunt generate aleatoriu.
Fiecare inamic are urmatoarele proprietati:
viteza de deplasare aleatorie:
numarul de vieti (1 sau 2) - generat aleatoriu
culoare in functie de numarul de vieti astfel:
Fiecare inamic se roteste dupa pozitia navei utilizator si se deplaseaza spre acesta (cu viteza random aleasa). Atunci cand un inamic intra in coliziune cu nava player se scade 1 viata iar inamicul este distrus.
Nava controlata de utilizator are posibilitatea de a trage cu proiectile. Proiectilele au o viteza de deplasare mult mai mare ca nava spatiala. Atunci cand utilizatorul va apasa CLICK STANGA pe mouse se va lansa un proiectil in directia cursorului de pe ecran. Acesta va continua sa se deplaseze in aceasi directie atat timp cat nu are loc o coliziune cu o nava inamica.
Pentru coliziune puteti sa folositi cea mai simpla varianta de testare de coliziune, sfere ↔ sfera, folosind dimensiunea dimensiunea relativa a fiecarui obiect.
Nava principala are initial 3 vieti. Acestea vor fi afisate in coltul din dreapta sus prin intermediul unor simple depretunghiuri ca in exemplul dat.
Atunci cand numarul de vieti ale navei ajunge la 0, jocul se va sfarsi iar fundalul ecranului se va colora cu rosu printr-o animatie de 2 secunde, plecand de la culoarea initiala negru.
Geometrie
Observatii
Culorile date sunt orientative. Puteti sa folositi ce culori doriti atat timp cat se vede clar distinctia dintre culori.
Este recomandat sa folositi un spatiu logic de definire a geometriei asa cum este prezentat in
Laborator3_Vis2D
Puteti sa porniti de la o orice laborator doriti sau sa va generati o clasa asemanatoare cu cele de laborator.
Plecand de la pozitia mouse-ului in pixeli si stiind spatiul logic utilizat, puteti sa calculati pozitia logica a cursorului pentru a roti corespunzator nava utiliator
Timpul global(in secunde) de la inceputul jocului este returnat de functia statica: Engine::GetElapsedTime()
Folositi OOP
Exemplu: Nava utilizator si inamicii pot fi instante ale unor obiecte Enemy, Player ambele ce extind GameObject.
mentineti starea obiectelor: pozitie, scalare, rotatie, culoare, vieti, etc ca si membri ai clasei
pe baza pozitiei, scalarii si rotatiei calculati de fiecare data matricea de modelare ce trebuie folosita la desenare
-
Pentru a randa un obiect folosind o culoare anume aveti disponibila functia urmatoare:
void RenderMesh2D(Mesh * mesh, const glm::mat3 &modelMatrix, const glm::vec3 &color) const;
Geometria obiectelor trebuie generata si incarcata manual de voi asa cum s-a invatat in laboratorul 2. Nu aveti voie sa folositi functia Mesh::LoadMesh()
pentru a incarca obiecte 2D/3D din fisier.
Framework-ul contine in /libs/Engine/Component/Transform o clasa numita Transform
. Nu aveti voie sa o folositi. Transformarile de rotatie/scalare/translatie trebuie facute asa cum s-a invatat in laboratorul 3. Si, da! Puteti sa folositi Transform2D.h.
Exemplu rezolvare
Barem notare
Respectarea geometriei specificate pentru proiectil si nave [10p]
Miscarea navei utilizatorului pe ecran folosind tastatura [10p]
Rotirea navei dupa mouse [10p]
Generare navelor inamice in jurul player-ului [5p]
Deplasare corecta a inamicilor (sa urmareasca playerul / rotatie corecta) [15p]
Generarea corecta a proiectilelor (deplasare, rotatie) [10p]
Coliziunea proiect ↔ inamic, inamic ↔ nava utilizator [10p]
Animatia scalarea inamic cand pierde o viata + schimbarea culorii + dublarea vitezei [10p]
Animatie culoare ecran la finalul jocului [10p]
Afisarea pe ecran in coltul dreapta sus a numarului de vieti ale navei [5p]
README [5p]
Total : 100 pct
README-ul trebuie sa respecte urmatoarea structura
Nume, prenumne, grupa si serie
Utilizare aplicatie - taste/mouse/stari/etc
Detalii de implementare - clase/structura
Probleme aparute
Continutul arhivei (optional)
in cazul in care sunt necesare detalii importante despre structura proiectului, precum existenta unor fisiere speciale, fisiere de configurare, resurse de proiect, etc
Status implementare functionalitati si descriere bonus (in caz ca exista)
Bonusuri posibile
Inamici diversi:
Un inamic in jurul caruia se invart 2 sateliti iar utilizatorul trebuie sa distruga sateltii acestuaia mai intain pentru a putea distruge inamicul (~10p)
Inamic care atunci cand este distrus se genereaza 2 inamici mai mici (la distanta unul de celalalt)
Boss enemy: inamic (mare) capabil sa traga cu proiectile catre nava utilizator si are viata foarte mare, se misca doar stanga dreapta de exemplu. Considerati ca dupa ce au fost omorati 100 de inamici simpli nu mai apare nici un alt inamic, urmand ca inamicul principal sa apara din marginea de sus a ecranului (~15p)
obiecte cadou ce diverse abilitati, exemple (implementati cel putin 2-3) (~15p)
viata in plus
invincibilitate pentru N secunde (sa se schimbe culoarea jucatorului)
scut pentru 1 coliziune (sa fie desenat un cerc in jurul navei utilizator)
posibilitatea de a trage cu mai multe proiectile si in directii diferite
orice nu e specificat si considerati ca poate reprezenta un bonus de implementare
-
Bonusul se acorda doar daca cerintele de baza ale temei sunt implementate corect
Notarea bonusului este la latitudinea asistentului si a calitatii implementarii, nu exista barem dar in principiu se pot accorda 5, 10, 15 pct
Pentru implementari foarte speciale bonusul acordat poate ajunge pana la maxim 25 pct
Bonusul nu este conditionat de trimiterea la timp a temei. Puteti obtine bonus chiar daca ati trimis tema cu intarziere.
Arhivarea proiectului
O data cu postarea temei au fost facute modificari si in repositoriul proiectului. Daca folositi surse/resurse
mai vechi de 29 octombrie puteti sa intampinati probleme atat la compresia temei cat si la existenta functiei
RenderMesh2D
pe baza de culoare.
Recomandam sa inlocuiti folderul /Resources cu versiunea cea mai noua, ori sa il stergeti cand faceti arhiva intrucat inainte de 29 octombrie continea resurse tip imagine de dimensiuni considerabile ce ingreuneaza sau face imposibila obtinerea unei arhive de sub 20MB.
in mod normal arhiva trebuie sa contina toate resursele necesare compilarii si rularii
inainte de a face arhiva asigurativa ca ati dat clean la proiect
click dreapta pe proiect in Solution Explorer → Clean Solution, sau
stergeti folderul /Visual Studio/obj
stergeti fisierul /Visual Studio/Framework_EGC.sdf (in caz ca exista)
stergeti fisierul /Visual Studio/Framework_EGC.VC.db (in caz ca exista)
stergeti folderul /x64 sau /x86 (in caz ca exista)
in ca ca arhiva tot depaseste limita de 20MB (nu ar trebui), puteti sa stergeti si folderul /libs sau /Resources intrucat se pot adauga la testare. Nu este recomandat sa faceti acest lucru intrucat ingreuneaza mult testarea in cazul in care versiunea curenta a librariilor/resurselor difera de versiunea utilizata la momentul scrierii temei.
E
imposibil sa aveti o arhiva mai mare de 20 de
MB daca respectati indicatiile de mai sus si faceti arhiva folosind o compresie relativ buna! Sigur faceti ceva gresit daca va da peste 20 de
MB.
Rezultate aproximative la compresie (arhiva include atat
/libs cat si
/Resources):