bok ljudeki, ukratko, napravio sam igricu u oko 4 sata i zanima me što mislite. ovo je najkvalitetniji mali projekt koji sam dosada napravio. pitam zato što imam 16 godina i self taught sam, a nikada mi nitko nije reviewo kod pa zapravo ne znam radim li kakve pogreške i/ili loše prakse.

ako niste programer, onda samo mi recite što mislite da bih mogao dodati. hvala!

(https://youtu.be/HZZ4qI3xQs8)

[github](https://github.com/matej0/SFML-projects) (kod za ovu igru se nalazi u fileovima tank.cpp/.h)

13 comments
  1. Što se kôda tiče, nisam u C++ pa ti ne mogu previše komentirati, ali mogu ti reći da mi se na brzo čitanje čini okej za ono što je. S vremenom će se to poboljšati tako da samo nastavi. Di bi ja bio da sam sa 16 krenuo…

    Jedina stvar koju bi ti toplo preporučio da ne radiš – ovakvi komentari u kôdu:

    > //credits to some retard from stackoverflow.

    Pogotovo ako želiš ovakve projekte pokazivati na CV. Napiši pravi izvor i poštuj licencu ukoliko postoji.

    Također baci oko na [Vampire Survivors](https://store.steampowered.com/app/1794680/Vampire_Survivors/), ovaj video me odmah na tu igru podsjetio, možda ti da inspiraciju.

  2. Rekao bih da je dosta dobro, ali kakav je to edgy naslov lol. Kao netko tko je bio na tvom mjestu ne tako davno par savjeta koje imam:

    * Pogledaj što je “unity builds” (ne Unity engine)
    * Jedna od ključnih stvari kad želiš da ti igra radi kako spada je organizacija memorije. To nikako ne možeš postići ako imaš funkcije poput CBullet* CreateBullet(…). Jedan najjednostavniji primjer konstrukcije memorije je “memory arena”.
    * Probaj više razmišljati o grupi elemenata nego o pojedinačnom.
    * Vidim da si počeo nekakav gui raditi. Pogledaj što je “immediate mode gui” (ima odlično predavanje na YT od Casey Muratoria), jer s “retained mode gui” se nećeš puno usrećiti.

  3. Kod je ok. Pohvale što koristiš C++ zato što mi je to drag jezik. Par stvari koje treba pazit:

    – Smrtni grijeh je staviti soruce fajlove od raznih projekata u isti folder. Kužim da je malo lakše compileat, ali nemoj.

    – CTank naslijeđuje sf::Sprite koji ima “move” metodu, a CTank sam deklarira “Move”. Trebao bi to drugačije nazvati da se izbjegne zbunjola.

    – If/else je često lakši za pratit od stalnog korištenja continue. Pogotovo ako ga koristiš često.

    – Nema smisla da su m_Bullets i m_Targets deque. Deque se koristi kada želiš s obje strane niza brzo moći dodavati i brisati elemente, a treba ti ujedno i brzi nasumični pristup. Ti nizu metaka pristupaš samo uzastopno (ne nasumično) i dodaješ samo na kraj, a brišeš iz sredine. Za to upravo služi std::list koji možeš iskoristit.

    – DrawDebugOverlay ne bi trebao biti u CTank klasi jer nema veze s njom

    – Praktički sve varijable u klasama su ti javne što nije idealno. Bolje je napravit metode za upravljanje objektima nego izlagati unutarnje komponente.

    – Vidim da si se dosta mučio s generiranjem novih koordinata za Targete. Jedan problem je to što ako ti Targeti zauzmu sva mjesta na ekranu (ako bi se to moglo dogoditi) onda ti program odmah crash-a jer zapne u beskonačnoj petlji. Traženje tih koordinata je NP-kompletan problem i nema jednostavnog optimalnog rješenja. Jedna ideja bila bi da ekran podjeliš na kvadrate koji su upola kraći od Targeta. Onda za svaki target izračunaš kojem kvadratu pripada njegovo središte i taj kvadrat označiš. Na kraju pronađeš kvadrat koji nije označen i kojem niti jedan od 8 susjeda nije označen. Za njega možeš garantirat da ne sadrži središte (ili značajan dio Targeta) u sebi. Pogađanje je s puno slobodnog mjesta brže, ali što ti je manje mjesta, to pogađanje postaje sporije i sporije.

    – For petlju u 289. redu, kao i razne ostale, bilo bi bolje napisati koristeći iteratore. Onda ne moraš sam definirati pointer iz containera nego ga dobiješ kao varijablu u for petlji, što je i brže i elegantnije.

    – Zašto si napravio klasa Tank stvara metke? To ne bi trebao bit njena zadaća.

    – Zašto klasa Target ne označava jedan target nego sve njih zajedno? I klasa Bullet isto? Bolje bi ti bilo da klasa Target označava jednu metu, a da imaš listu meta inicijaliziran na početku igre. Onda u game loop-u obavljaš logiku nad Targetima. C++ nije Python. Čak da imaš 10 milijuna objekata u listi, overhead zbog korištenja klase je praktički ne postojeć. Zato i volim C++. Ne žrtvuješ performanse ako želiš lijepu strukturu programa.

    – Metoda CTarget::Die bi trebala biti podijeljena na više njih. Nema smisla da metoda koja se zove “Die” stvara nove Targete.

    – Naravno, “using namespace sf;” nije preporučen zbog zagađenja i ekoloških razloga.

    To je sve od mene.

  4. Jako mi se svida za nekog tko ima tek 16, vec si dobio puno C++ specific komentara tako da necu o tome.

    Za dodatnu kvalitetu koda si provjeri s ovim:
    http://sonarcloud.io/

    Ja bi ti preporucio da krenes koristit Git jer vidim da si ovdje sve preko uploada stavljao. Znaci naucis stvari tipa git commit push pull sta je pull request itd. To ce ti jednog dana sigurno trebati.

    Ja bi ti za dodatni zadatak dao da pocnes koristit git, slozis automatizirane testove koji se pokrenu dok otvoris pull request i takoder da se sonarcloud aktivira isto i mozda ako ce ti se htjet da neki bot ispise code coverage.

  5. Smanji koristenje statica

    Koristi { } u if-else, lakse ces pratiti, cak ako je i jedna linija ,ako ej super kratka stavi sve u jednu liniju

    Makni continue. Continue = zlo

    Preporucujem da naucis smart pointere i koncept ownershipa, da ne moras rucno brisat resurse, to je podlozno bugovima

  6. Ja bih ti toplo preporučio da promijeniš working title (“f**k n**gers”) jer ćeš naći na probleme čim prijeđeš virtualne granice ove “zemlje”.

    Btw, jako fora retro arkada, bolja nego neke “igrice” čiju izradu neke državne ustanove plaćaju po 200 000 kuna.

Leave a Reply