Tema 1 - Survival Shooter

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

Harta

Spatiul de joc este un dreptunghi. Figura de mai jos prezinta moduri in care se poate reprezenta harta:

  • dreptunghi solid (un obiect desenat in spatele tuturor elementelor din joc) - stanga
  • dreptunghi wireframe - centru
  • prin desenarea peretilor spatiului - dreptunghiuri solide - dreapta

Jucatorul nu poate sa iasa din harta. Harta trebuie sa fie mai mare decat fereastra de afisare.

Pe harta vor fi si alte obstacole, reprezentate prin dreptunghiuri scalate diferit, prin care jucatorul nu poate sa treaca.

Proiectilele

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

Camera

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.

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 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 trebuie sa urmareasca incontinuu jucatorul. Inamicii pot trece prin obstacole.

Gameplay

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

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

Mai multe informatii despre ce reprezinta coliziunea si cum se poate implementa:

Mentiune: in cazul acestei teme, se accepta coliziuni simple (cerc-cerc si cerc-dreptunghi aliniat cu axele).

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.

Bonus

  • Traiectorii complexe pentru inamici - acestia continua sa urmareasca jucatorul, dar incearca sa se fereasca de proiectile
  • Afisarea unui minimap
  • Crearea unui tip de inamic mai complex - care ataca jucatorul cu proiectile
  • Scena mult mai complexa
  • 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)

Functionalitati obligatorii

Barem orientativ pentru realizarea functionalitatilor (din 150 puncte):

  • Desenare jucator - 15p
  • Miscare si orientare jucator - 10p
  • Harta (desen harta, desen obstacole) - 15p
  • Camera - 25p
  • Desenare inamici - 15p
  • Miscare si orientare inamici - 5p
  • 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

Pentru intrebari vom folosi forumurile de pe moodle. Orice nu este mentionat in tema este la latitudinea fiecarui student!

Notare

Baremul este orientativ. Fiecare asistent are o anumita libertate in evaluarea temelor (de exemplu, sa dea punctaj partial pentru implementarea incompleta a unei functionalitati sau sa scada pentru hard coding). Acelasi lucru este valabil atat pentru functionalitatile obligatorii, cat si pentru bonusuri.

Tema trebuie incarcata pe moodle. Pentru a fi punctata, tema trebuie prezentata la laborator. Vor exista laboratoare speciale de prezentare a temelor (care vor fi anuntate).

Indicatii suplimentare

Tema va fi implementata in OpenGL si C++. Este indicat sa folositi framework-ul si Visual Studio.

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”

Arhivarea proiectului

  • in mod normal arhiva trebuie sa contina toate resursele necesare compilarii si rularii
  • inainte de a face arhiva asigurati-va ca ati curatat proiectul Visual Studio:
    • click dreapta pe proiect in Solution ExplorerClean Solution
    • si stergeti folderul /build/.vs (daca nu il vedeti, este posibil sa fie ascuns)
  • SAU stergeti complet folderul /build
  • 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.

Deadline tema

14 noiembrie ora 23:59

Responsabili tema

  • Chris Luntraru
  • Miruna Chiricu
  • Andrei Lapusteanu
  • Anca Morar
egc/teme/2021/01.txt · Last modified: 2021/11/14 15:41 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