Differences

This shows you the differences between two versions of the page.

Link to this comparison view

egc:teme:2021:01 [2021/10/28 16:49]
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 ​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. ​
Line 26: Line 25:
 === Proiectilele === === Proiectilele ===
 Jucatorul poate sa traga cu proiectile reprezentate prin dreptunghiuri negre (la click stanga cu mouse-ul). ​ 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).+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 (jucatorul va fi desenat tot timpul 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 === === Gameplay ===
  
 Scopul jocului este ca jucatorul sa supravietuiasca inamicilor cat mai mult timp.  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. Healthbar-ul se va prezenta pe ecran (orizontal, in partea de sus, sau vertical, in partea dreapta) prin doua dreptunghiuri:​+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 wireframe, care reprezinta nivelul maxim de viata
   * un dreptunghi solid, in interiorul celui wireframe, care reprezinta nivelul curent ​   * un dreptunghi solid, in interiorul celui wireframe, care reprezinta nivelul curent ​
Line 55: Line 62:
   * 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.   * 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.
   * 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 62: 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, se accepta coliziuni simple (cerc-cerc si cerc-dreptunghi aliniat cu axele).+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 ===
-  * Traiectorii complexe pentru inamici - acestia continua sa urmareasca jucatorul, dar incearca sa se fereasca de proiectile ​(10p) +  * Traiectorii complexe pentru inamici - acestia continua sa urmareasca jucatorul, dar incearca sa se fereasca de proiectile 
-  * Afisarea unui minimap ​(10p)+  * Afisarea unui minimap
   * Crearea unui tip de inamic mai complex - care ataca jucatorul cu proiectile   * Crearea unui tip de inamic mai complex - care ataca jucatorul cu proiectile
   * Scena mult mai complexa   * Scena mult mai complexa
-  * Diverse pick-up-uri (ex: element care creste nivelul de viata, element care mareste ​proiectile ​pentru o anumita perioada, element care transforma arma intr-un shotgun, etc) (10p)+  * 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://​www.youtube.com/​watch?​v=vcezerC5fDk&​ab_channel=TasselsPlays </​note>​ <note tip>​Exemplu (doar pentru orientare): https://​www.youtube.com/​watch?​v=vcezerC5fDk&​ab_channel=TasselsPlays </​note>​
Line 78: Line 95:
 === Functionalitati obligatorii === === Functionalitati obligatorii ===
 Barem orientativ pentru realizarea functionalitatilor (din 150 puncte): Barem orientativ pentru realizarea functionalitatilor (din 150 puncte):
-  * Desenare jucator - 25p+  * Desenare jucator - 15p
   * Miscare si orientare jucator - 10p   * Miscare si orientare jucator - 10p
-  * Harta (desen ​si coliziune 20p+  * Harta (desen ​harta, desen obstacole) - 15p
   * Camera - 25p   * Camera - 25p
-  * Inamici ​20p +  * Desenare inamici ​15p 
-  * Proiectile (tragere, desenare ​si coliziune) - 20p +  * Miscare si orientare inamici - 5p 
-  * Scor si healtbar(functionalitate si UI) - 15p+  * Proiectile (tragere si desenare) - 20p 
 +  * Coliziuni - 25p 
 +    * 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 97: 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 lab_list.h trebuie adaugata si calea catre header-ul temei. De exemplu: #include "​lab_m1/​Tema1/​Tema1.h"​ In fisierul lab_list.h trebuie adaugata si calea catre header-ul temei. De exemplu: #include "​lab_m1/​Tema1/​Tema1.h"​
  
Line 104: 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>​
  
egc/teme/2021/01.1635428975.txt.gz · Last modified: 2021/10/28 16:49 by anca.morar
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