Arkanoid - codereview

babubabu
  • Rejestracja:około 13 lat
  • Ostatnio:3 miesiące
  • Lokalizacja:Łódź
  • Postów:648
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

edytowany 2x, ostatnio: babubabu
flowCRANE
rarów nikt nie lubi - wrzucaj zipy jak już coś - przynajmniej system będzie umiał je rozpakować :P
babubabu
jest na githube więc nie ma problemu już :P
Althorion
Moderator C/C++
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 10 godzin
  • Postów:1605
1

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

babubabu
a popatrzę co to
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Tuchów
  • Postów:12171
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).


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
Althorion
Moderator C/C++
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 10 godzin
  • Postów:1605
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.

edytowany 1x, ostatnio: Althorion
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Tuchów
  • Postów:12171
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.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE
babubabu
  • Rejestracja:około 13 lat
  • Ostatnio:3 miesiące
  • Lokalizacja:Łódź
  • Postów:648
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

edytowany 2x, ostatnio: babubabu
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Tuchów
  • Postów:12171
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.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE
Zobacz pozostały 1 komentarz
flowCRANE
Działa na pełnym ekranie?
babubabu
jeszcze nie. Na razie hardcoded 800x600
flowCRANE
Ok, rodziałki zmieniać nie musisz, ale fullscreen musi być możliwy do włączenia :P
babubabu
Się zrobi bo to kosmetyka. Współrzędne obiektów nie są per piksel a per jednostka więc zmiany rozdzielczości fullscreeny czy inne to tylko kosmetyka nad którą posiedzę trochę później :P
flowCRANE
To oczywiste :]

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.