• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

The Driver - gra wyscigowa 2d, ocena

Object Storage Arubacloud
+14 głosów
899 wizyt
pytanie zadane 8 kwietnia 2017 w Nasze projekty przez 10kw10 Pasjonat (22,880 p.)

Właśnie skończyłem pisać grę i chciałbym wiedzieć co o niej sądzicie.

Proszę o ocenę, rady i wskazówki ;)

https://github.com/10kw10/The-Driver - kod

http://www.mediafire.com/file/kut84ws39g90ytc/The+Driver.rar - gra

Parę pytań:

Moim celem jest pisanie gier, czy przesiąść się na 3d i jakiś silnik np. UE4, czy może jeszcze trochę popisać w SFML lub czegoś innego się nauczyć ?

Planuje sobie kupić książkę "Czysty kod. Podręcznik dobrego programisty", przyda mi się ?

Czy kod jest czytelny ? Czy moglibyście pokazać przykłady takiego kodu ?

1
komentarz 9 kwietnia 2017 przez criss Mędrzec (172,590 p.)
// to_string dont work in CB ;(

http://tehsausage.com/mingw-to-string

7 odpowiedzi

+6 głosów
odpowiedź 9 kwietnia 2017 przez mokrowski Mędrzec (156,140 p.)

Bardzo fajna gra ...  Widoczny podział na logiczne elementy w kodzie. Widać że trochę to przemyślałeś obiektowo :-) "Przedpiścy" już napisali trochę od siebie. Część z uwag znajdziesz w książce którą chcesz kupić :-) Poprzestałem na imporcie projektu w środowisku GNU/Linux. O uwagach już usłyszałeś :-)

1. IMHO masz trochę zbyt bardzo "rozhermetyzowane" klasy. W zasadzie to "wiadra" na atrybuty i metody bez hermetyzacji :-/

2. W kilku metodach powtarza się kod który aż się prosi o parametryzację (np. w toControl(...) w Car).

3. Wybiórczo traktujesz listę inicjalizacyjną. Raz jest, raz jest niekompletna, innym razem jest nie ma. Dodaj do przełączników ostrzeżeń kompilatora -Weffc++ . Oczywiście dobrze jest zmienić włączanie nagłówków SFML'a na -isystem aby nie brał ich pod uwagę dla ostrzeżeń :-)

4. W Engine2.cpp masz zdeprecjonowaną metodę setColor(...)

5. Z metod zwracasz "magiczne" cyfry. Jakieś 0, 2... nie lepiej zrobić tam jakieś enum?

6. Mnie osobiście razi maniera nazywania klas z użyciem samych dużych liter. To kwestia czytelności. Mi nie pasuje :-)

7. Uważaj z nazwami plików ze spacją. To zawsze prędzej czy później będzie generowało problemy.

8. Zastanawiam się czy Position nie powinno być klasą wewnętrzną Ghost. Tym bardziej że w zasadzie jest używana tylko tu.

9. Nie widzę zachowanej zasady const correctness. Są metody które pomimo braku modyfikacji zasobów, nie posiadają const. 

komentarz 9 kwietnia 2017 przez 10kw10 Pasjonat (22,880 p.)
edycja 9 kwietnia 2017 przez 10kw10
1. No wlasnie srednio rozumiem te atrybuty: public, protected, private. Wiem jak one dzialaja, ale przeciez daje wszedzie public: i wszystko pieknie dziala :D

3. Jesli nie jest potrzebna to jej nie robie.

5. Sa komentarze, ale mozna ;)
+5 głosów
odpowiedź 8 kwietnia 2017 przez Knayder Nałogowiec (37,640 p.)
https://nastoletni.pl/jak-programowac-gry-najwazniejsze-elementy-w-grach-2d/

Polecam stosować się do rzeczy o których napisał autor w tym artykule :)
+5 głosów
odpowiedź 8 kwietnia 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Gra całkiem fajna i śmieszna, podoba mi się wink

Kodu zbytnio nie oceniałem, ale mam jedno poważne zastrzeżenie. Nie wiem z jakiego powodu, w includach stosujesz backslashe, zamiast slashy - przez to psujesz przenośność gry. Popraw to. Ja to zrobiłem u siebie lokalnie i udało mi się odpalić grę na Linuksie.

Dodatkowo możesz dorzucić do repozytorium plik z czcionką, testury oraz jakiś skrypt automatyzujący kompilację - np. Makefile. Wtedy nie trzeba będzie ręcznie kompilować, oraz specjalnie pobierać dodatkowej paczki z grą w celu przekopiowania plików gry.

1
komentarz 9 kwietnia 2017 przez kompowiec2 Mądrala (6,380 p.)
Github oferuje tworzenie binarek:

https://help.github.com/articles/about-releases/
+3 głosów
odpowiedź 8 kwietnia 2017 przez Dash Nałogowiec (29,650 p.)
Świetna robota. Jak na prostą gierkę wrażenie robi fizyka pojazdu, oraz rozwiązanie z wieloma miejscami wykrywania kolizji. Brakuje mi udźwiękowienia, trochę niedopracowana jest szata graficzna - menu  i czcionka, przydałoby się też bardziej rozbudowane UI, np. możliwość powrotu do menu w trakcie gry.

Dosyć dobrze masz zorganizowany kod. Moim zdaniem zanim rzucisz się na UE4 czy inny silnik 3d, popracowałbym w czystym opengl, popisał shadery itd.. Sam koncept programowania masz opanowany. Mnie osobiście po przesiadce na wyższy poziom najbardziej bolało pojmowanie blendów, materiałów, tego jak to działa od dołu, musiałem wrócić do sfml'a i nadrabiać zaległości. Co za tym idzie, przydaje się także matematyka zoorientowana wokół plani/stereo-metrii oraz operacje na macierzach, ale to w bardziej skomplikowanych projektach. Jeżeli masz zamiar konkretnie w UE4 siedzieć, to opanuj do perfekcji makra i wszystko co związane z dziedziczeniem, uwierz mi, przyda Ci się.
+3 głosów
odpowiedź 9 kwietnia 2017 przez criss Mędrzec (172,590 p.)

Gierka super :D Bardzo ładna (no może poza czcionkami) i gameplay nie jest zły.

Co do kodu, to...

  • Ciężko się go czyta głównie z powodu strasznie długich ciał metod. Podobnie klasy - w każdej jest strasznie ponapychane i metod i memberów. Klas na pewno powinno być więcej - teraz mam wrażenie że każda spełnia kilka funkcjonalności. Myślę, że chociażby kolizje dałoby się jakoś "zgeneryzować" (jest takie słowo? :D). 
  • Nazwy niektórych klas w pełni z dużych liter rzucają się w oczy. To samo w sobie nie jest oczywiście błędem (chociaż IMO lepiej trzymać ogólno-przyjętych konwencji - pierwsza litera z dużej i ew. kolejne słowa w CamelCase), ale brak konsekwencji już bardziej - niektóre nazwy tylko zaczynają się dużą literą.
  • Klasy reprezentujące coś renderowalnego powinny dziedziczyć po sf::Drawable.
  • Z powyższym też się troche wiąże brak hermetyzacji. Wszystko jest public. Powinieneś o to zadbać.
  • Zamiast osobnego obiektu sf::Clock w każdej klasie ładniej by wyglądał globalny clock (tzn. nie serio globalny, tylko w klasie GAME) i metody update w każdej klasie przyjmujące w argumencie wartość delta time. Jednocześnie masz też wtedy pewność, że wszystko się rusza w każdej klatce o ten sam czas, a w ten sposób mogą być różnice o jakieś milisekundy (tutaj raczej nie znaczące, ale w apce gdzie każda klatka jest renderowana nieco dłużej być może zaczęłoby to mieć znaczenie).
  • Metoda Position::Swap wcale nie swapuje.
  • Niektóre metody przyjmują np. boola przez referencje (i to const, co tym bardziej potwierdza brak potrzeby). Typy podstawowe taniej jest kopiować, a szczególnie 1-Bajtowego bool-a. No, może przy long double czy long long int miałoby (64 bity), ale raczej nawet nie warto tego rozważać.
  • Jakieś literkowe sprawy typu "drawAble" zamiast "drawable" ("drawable" to jedno słowo).
  • Mógłbyś robić spacje między operatorami a operandami - bardzo poprawia czytelność.

Anyway zdecydowanie najważniejszy jest pierwszy punkt. 

komentarz 9 kwietnia 2017 przez 10kw10 Pasjonat (22,880 p.)
1. Nazwy sa dlugie bo chcialem, zeby nazwa odzwierciedla to do czego sluza.

4. No wlasnie troche tego nie rozumiem, przeciez wszedzie moge dac public: i wszystko smiga.

6. Swapuje, znaczy w jedna strone i o to chodzi.
komentarz 9 kwietnia 2017 przez criss Mędrzec (172,590 p.)

1. Nie nazwy. Ciała. Metody (i klasy) robią po prostu za dużo - można to rozbić na więcej niezależnych bytów (nie mogłem znaleźć innego słowa :D). O długości nazw nawet nie wspomniałem :P

4. Chodzi o bezpieczeństwo i czytelność. Nadając wszystkiemu odpowiedni poziom dostępu kompilator cie ostrzeże nawet jak będziesz chciał zmienić z zewnątrz coś czego nie powinieneś. Dopóki ty piszesz kod, wszystko jest ok (chociaż bardzo łatwo o pomyłke), ale jakby ktoś chciał użyć twojej klasy albo ją rozbudować, to nie wiadomo co się dzieje. Udostępniając publicznie tylko kilka metod kod jest znacznie czytelniejszy i można wywnioskować co klasa robi i jak jej używać po samym kodzie. Kiedy wszystko jest publiczne, jest kompletny chaos. No i jest jednocześnie znacznie bezpieczniejszy. Powinieneś uniemożliwiać wykonywanie na klasie niezamierzonych czynności.

6. Swapuje, znaczy w dwie strony - zamieniać dane dwóch obiektów między sobą. U ciebie Swap zastępuje kopiujący operator przypisania.

 

komentarz 9 kwietnia 2017 przez 10kw10 Pasjonat (22,880 p.)
No tak, zle przeczytalem.

Zle nazwalem metode, chodzilo mi o to, ze najlepszyCzas = aktualnyCzas, a na odwrot juz nie trzeba.
komentarz 9 kwietnia 2017 przez criss Mędrzec (172,590 p.)
Tak, wiem, że to, co  robi jest celowe. Chodziło mi tylko o nieadekwatną nazwe :)
+1 głos
odpowiedź 8 kwietnia 2017 przez Dexterim Dyskutant (8,370 p.)
Gra bardzo fajna i przyjemna ;)

Jeśli chodzi o mnie to brakuje czegoś takiego jak pauza albo coś podobnego.

Ogólnie mówiąc kawał dobrej roboty ;)
0 głosów
odpowiedź 8 kwietnia 2017 przez WireNess Stary wyjadacz (11,240 p.)
W czym zrobiłeś textury?
komentarz 8 kwietnia 2017 przez 10kw10 Pasjonat (22,880 p.)
W google grafika :D
1
komentarz 8 kwietnia 2017 przez WireNess Stary wyjadacz (11,240 p.)
Mimo to niezłe :D

Komentarz dotyczący gry:

-zbyt mała prędkość

-źle się skręca

Obczajam właśnie kod, zobaczymy co się tam kryje "D
komentarz 8 kwietnia 2017 przez 10kw10 Pasjonat (22,880 p.)
Przynajmniej jedna osoba cos napisala ;)

Wystarczy zwiekszyc cyfreki

Podobne pytania

0 głosów
0 odpowiedzi 148 wizyt
pytanie zadane 3 kwietnia 2020 w C i C++ przez gorgonkowa Obywatel (1,810 p.)
0 głosów
2 odpowiedzi 286 wizyt
0 głosów
0 odpowiedzi 125 wizyt

92,666 zapytań

141,564 odpowiedzi

320,022 komentarzy

62,033 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...