Differences

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

Link to this comparison view

egc:teme:2025:01 [2025/10/26 19:25]
robert.caragicu
egc:teme:2025:01 [2025/10/26 22:43] (current)
andrei.voicu2409 [Funcționalități avansate (75p)]
Line 1: Line 1:
-<​hidden>​ +===== Tema 1 - Arcade Machine ​=====
-===== Tema 1 - Joc cu nave proiectate de jucători ​=====+
  
   * **Responsabili:​** Robert Caragicu, Cristian Lambru, Andrei Voicu, Ioana Chiper, Vlad Novetschi   * **Responsabili:​** Robert Caragicu, Cristian Lambru, Andrei Voicu, Ioana Chiper, Vlad Novetschi
Line 15: Line 14:
 La începutul jocului jucătorul va proiecta propria navă folosind un editor. Editorul va arată în felul următor. La începutul jocului jucătorul va proiecta propria navă folosind un editor. Editorul va arată în felul următor.
  
-PLACEMENT EDITOR IMAGE+{{ :​egc:​teme:​2025:​editor_tema_1.png?​500 |}}
  
-Nava este formată din blocuri de 1x1 așezate pe o grilă. În partea stângă a editorului se află  celule ordonate vertical, ​cate 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 5x5. Î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).+Nava este formată din blocuri de 1x1 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 5x5. Î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).
  
  
Line 24: Line 23:
 Fiecare bloc este de dimensiuni 1x1 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.** Fiecare bloc este de dimensiuni 1x1 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.**
  
-| Bloc solid | Un pătrat simplu de dimensiuni 1x1 | +| Bloc solid | {{ :​egc:​teme:​2025:​bloc_solid_tema_1.png?​50 }} | Un pătrat simplu de dimensiuni 1x1 | 
-| Tun | Este de dimeniune 3 linii x 1 coloană. În partea de jos se află un pătrat și un semicerc. În partea de sus se află țeava tunului de dimensiune 2 linii x 1 coloană. | +| Tun | {{ :​egc:​teme:​2025:​bloc_tun_tema_1.png?​50 }} | Este de dimeniune 3 linii x 1 coloană. În partea de jos se află un pătrat și un semicerc. În partea de sus se află țeava tunului de dimensiune 2 linii x 1 coloană. | 
-| Motor | Un pătrat de 1x1 care are în partea de jos o geometrie similară cu cea din imagine | +| Motor | {{ :​egc:​teme:​2025:​bloc_motor_tema_1.png?​50 }} | Un pătrat de 1x1 care are în partea de jos o geometrie similară cu cea din imagine | 
-| Bumper| Un pătrat 1x1 care are în partea de sus un semicerc de dimensiuni 3 coloane x 1 linie |+| Bumper ​| {{ :​egc:​teme:​2025:​bloc_bumper_tema_1.png?​50 }}| Un pătrat 1x1 care are în partea de sus un semicerc de dimensiuni 3 coloane x 1 linie |
  
 //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ă.//​ //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ă.//​
Line 35: Line 34:
  
 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: 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:
 +
 +| {{ :​egc:​teme:​2025:​constrangere_conex_tema_1.png?​200 }} | {{ :​egc:​teme:​2025:​constrangere_bumper_tema_1.png?​100 }} |
 +| {{ :​egc:​teme:​2025:​constrangere_bumper_tun_tema_1.png?​100 }} | {{ :​egc:​teme:​2025:​constrangere_motor_tema_1.png?​100 }} | {{ :​egc:​teme:​2025:​constrangere_tun_tema_1.png?​100 }} |
  
   * Vehiculul trebuie să aibă cel puțin 1 bloc.   * Vehiculul trebuie să aibă cel puțin 1 bloc.
Line 42: Line 44:
   * Nu se poate plasa niciun alt bloc pe poziții mai sus de locul de bumper, pe 3 coloane de celule.   * Nu se poate plasa niciun alt bloc pe poziții mai sus de locul de bumper, pe 3 coloane de celule.
   * Nu se poate plasa un tun în stânga sau în dreapta blocului bumper la o distanță de 1 bloc.   * Nu se poate plasa un tun în stânga sau în dreapta blocului bumper la o distanță de 1 bloc.
-  * Nu se pot plasa două blocuri bumper vecine+  * Nu se pot plasa două blocuri bumper vecine.
   * Vehiculul nu poate fi compus din mai mult de 10 blocuri.   * Vehiculul nu poate fi compus din mai mult de 10 blocuri.
- 
  
 ====== Interacțiune cu editorul ====== ====== Interacțiune cu editorul ======
  
-PLACEMENT GIF DRAG AND DROP+{{ :​egc:​teme:​2025:​drag_and_drop_tema_1.gif?​500 |}}
  
-Acțiunea de construcție a vehiculului se realizeaza printr-un proces de drag&​drop după urmatorii pasi:  +Acțiunea de construcție a vehiculului se realizeaza printr-un proces de drag&​drop după următorii pași
-  * Utilizatorul apasă butonul stanga de la mouse pe una dintre cele 4 celule din panoul stâng al editorului. ​In acel moment, ​atasat ​de mouse, se considera ca este blocul desemnat de celulă în care a apăsat butonul ​stanga+  * Utilizatorul apasă butonul stanga de la mouse pe una dintre cele 4 celule din panoul stâng al editorului. ​În acel moment, ​atașat ​de mouse, se consideră că este blocul desemnat de celulă în care a apăsat butonul ​stânga
-  * Pe toata perioada în care utilizatorul ​tine apăsat butonul ​stanga ​de la mouse, de la momentul primei ​apasari ​în interiorul unei celule, se afișează la poziția cursorului blocul desemnat de celulă în care s-a dat stanga. Acest lucru se întâmplă și în momentul în care cursorul își schimba ​poziția pe ecran. +  * Pe toată ​perioada în care utilizatorul ​ține apăsat butonul ​stânga ​de la mouse, de la momentul primei ​apăsări ​în interiorul unei celule, se afișează la poziția cursorului blocul desemnat de celulă în care s-a dat stânga. Acest lucru se întâmplă și în momentul în care cursorul își schimbă ​poziția pe ecran. 
-  * În momentul în care nu se mai tine apăsat butonul ​stanga ​de la mouse, se pot intampla ​2 scenarii:+  * În momentul în care nu se mai ține apăsat butonul ​stânga ​de la mouse, se pot întâmpla ​2 scenarii:
     * În situația în care cursorul este în interiorul unei celule din grila 2D, se introduce în acel grid blocul desemnat.     * În situația în care cursorul este în interiorul unei celule din grila 2D, se introduce în acel grid blocul desemnat.
-    * În situația în care cursorul nu se afla în interiorul unei celule din grila 2D, blocul desemnat încetează ​sa se mai afișează la poziția cursorului.+    * În situația în care cursorul nu se află în interiorul unei celule din grila 2D, blocul desemnat încetează ​să se mai afișeze la poziția cursorului.
  
-În momentul în care se apasă butonul dreapta de la mouse cand cursorul se afla intr-una din celulele grilei care conține deja un bloc, acel bloc este scos din celulă și nu se mai afișează.+Î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. +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.
-Pentru a începe jocul, jucătorul dă un click pe butonul de start verde. Nava proiectată este copiată și folosită în joc.+
  
  
 ====== PONG ====== ====== PONG ======
  
-PLACEMENT GIF PONG+{{ :​egc:​teme:​2025:​pong_tema_1.gif |}} 
 +//(Exemplu orientativ)//​
  
 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. 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.
Line 88: Line 89:
   - v_y_bila = viteza_bila * sin(unghi)   - v_y_bila = viteza_bila * sin(unghi)
  
-**Resetarea bilei (15p)**: 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).+**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).
  
 ===== Cerințe avansate ===== ===== Cerințe avansate =====
Line 100: Line 101:
 ====== BREAKOUT ====== ====== BREAKOUT ======
  
-PLACEMENT GIF BREAKOUT+{{ :​egc:​teme:​2025:​breakout_tema_1.gif?​600 |}} 
 +//(Exemplu orientativ)//​
  
 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ă. 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ă.
Line 110: Line 112:
 **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. **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ă(10p)**: Paleta se află în josul ecranului și se deplasează folosind tastele ← și →.+**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°). **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°).
Line 129: Line 131:
 ====== CHICKEN INVADERS ====== ====== CHICKEN INVADERS ======
  
-PLACEHOLDER IMAGINE CHICKEN INVADERS+{{ :​egc:​teme:​2025:​chicken_invaders_tema_1.jpg?​600 |}}
 Jocul [[https://​www.youtube.com/​watch?​v=Kk36Ko0CeX8|Chicken Invaders]] este de tipul //​Shoot'​em up// și are ca scop distrugerea tuturor inamicilor pe ecran folosind nava spațială. Jocul [[https://​www.youtube.com/​watch?​v=Kk36Ko0CeX8|Chicken Invaders]] este de tipul //​Shoot'​em up// și are ca scop distrugerea tuturor inamicilor pe ecran folosind nava spațială.
  
Line 135: Line 137:
  
 **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. **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: {{ :​egc:​teme:​2025:​simple_chicken_tema_1.png?​200 }}
 +
 +Pentru bonus se poate folosi următorul aspect: {{ :​egc:​teme:​2025:​complex_chicken_tema_1.png?​200 |}}
  
 **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. **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.
Line 151: Line 157:
 **Mișcare verticală a jucătorilor**:​ Se permite folosirea celor patru taste săgeți (↑←↓→) pentru a mișca jucătorul. **Mișcare verticală a jucătorilor**:​ Se permite folosirea celor patru taste săgeți (↑←↓→) pentru a mișca jucătorul.
  
-</hidden>+===== Barem ===== 
 + 
 +==== Funcționalități de bază (150p) ==== 
 + 
 +  * Editor (75p) 
 +    * Desenare componente în stânga ecranului (10p) //​Includeți doar componentele care le folosiți în jocul ales de voi.// 
 +    * Desenare grilă proiectare vehicul (15p) 
 +    * Desenare număr componente rămase (5p) 
 +    * Desenare buton start (5p) 
 +    * Drag and drop pentru construcție (20p) 
 +    * Click dreapta pentru ștergere (10p) 
 +    * Verificare constrângeri vehicul (15p) 
 +    * Colorare buton start (2,5p) 
 +    * Copierea vehicului proiectat în joc (2,5p) 
 +  * Implementare joc (75p) 
 +    * **Pong** 
 +      * Desenare scenă (25p) 
 +      * Control palete (5p) 
 +      * Mișcare bilă (5p) 
 +      * Detectare Coliziuni (10p) 
 +      * Ricoșeu bilă la marginile orizontale ale hărții (5p) 
 +      * Ricoșeu bilă la palete (10p) 
 +      * Scor la gol (5p) 
 +      * Resetare bilă (10p) 
 +    * **Breakout** 
 +      * Desenare scenă (25p) 
 +      * Control paletă (5p) 
 +      * Mișcare bilă (5p) 
 +      * Detectare Coliziuni (15p) 
 +      * Spargere cărămizi (10p) 
 +      * Pierdere viață (5p) 
 +      * Resetare bilă (5p) 
 +      * Servire minge la începutul jocului (5p) 
 +    * **Chicken Invaders** 
 +      * Desenare inamici (15p) 
 +      * Mișcare inamici (5p) 
 +      * Tragere proiectile de către inamici (5p) 
 +      * Mișcare navă (5p) 
 +      * Tragere proiectile de către navă (5p) 
 +      * Mișcare proiectile (5p) 
 +      * Detectare coliziuni (15p) 
 +      * Distrugere inamici la coliziune cu proiectil al navei (5p) 
 +      * Joc pierdut când nava este lovită de un proiectil al unui inamic (5p) 
 +      * Joc pierdut când un inamic atinge marginea de jos a hărții (5p) 
 +      * Afișare scor (5p) 
 + 
 +==== Funcționalități avansate (75p) ==== 
 + 
 +  * **Pong** 
 +    * Implementare componentă bumper (desenare + constrângeri) (10p) 
 +    * Creștere viteză bilă (10p) 
 +    * Animație paletă (10p) 
 +    * Implementare componentă tun (desenare + constrângeri) (10p) 
 +    * Lansare de bile din tunuri la rundă nouă (15p) //Dacă este implementată această cerința cerința "​Resetare bilă" este considerată rezolvată.//​ 
 +    * Suport în joc pentru mai multe bile (20p) 
 +  * **Breakout** 
 +    * Animație spargere cărămizi (30p) 
 +    * Logică cărămizi rezistente (25p) 
 +    * Desenare cărămizi în mai multe culori în funcție de câtă rezistență mai au (20p) 
 +  * **Chicken Invaders** 
 +    * Coborâre sinusoidală a inamicilor (20p) 
 +    * Sistem valuri (45p) 
 +    * Mișcare completă a jucătorilor (10p) 
 + 
 +==== Exemple de funcționalități bonus ==== 
 +  * Camera shake (+20p) 
 +  * Animații cu “particule” la distrugerea obiectelor (+10p) 
 +  * Sistem de viață per componentă (+25p) 
 +  * Modele diferite în funcție de gradul de daune primit (+10p) 
 +  * Elemente UI în timpul jocului, ex: scor obținut, inamici rămași etc. (+10–20p) 
 +  * Sistem magazin (în funcție de performanța în timpul jocului, se pot achiziționa upgrade-uri / componente mai puternice etc.) (+20–30p) 
 +  * Mai multe blocuri cu funcționalități diferite (+5–10p per bloc) 
 +  * Design coerent, frumos al jocului (+10p) 
 + 
 +==== Întrebări și răspunsuri ==== 
 + 
 +Pentru întrebări vom folosi forumurile de pe moodle. Orice nu este menționat în temă este la latitudinea fiecărui student! 
 + 
 +==== Notare ==== 
 + 
 +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. 
 + 
 +<note warning>​ 
 +Tema trebuie încărcată pe moodle. Pentru a fi punctată, tema trebuie prezentată la laborator. Vor exista laboratoare speciale de prezentare a temelor (care vor fi anunțate).</​note>​ 
 + 
 +==== Indicații suplimentare ==== 
 +Tema va fi implementată în OpenGL și C++. Este indicat să folosiți framework-ul și Visual Studio. 
 + 
 +<​note>​Pentru implementarea temei, în folderul **src/​lab_m1** puteți crea un nou folder, de exemplu **Tema1**, cu fișierele **Tema1.cpp** și **Tema1.h** (pentru implementare POO, este indicat să aveți și alte fișiere). Pentru a vedea fișierele nou create în Visual Studio în Solution Explorer, apăsați click dreapta pe filtrul **lab_m1** și selectați **Add→New Filter**. După ce creați un nou filtru, de exemplu **Tema1**, dați click dreapta și selectați **Add→Existing Item**. Astfel adăugați toate fișierele din folderul nou creat. În fișierul **lab_list.h** trebuie adăugată și calea către header-ul temei. De exemplu: **#include “lab_m1/​Tema1/​Tema1.h”**</​note>​ 
 + 
 +==== Arhivarea proiectului ==== 
 +<​note>​ 
 +  * În mod normal arhiva trebuie să conțină toate resursele necesare compilării și rulării 
 +  * Înainte de a face arhiva asigurați-vă că ați curățat proiectul Visual Studio: 
 +      * Click dreapta pe proiect în **Solution Explorer** -> **Clean Solution** 
 +      * Ștergeți folderul __**/​build/​.vs**__ (dacă nu îl vedeți, **este posibil să fie ascuns**) 
 +  * În cazul în care arhiva tot depășește limita de 50MB (nu ar trebui), puteți să ștergeți și folderul __**/​deps**__ sau __**/​assets**__ întrucât se pot adăuga la testare. Nu este recomandat să faceți acest lucru întrucât îngreunează mult testarea în cazul în care versiunea curentă a bibliotecilor/​resurselor diferă de versiunea utilizată la momentul scrierii temei. 
 +</note>
  
egc/teme/2025/01.1761499557.txt.gz · Last modified: 2025/10/26 19:25 by robert.caragicu
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