This is an old revision of the document!


Tema 1 - Arcade Machine

  • Responsabili: Robert Caragicu, Cristian Lambru, Andrei Voicu, Ioana Chiper, Vlad Novetschi
  • Lansare: 26 octombrie 2025
  • Termen de predare: 16 noiembrie 2025, ora 23:59
  • Regulament: Regulament general
  • Notă: Orice informație ce nu a fost acoperită în acest document este la latitudinea voastră!

În cadrul acestei teme veți avea de realizat un editor de construcție a unei nave spațiale, pe care o veți utiliza în cadrul unul joc ales de voi din cele 3 tipuri de joc (pong, breakout și space invaders).

Editor nava spațială

La începutul jocului jucătorul va proiecta propria navă folosind un editor. Editorul va arată în felul următor.

Nava este formată din blocuri de 1×1 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 5×5. Î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).

Descriere blocuri

Fiecare bloc este de dimensiuni 1×1 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 1×1
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ă.
Motor Un pătrat de 1×1 care are în partea de jos o geometrie similară cu cea din imagine
Bumper Un pătrat 1×1 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ă.

Constrângeri

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:

  • Vehiculul trebuie să aibă cel puțin 1 bloc.
  • Vehiculul trebuie sa fie conex. Altfel spus, trebuie să existe mereu o cale de la un bloc la orice alt bloc care să treacă numai prin blocuri. Vecinătatea este numai pe orizontală sau verticală.
  • Nu se poate plasa niciun alt bloc pe poziții mai jos de blocul de motor.
  • Nu se poate plasa niciun alt bloc pe poziții mai sus de tun.
  • 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 pot plasa două blocuri bumper vecine.
  • Vehiculul nu poate fi compus din mai mult de 10 blocuri.

Interacțiune cu editorul

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. În acel moment, atașat de mouse, se consideră că este blocul desemnat de celulă în care a apăsat butonul stânga.
  • 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 ț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 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 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. Pentru a începe jocul, jucătorul dă un click pe butonul de start verde. Nava proiectată este copiată și folosită în joc.

PONG

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

Scopul principal al jocului este ca fiecare jucător să evite trecerea mingii dincolo de propria paletă și, simultan, să trimită mingea în așa fel încât adversarul să nu o poată returna. Fiecare dată când mingea trece de un jucător, adversarul primește un punct. Jocul se reia imediat, mingea fiind resetată în centrul ecranului și pornind în direcția jucătorului care a pierdut punctul anterior.

Jocul continuă până când unul dintre jucători atinge un scor prestabilit (de exemplu, 10 puncte), moment în care acesta este declarat câștigător, iar jocul se oprește

Cerințe de bază

Desenare scenă: Două palete, bila, linii de delimiatare ale terenului, o linie punctată în mijlocul tablei și scorul jucătorilor (poate fi desenată fie ca o serie de bile fie ca text pe ecran)

Control paletă: Un jucător folosește tastele W și S, celălat foloseste tastele ↑ și ↓. Paletele nu pot depăși marginile superioare și inferioare ale ecranului.

Coliziuni: Bila este un cerc și blocurile paletelor sunt AABB(axis-aligned bounding boxes). La contactul bilei cu marginile stânga și dreapta ale hărții un gol este înregistrat. La contactul bilei cu marginile sus și jos componenta verticală a vitezei își schimbă semnul, simulând o reflexie perfect elastică.

La contact cu paletele bila are direcția de mișcare modificată în funcție de punctul de contact, pentru a permite jucătorilor să ghideze bila în direcția dorită. Matematic, putem calula astfel:

  1. unghi = (y_bila - y_paletă) / (h_paletă / 2)
  2. v_x_bila = viteza_bila * cos(unghi)
  3. v_y_bila = viteza_bila * sin(unghi)

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

Creșterea vitezei bilei: la fiecare ricoșeu a bilei de o componentă de tip bumper. Bumperul este aproximat cu un dreptunghi.

Animație paletă: la coliziune cu bila. Animația este una de scalare înainte-înapoi pe verticală și/sau orizontală timp de o secundă.

Lansare de bile. Această cerință înlocuiește cerința de bază Resetarea bilei. Se va folosi componenta tun pentru a lansa bile noi în scenă. Când începe o nouă rundă de joc din fiecare tun va fi lansată o bilă. Bilele sun tratate separat și runda se termină atunci când toate bilele sunt în porțile jucătorilor.

BREAKOUT

(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ă.

Cerințe de bază

Scop și logică de progres: Jucătorul începe partida cu 3 vieți. De fiecare dată când bila ajunge sub paletă, o viață este pierdută, iar bila și paleta se resetează în pozițiile inițiale. La distrugerea unei cărămizi, se adaugă un punct. Jocul se termină când jucătorul pierde toate viețile sau când sunt distruse toate cărămizile de pe ecran.

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ă: 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°).

Coliziuni Bila este de formă circulară, iar componentele paletei vor fi aproximate cu AABB (axis-aligned bounding boxes)

  • Bilă-cărămidă: Se sparge cărămida, iar bila ricoșează (inversând una din componentele vitezei acesteia).
  • Bilă-margini ecran: Bila ricoșează similar.
  • Bilă-margine jos ecran: Se pierde o viață, iar paleta și bila sunt resetate
  • Bilă-paletă: Dacă bila a lovit o margine verticală a paletei atunci ricoșează în mod obișnuit. În schimb, pentru a permite controlul bilei de către jucător, atunci când bila lovește o margine orizontală a paletei, aceasta ricoșează și își schimbă direcția în funcție de punctul de contact similar ca în jocul PONG de mai sus.

Cerințe avansate

Animație spargere cărămizi: Când se sparge o cărămidă aceasta va deveni din ce în ce mai mică până când dispare de tot. Cărămizile care sunt în proces de distrugere nu influențează bila.

Cărămizi rezistente: Pentru a distruge o cărămidă este necesar să fie atins de mai multe ori de bilă sau de un proiectil. Se vor desena cărămizile în culori diferite. Fiecare culoare indică câte lovituri mai sunt necesare pentru a distruge cărămida.

CHICKEN INVADERS

Jocul Chicken Invaders este de tipul Shoot'em up și are ca scop distrugerea tuturor inamicilor pe ecran folosind nava spațială.

Cerințe de bază

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:

Pentru bonus se poate folosi următorul aspect:

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.

Coliziuni

  • Proiectil jucător-inamic: Inamicul este aproximat pentru coliziuni cu un cerc. Când este lovit de proiectilul jucătorului inamicul și proiectilul sunt distruse. Jucătorul primește un punct
  • Proiectil inamic-jucător: Jucătorul este distrus și jocul se încheie
  • Inamic - josul hărții: Jocul se încheie

Cerințe avansate

Coborâre sinusoidală a inamicilor: Pe măsură ce inamicii coboară, aceștia se vor mișca și stânga-dreapta într-un mod sinusoidal

Sistem valuri: Când toți inamicii sunt distruși pe ecran, după încă 5 secunde, alți inamici vor fi creați în scenă. Acești noi inamici vor fi mai rapizi decât cei precedenți (coboară mai repede, trag mai des și proiectilele lor vor fi mai rapide)

Mișcare verticală a jucătorilor: Se permite folosirea celor patru taste săgeți (↑←↓→) pentru a mișca jucătorul.

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)

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

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

Indicații suplimentare

Tema va fi implementată în OpenGL și C++. Este indicat să folosiți framework-ul și Visual Studio.

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”

Arhivarea proiectului

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

egc/teme/2025/01.1761511259.txt.gz · Last modified: 2025/10/26 22:40 by andrei.voicu2409
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