Arkanoid - codereview

0

Chcę nauczyć się kolejnego języka programowania. Padło na c++, a że ja najlepiej przyswajam wiedzę robiąc coś a nie wkuwając teorię to napisałem sobie arkanoida przy użyciu SDL i OpenGL.
Wiem, że kod nie jest idealny i wymaga poprawek jednak wrzucam go by nie robić poprawek w ciemno tylko by uzyskać rady i wskazówki jak zrobić to dobrze.

Kilka informacji na temat "ficzerów" gry:

  1. Cztery mapy.
  2. Trzy piłeczki ("życia").
  3. Splash screen i ekrany powiadamiające o wygranej/przegranej/przejściu poziomu.

Znane bugi:

  1. Kolizje nie są do końca poprawnie wykrywane. Prawdopodobnie spowodowane jest to tym że róg prostokąta należy tak samo do poziomej ściany jak i pionowej przez co gdy sprawdzam kolizję ze ścianami to wykrywa ją podwójnie.
  2. Nie zwalnia tekstur przez co są wycieki pamięci.

TODO:

  1. Menu.
  2. Punkty za zbijanie bloczków.
  3. Wyświetlanie punktów i ilości pozostałych piłeczek.
  4. Większa ilość bloczków które trzeba zbić uderzając 2 lub więcej razy.
  5. Bonusy (szersza paletka, dodatkowa piłeczka, większa/mniejsza prędkość piłeczki itp.).
  6. Większa ilość map.
  7. Grafika (jakieś sensowne tekstury).
  8. Dźwięk.

Poprawki w kodzie które wiem, że muszę zrobić:

  1. Wydzielenie klasy bazowej dla podstawowego obiektu gry po której będą dziedziczyły klasy paletki, piłeczki, bloczku i poziomu.
  2. Wydzielenie klasy bazowej dla ekranów typu SplashScreen czy informujących o przejściu poziomu/gry itp.

Najbardziej interesuje mnie informacja czy mam w kodzie jakieś UB i jak się go pozbyć, oraz jakie są zasady formatowania kodu c++, ale oczywiście każda wskazówka, rada czy konstruktywna krytyka jest mile widziana :)

Kod w załączniku. Zwykłe archiwum RAR wirusów nie ma ewentualnie link do GitHub: https://github.com/babubabu89/Arkanoid

1

Wrzuć kod na jakieś zdalne repozytorium typu GitHub, nie będzie problemów.

2

Dla wszystkich chętnych wypowiedzieć się w tym wątku. Albo rzućcie okiem na kod i go skomentujcie, albo idźcie stąd i swoje śmieszne wywody na temat sensu uczenia się tego języka czy - jeszcze śmieszniejsze - na temat ego i innych bredni niemających potwierdzenia w rzeczywistości zachowajcie dla siebie.

Jeśli nie potraficie czytać ze zrozumieniem i odpowiadać na temat to ograniczcie swój udział w tym serwisie do inkrementacji licznika gości u dołu strony, bo wasze nic nie warte posty będą dwuklikiem kasowane i tylko zmarnujecie czas (swój rzecz jasna).

1
  1. Raczej graphics niż graphic.
  2. Jakiś makefile by się przydał.
  3. Staraj się ograniczać długość linii, tak do maksymalnie 120 znaków (inni proponują 100 lub nawet tradycyjne 80) — u Ciebie na przykład 45. linijka z physics2D.cpp ma 214 znaków, czyli dużo za dużo. Ja mam dwudziestosześciocalowy monitor i muszę przewijać w poziomie — coś jest nie tak…
  4. We współczesnym C++ powinno się unikać używania „gołych” wskaźników, operatorów newdelete — zamiast tego korzystać z kontenerów, czy „sprytnych wskaźników” spod znaku std::shared_ptrstd::unique_ptr. Daje to znacznie lepszą gwarancję, że koniec końców każdy obiekt zostanie poprawnie zainicjalizowany i poprawnie zakończony, bez ryzyka, że programista nie przewidzi jakiejś ścieżki (obsługa wyjątków jest częstym „winowajcą”) i będzie miał wyciek.
  5. Raczej się pisze wszystkie elementy public (czy private czy protected) razem, a nie rozdziela na zmienne i metody; szczególnie jeśli przez to masz dwa razy te słowa kluczowe używane, a niektóre puste — na pierwszy rzut oka wygląda to tak, jakbyś czegoś zapomniał wpisać.
  6. Dlaczego floaty a nie double’e?
  7. <cstdlib>, a nie <stdlib.h> w C++.
  8. ImgToTextureGameFramework.cpp mogłoby mieć powydzielane więcej funkcji, jest za długie — na przykład wydzieliłbym konwersję na 32-bitową paletę barw czy sprawdzanie bitowości, tak by ta funkcja robiła tylko to, na co wskazuje jej nazwa — tworzyła teksturę.
  9. Nie jestem wielkim fanem notacji węgierskiej, ale skoro Ty lubisz, to raczej nie problem…

Undefined Behaviour się nie dopatrzyłem, ale cała analiza kodu odbyła się „organoleptycznie”, nie przepuszczałem tego ani przez kompilator, ani potem np. przez Valgrinda.

0

@babubabu: jeśli chcesz pisać w C++ to musisz przystosować się do stylu pisania kodu w tym języku. Przepatrzyłem pliki w repo i ten kod wygląda tak, jakbyś chciał go maksymalnie upodobnić do kodu jaki zwykło się pisać w Pascalu - stąd te prefiksy T dla typów, F dla pól itd.

Poszukaj sobie jakiegoś C++ coding style guidelines i zobacz jak powinno się pisać kod w tym języku.

0

Ok trochę posiedziałem nad kodem i jest wersja 0.2 :P
"changelog":

  1. Punktacja.
  2. Wydzielona klasa bazowa dla obiektów.
  3. Funkcja rysująca cyferki.
  4. Zmiana tekstury bloczku
  5. Dwa nowe bloczki (żeby zniszczyć trzeba uderzyć piłeczką 2 lub 3 razy).

Ciekawi mnie czy ktoś nabierze ochoty by przejrzeć kod :P

EDIT:
Zapomniałem o makefile :P

EDIT 2:
No i oczywiście link to github: https://github.com/babubabu89/Arkanoid

0

Przydałoby się, abyś też wrzucał wersję release, żeby móc odpalić gierkę bez konieczności jej kompilacji (czyli plik wykonywalny z pozostałymi binarkami, grafikami itd.). Przyda się też link do VirusTotal, aby być wiarygodnym.

1 użytkowników online, w tym zalogowanych: 0, gości: 1