This shows you the differences between two versions of the page.
egc:teme:2021:01 [2021/10/28 13:34] anca.morar |
egc:teme:2021:01 [2021/11/14 15:41] (current) anca.morar |
||
---|---|---|---|
Line 1: | Line 1: | ||
==== Tema 1 - Survival Shooter ==== | ==== Tema 1 - Survival Shooter ==== | ||
- | In cadrul temei 1 se va implementa un shooter survival simplu cu camera top-down in care jucatorul trebuie sa distruga cat mai multi inamici. | + | In cadrul temei 1 se va implementa un survival shooter simplu cu camera top-down in care jucatorul trebuie sa distruga cat mai multi inamici, inainte sa moara. |
=== Jucatorul === | === Jucatorul === | ||
- | Jucatorul este reprezentat de catre niste primitive geometrice (minimum 3), pozitionate sugestiv, astfel incat directia in care priveste jucatorul sa fie clara. Un exemplu este cel din figura 1 de mai jos, in partea stanga, in care jucatorul priveste in jos. | + | Jucatorul este reprezentat de cateva primitive geometrice (minimum 3), pozitionate sugestiv, astfel incat directia in care priveste jucatorul sa fie clara. Un exemplu este cel din figura de mai jos, in partea stanga, in care jucatorul priveste in jos. |
+ | Directia in care priveste utilizatorul este data de cursorul mouse-ului. Acest lucru se poate observa de asemenea in figura de mai jos, unde sunt prezentate doua orientari diferite ale personajului, in functie de pozitia cursorului mouse-ului. | ||
Acesta se deplaseaza pe axele X și Y (sus, stanga, jos, dreapta), cu tastele W, A, S, D. | Acesta se deplaseaza pe axele X și Y (sus, stanga, jos, dreapta), cu tastele W, A, S, D. | ||
- | Directia in care priveste utilizatorul este data de cursorul mouse-ului. Acest lucru se poate observa in figura de mai jos, unde sunt prezentate doua orientari diferite ale personajului, in functie de pozitia cursorului mouse-ului. | ||
- | |||
- | {{ :egc:teme:2021:tema.png?nolink&400 |}} | ||
+ | {{ :egc:teme:2021:tema.png?nolink&350 |}} | ||
=== Harta === | === Harta === | ||
Line 20: | Line 19: | ||
Jucatorul nu poate sa iasa din harta. Harta trebuie sa fie mai mare decat fereastra de afisare. | Jucatorul nu poate sa iasa din harta. Harta trebuie sa fie mai mare decat fereastra de afisare. | ||
- | {{ :egc:teme:2021:tema_poza2.png?nolink&450 |}} | + | {{ :egc:teme:2021:tema_poza2.png?nolink&550 |}} |
Pe harta vor fi si alte obstacole, reprezentate prin dreptunghiuri scalate diferit, prin care jucatorul nu poate sa treaca. | Pe harta vor fi si alte obstacole, reprezentate prin dreptunghiuri scalate diferit, prin care jucatorul nu poate sa treaca. | ||
=== Proiectilele === | === Proiectilele === | ||
- | Jucatorul poate sa traga cu proiectile reprezentate prin dreptunghiuri negre. | + | Jucatorul poate sa traga cu proiectile reprezentate prin dreptunghiuri negre (la click stanga cu mouse-ul). |
- | Proiectilele vor fi lanstate din pozitia jucatorului, in directia in care jucatorul priveste (data de cursorul mouse-ului). Traiectoria acestora va liniara, iar viteza de deplasare, constanta. In momentul coliziunii cu un inamic, proiectilul va fi distrus (va disparea). De asemenea, inamicul va disparea, iar jucatorul va castiga un numar de puncte. | + | Proiectilele vor fi lanstate din pozitia jucatorului, in directia in care jucatorul priveste (data de cursorul mouse-ului). Traiectoria acestora va liniara, iar viteza de deplasare, constanta. Ele vor fi de asemenea rotite in functie de directia de tragere. In momentul coliziunii cu un inamic, proiectilul va fi distrus (va disparea). De asemenea, inamicul va disparea, iar jucatorul va castiga un numar de puncte. |
Proiectilele nu pot trece prin obstacole. Astfel, la intalnirea unui obstacol sau al unui perete al hartii, proiectilele dispar. | Proiectilele nu pot trece prin obstacole. Astfel, la intalnirea unui obstacol sau al unui perete al hartii, proiectilele dispar. | ||
Arma jucatorului are o distanta maxima de tragere, astfel ca dupa parcurgerea unei anumite distante, un proiectil dispare, chiar daca nu a intalnit un inamic. | Arma jucatorului are o distanta maxima de tragere, astfel ca dupa parcurgerea unei anumite distante, un proiectil dispare, chiar daca nu a intalnit un inamic. | ||
+ | Arma jucatorului are si un "fire rate" maxim. Astfel, jucatorul va putea lansa proiectile in mod succesiv dupa o regula de timp (de exemplu, nu va putea trage un proiectul decat o data la minim 0.5 secunde). | ||
+ | Animatia de mai jos prezinta un exemplu in care jucatorul trage cu proiectile. | ||
+ | |||
+ | {{ :egc:teme:2021:egc-t1-shooting-demo.gif?direct&300 |}} | ||
=== Camera === | === Camera === | ||
- | Camera va urmari in permanenta jucatorul. Astfel, jucatorul va fi afisat in permanenta in centrul ferestrei de afisare. | + | Camera va urmari in permanenta jucatorul (jucatorul va fi desenat tot timpul in centrul ferestrei de afisare). In video-ul de mai jos puteti vedea un exemplu de harta, in care spatiul logic se deplaseaza impreuna cu jucatorul. Animatia aceasta nu prezinta ce se vede pe ecran (in fereastra de afisare). In fereastra de afisare se va vedea numai ce este inclus in viewport. |
+ | |||
+ | {{ :egc:teme:2021:egc-t1-viewport-demo-2.gif?direct&300 |}} | ||
=== Inamicii === | === Inamicii === | ||
Inamicii se reprezinta tot prin forme geometrice simple, dar cu alte culori/primitive, astfel incat sa se diferentieze fata de jucator. De exemplu, daca jucatorul este format din cercuri crem, asemenea figurii, inamicii pot fi reprezentati prin aranjamente de patrate rosii. | Inamicii se reprezinta tot prin forme geometrice simple, dar cu alte culori/primitive, astfel incat sa se diferentieze fata de jucator. De exemplu, daca jucatorul este format din cercuri crem, asemenea figurii, inamicii pot fi reprezentati prin aranjamente de patrate rosii. | ||
- | Inamicii se vor crea incontinuu de-a lungul jocului, fie cate unul pe rand (de exemplu, sa apara un inamic nou la 3 secunde), fie in valuri (de exemplu, sa apara 5 inamici noi la 10 secunde). Fiecare inamic are o viteza diferita de deplasare. Pozitiile unde apar inamicii si vitezele acestora se pot stabili aleator sau se pot calcula dupa diferite reguli, dar nu trebuie sa fie hardcodate). | + | Inamicii se vor crea incontinuu de-a lungul jocului, fie cate unul pe rand (de exemplu, sa apara un inamic nou la 3 secunde), fie in valuri (de exemplu, sa apara 5 inamici noi la 10 secunde). Fiecare inamic are o viteza diferita de deplasare. Pozitiile unde apar inamicii si vitezele acestora se pot stabili aleator sau se pot calcula dupa diferite reguli, dar nu trebuie sa fie hardcodate. |
Inamicii dispar cand sunt loviti de un proiectil al jucatorului. | Inamicii dispar cand sunt loviti de un proiectil al jucatorului. | ||
Inamicii trebuie sa urmareasca incontinuu jucatorul. | Inamicii trebuie sa urmareasca incontinuu jucatorul. | ||
Inamicii pot trece prin obstacole. | Inamicii pot trece prin obstacole. | ||
- | === Gameplay === | ||
- | Arcul jucatorului se afla in partea stanga a scenei. Arcul se poate deplasa doar pe axa OY, prin apasarea tastelor W, S. Directia de tragere a arcului se poate ajusta prin miscarea mouse-ului. Arcul va fi mereu rotit astfel incat sageata se va deplasa catre pozitia curenta a mouse-ului. Jucatorul va putea trage o sageata la cateva secunde. Viteza de deplasare a sagetii este determinata de timpul de apasare al butonului mouse-ului. Cu cat butonul este apasat mai mult timp, cu atat viteza va fi mai mare, pana la o limita setata. | ||
- | Jucatorul va avea 3 vieti. La coliziunea dintre arc si un shuriken jucatorul va pierde o viata. La pierderea tuturor vietilor, jocul se va termina. | + | === Gameplay === |
- | Scorul va creste la coliziunea sagetii cu baloanele rosii sau shuriken. Scorul se va afisa periodic in consola sau se va ilustra pe ecran sub forma unui dreptunghi scalat (scorebar). | + | Scopul jocului este ca jucatorul sa supravietuiasca inamicilor cat mai mult timp. |
+ | Jucatorul porneste de la un nivel maxim de viata (health). La fiecare coliziune cu un inamic, acest nivel scade. Daca nivelul scade la 0, atunci jucatorul moare si jocul se termina. | ||
+ | Healthbar-ul se va prezenta pe ecran (orizontal, in partea de sus, sau vertical, in partea dreapta) prin doua dreptunghiuri: | ||
+ | * un dreptunghi wireframe, care reprezinta nivelul maxim de viata | ||
+ | * un dreptunghi solid, in interiorul celui wireframe, care reprezinta nivelul curent | ||
+ | Scorul va creste la eliminarea inamicilor. Scorul se va afisa periodic in consola sau se va ilustra pe ecran prin doua dreptunghiuri, similar cu healthbar-ul (scorebar). | ||
=== Detalii de implementare === | === Detalii de implementare === | ||
- | * Sagetile pot fi lansate doar catre partea dreapta a scenei.In momentul coliziunii sagetii cu un obiect se va declansa o animatie de distrugere a obiectului(ex: balonul va fi scalat cu factor subunitar pana dispare de tot). | + | * Crearea mediului inconjurator trebuie sa se realizeze in asa fel incat consumul de memorie si timpul de redare sa fie optime. Nu creati incontinuu obiecte care sa reprezinte inamici si proiectile care apar si dispar din spatiul de desenare!!!! O implementare eleganta este sa creati un singur obiect in functia init(), iar in functia Update() sa dati comanda de desenare pentru acel obiect de mai multe ori, de fiecare data la alta pozitie si cu alt factor de scalare. |
- | * Afisarea puterii de tragere se va realiza astfel: un dreptunghi amplasat sub jucator, care va fi scalat pe axa OX cat timp butonul mouse-ului este tinut apasat. | + | |
- | * Coliziunea dintre sageata si obiectele tinta se va implementa prin testarea daca varful sagetii este inclus in cercul incadrator al fiecarui obiect tinta. | + | |
- | * Coliziunea dintre shuriken si arcul jucatorului se va implementa prin testarea intersectiei cercurilor incadratoare ale obiectelor. | + | |
- | * Crearea mediului inconjurator trebuie sa se realizeze in asa fel incat consumul de memorie si timpul de redare sa fie optime. Nu creati incontinuu obiecte care sa reprezinte obiectele tinta si sagetile care apar si dispar din spatiul de desenare!!!! O implementare eleganta este sa creati un singur obiect in functia init(), iar in functia Update() sa dati comanda de desenare pentru acel obiect de mai multe ori, de fiecare data la alta pozitie si cu alt factor de scalare. | + | |
* Toate animatiile trebuie sa fie independente de timpul de procesare al unui cadru. | * Toate animatiile trebuie sa fie independente de timpul de procesare al unui cadru. | ||
+ | * Veti avea de implementat urmatoarele tipuri de coliziuni | ||
+ | * jucator - inamic | ||
+ | * jucator - perete harta | ||
+ | * jucator - obstacol | ||
+ | * proiectil - inamic | ||
+ | * proiectil - perete harta | ||
+ | * proiectil - obstacol | ||
+ | * inamic - perete harta | ||
<note tip>Mai multe informatii despre ce reprezinta coliziunea si cum se poate implementa: | <note tip>Mai multe informatii despre ce reprezinta coliziunea si cum se poate implementa: | ||
Line 65: | Line 76: | ||
* [[https://www.youtube.com/watch?v=aTbw71EpamY]] | * [[https://www.youtube.com/watch?v=aTbw71EpamY]] | ||
* [[https://developer.mozilla.org/en-US/docs/Games/Techniques/3D_collision_detection]] | * [[https://developer.mozilla.org/en-US/docs/Games/Techniques/3D_collision_detection]] | ||
- | Mentiune: in cazul acestei teme, coliziunile sunt mult mai simple (punct-cerc si cerc-cerc). | + | Mentiune: in cazul acestei teme, se accepta coliziuni simple (cerc-cerc si cerc-dreptunghi aliniat cu axele). |
</note> | </note> | ||
+ | Animatia de mai jos prezinta un exemplu de fereastra de afisare a jocului, in care jucatorul trage in inamici (reprezentati cu rosu). La coliziunea cu unul dintre inamici, healtbar-ul este modificat. La intalnirea unui pick-up, nivelul de viata este crescut din nou (aceasta cerinta nu este obligatorie). In animatie se poate observa ca jucatorul este in permanenta in centrul ferestrei de afisare si ca acesta nu poate trece dincolo de limitele hartii. | ||
+ | |||
+ | {{ :egc:teme:2021:egc-t1-full-demo-2.gif?direct&300 |}} | ||
=== Bonus === | === Bonus === | ||
- | * Scena cat mai realista (adaugarea unui personaj in scena, etc) | + | * Traiectorii complexe pentru inamici - acestia continua sa urmareasca jucatorul, dar incearca sa se fereasca de proiectile |
- | * Cresterea dificultatii jocului (viteza de deplasare a obiectelor tinta, numarul obiectelor tinta, etc) | + | * Afisarea unui minimap |
- | * Animatii (ex: baloanele sa se deplaseze pe un traseu serpuitor; la coliziunea dintre sageata si balon, balonul sa fie deformat realist si sa cada conform gravitatiei) | + | * Crearea unui tip de inamic mai complex - care ataca jucatorul cu proiectile |
- | * Sageata sa tina cont de gravitatie (aruncarea sub un unghi inclinat) | + | * Scena mult mai complexa |
- | * Diverse alte obiecte tinta (exemple in video) | + | * Diverse pick-up-uri (ex: element care creste nivelul de viata, element care mareste proiectilele pentru o anumita perioada, element de rapid fire mode in care arma isi modifica fire rate-ul astfel incat sa traga o data la minim 0.2 secunde, element care transforma arma intr-un shotgun astfel incat sa se lanseze mai multe proiectile la o tragere, etc) |
- | <note tip>Exemplu (doar pentru orientare): https://youtu.be/dcv-XKmUPjo </note> | + | <note tip>Exemplu (doar pentru orientare): https://www.youtube.com/watch?v=vcezerC5fDk&ab_channel=TasselsPlays </note> |
=== Functionalitati obligatorii === | === Functionalitati obligatorii === | ||
Barem orientativ pentru realizarea functionalitatilor (din 150 puncte): | Barem orientativ pentru realizarea functionalitatilor (din 150 puncte): | ||
- | * Desen scena - 40 p (10p sageata, 10p arcul, 10p baloane, 10p shuriken) | + | * Desenare jucator - 15p |
- | * Animatie obiecte tinta - 10p | + | * Miscare si orientare jucator - 10p |
- | * Stabilirea pozitiei arcului cu tastele - 10p | + | * Harta (desen harta, desen obstacole) - 15p |
- | * Stabilirea directiei de tragere si deplasare a sagetii - 25p (15p directie, 10p deplasare) | + | * Camera - 25p |
- | * Coliziunea sageata-obiecte tinta - 15p | + | * Desenare inamici - 15p |
- | * Coliziunea shuriken-personaj - 15p | + | * Miscare si orientare inamici - 5p |
- | * Sistemul de tragere(viteza sageata + power bar) - 15p | + | * Proiectile (tragere si desenare) - 20p |
- | * Animatie tinte doborate - 10p | + | * Coliziuni - 25p |
- | * Actualizare scor - 10p | + | * jucator - inamic (5p) |
+ | * jucator - perete harta (5p) | ||
+ | * jucator - obstacol (2.5p) | ||
+ | * proiectil - inamic (5p) | ||
+ | * proiectil - perete harta (2.5p) | ||
+ | * proiectil - obstacol (2.5p) | ||
+ | * inamic - perete harta (2.5p) | ||
+ | * Scor si healthbar (functionalitate si UI) - 20p | ||
=== Intrebari si raspunsuri === | === Intrebari si raspunsuri === | ||
- | Pentru intrebari vom folosi forumurile de pe moodle. | + | Pentru intrebari vom folosi forumurile de pe moodle. Orice nu este mentionat in tema este la latitudinea fiecarui student! |
=== Notare === | === Notare === | ||
Line 103: | Line 123: | ||
Tema va fi implementata in OpenGL si C++. Este indicat sa folositi framework-ul si Visual Studio. | Tema va fi implementata in OpenGL si C++. Este indicat sa folositi framework-ul si Visual Studio. | ||
- | Pentru implementarea temei, in folderul Source/Laboratoare/ puteti crea un nou folder, de exemplu Tema1, cu fisierele Tema1.cpp si Tema1.h (pentru implementare POO, este indicat sa aveti si alte fisiere). Pentru a vedea fisierele nou create in Visual Studio in Solution Explorer, apasati click dreapta pe filtrul Laboratoare si selectati Add->New Filter. Dupa ce creati un nou filtru, de exemplu Tema1, dati click dreapta si selectati Add->Existing Item. Astfel adaugati toate fisierele din folderul nou creat. | + | Pentru implementarea temei, in folderul __**src/lab_m1**__ puteti crea un nou folder, de exemplu Tema1, cu fisierele Tema1.cpp si Tema1.h (pentru implementare POO, este indicat sa aveti si alte fisiere). Pentru a vedea fisierele nou create in Visual Studio in Solution Explorer, apasati click dreapta pe filtrul lab_m1 si selectati Add->New Filter. Dupa ce creati un nou filtru, de exemplu Tema1, dati click dreapta si selectati Add->Existing Item. Astfel adaugati toate fisierele din folderul nou creat. |
- | In fisierul LabList.h trebuie adaugata si calea catre header-ul temei. De exemplu: #include <Laboratoare/Tema1/Tema1.h> | + | In fisierul lab_list.h trebuie adaugata si calea catre header-ul temei. De exemplu: #include "lab_m1/Tema1/Tema1.h" |
=== Arhivarea proiectului === | === Arhivarea proiectului === | ||
Line 110: | Line 130: | ||
<note> | <note> | ||
* in mod normal arhiva trebuie sa contina toate resursele necesare compilarii si rularii | * in mod normal arhiva trebuie sa contina toate resursele necesare compilarii si rularii | ||
- | * inainte de a face arhiva asigurati-va ca ati dat clean la proiect | + | * inainte de a face arhiva asigurati-va ca ati curatat proiectul Visual Studio: |
- | * click dreapta pe proiect in **Solution Explorer** -> **Clean Solution**, sau | + | * click dreapta pe proiect in **Solution Explorer** -> **Clean Solution** |
- | * stergeti folderul __**/Visual Studio/obj**__ | + | * si stergeti folderul __**/build/.vs**__ (daca nu il vedeti, **este posibil sa fie ascuns**) |
- | * stergeti fisierul __**/Visual Studio/Framework_EGC.sdf**__ (in caz ca exista) | + | * SAU stergeti complet folderul __**/build**__ |
- | * stergeti fisierul __**/Visual Studio/Framework_EGC.VC.db**__ (in caz ca exista) | + | * in cazul in care arhiva tot depaseste limita de 50MB (nu ar trebui), puteti sa stergeti si folderul __**/deps**__ sau __**/assets**__ 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. |
- | * stergeti folderul __**/Visual Studio/.vs**__ (daca nu il vedeti, **este posibil sa fie ascuns**) | + | |
- | * 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 cazul in care 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. | + | |
</note> | </note> | ||
=== Deadline tema === | === Deadline tema === | ||
- | 17 noiembrie ora 23:59 | + | 14 noiembrie ora 23:59 |
=== Responsabili tema === | === Responsabili tema === | ||
- | * Stefania Cristea | + | * Chris Luntraru |
+ | * Miruna Chiricu | ||
* Andrei Lapusteanu | * Andrei Lapusteanu | ||
* Anca Morar | * Anca Morar |