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

Exemplu rezolvare tema: Geometry Wars

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
    • atunci cand mouse-ul se misca nava se va roti in directia mouse-ului

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:
    • viteza ar trebui sa fie mai mica decat cea a navei controlate de utilizator
  • numarul de vieti (1 sau 2) - generat aleatoriu
  • culoare in functie de numarul de vieti astfel:
    • daca inamicul are initial 1 viata atunci va avea culoarea albastru
    • daca inamicul are initial 2 vieti atunci va avea culoarea galben
      • atunci cand inamicul cu 2 vieti pierde o viata:
        • culoarea acestuia se va modifica intr-o alta culoare; in exemplu prezentat, rosu
        • nava inamica se va scala la jumatate printr-o animatie ce dureaza aproximativ 250ms

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

  • Navele sunt formate din unirea a 2 triunghiuri asa cum se poate vedea si in exemplul dat
  • Proiectilele si vietile utilizatorului sunt niste patrate/dreptunghiuri scalate corespunzator

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
  • Documentatia pentru evenimentele de mouse/tastatura se gaseste in fisierul /Core/Window/InputController.h
  • 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

  1. Nume, prenumne, grupa si serie
  2. Utilizare aplicatie - taste/mouse/stari/etc
  3. Detalii de implementare - clase/structura
  4. Probleme aparute
  5. 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
  6. Status implementare functionalitati si descriere bonus (in caz ca exista)

Arhivarea proiectului

  • 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 ExplorerClean 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)
    • executabilul final este generat in folderul /x86 sau /x64 la finalul link-editarii in functie de arhitectura aleasa la compilare (32/64 biti)
  • 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

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
  • Referinta pentru inspiratie: Geometry Wars

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

egc/teme/01.1478983267.txt.gz · Last modified: 2016/11/12 22:41 by gabriel.ivanica
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