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

[SFML] Zombie Defence - ocena kodu

Object Storage Arubacloud
+7 głosów
675 wizyt
pytanie zadane 17 kwietnia 2016 w Nasze projekty przez Paweł Głomski Obywatel (1,650 p.)
edycja 18 kwietnia 2016 przez Paweł Głomski

Mój 2 projekt napisany w celu ogarnięcia SFML jak i programowania obiektowego.

Kod: https://github.com/Altez/Zombie-Defence

Paczka: https://drive.google.com/file/d/0BzcSF36gJHTKZVZoYkg0Q1JfeEE/view?usp=sharing


  • STEROWANIE

Poruszanie się: W S A D;

Celowanie: Mysz;

Zmiana broni: Przyciski: 1, 2 (broń 2. trzeba kupić)

Przeładowanie: Przycisk R.


  • ROZGRYWKA

Gra ma widok top-down.

Jesteś zamknięty w kwadratowym pomieszczeniu. Zombie nadchodzą z każdego z jego rogów.

Gra nie ma końca, co każdy etap gry ilość przeciwników do zabicia zwiększa się o 10. Szybkość spawnu zombie także się zwiększa.

Na końcu każdej fali można coś kupić w sklepie (nie dodałem żadynch efektów dla kupionych już broni, a AK można kupić po 2 fali)


Gra wygląda podobnie do tej: http://forum.pasja-informatyki.pl/105493/zombie-arena-gra-w-sfml , chociaż nie wzorowałem się na niej, lecz na tej: http://www.gry.jeja.pl/121,zemsta-zombie.html 

Do projektu mam zamiar dodać jeszcze parę rzeczy, po czym chcę zająć się OpenGL.

Powiedzcie co myślicie o moim kodzie, oraz podeślijcie proszę kursy OpengGl'a, które uważacie za przystępne.

komentarz 29 maja 2016 przez Maciek123233 Gaduła (3,400 p.)
Mam pytanie, ile trzeba uczyć się SFML że już móc zrobić taką grę? Dopiero zaczynam naukę SFM, dosłownie wczoraj poznałem jak stworzyć okno (Render window) z tąd to pytanie.
komentarz 29 maja 2016 przez Paweł Głomski Obywatel (1,650 p.)
W samym SFML'u siedzę jakoś od połowy stycznia, ale coś na podobnym poziomie stworzyłem w marcu, tyle, że z dużo gorszym kodem.

Robiąc projekty w SFML'u próbowałem nauczyć się przy okazji samego programowania obiektowego, więc jeśli już to ogarniasz, to na pewno zajmie Ci to mniej czasu.

6 odpowiedzi

+1 głos
odpowiedź 17 kwietnia 2016 przez Mateusz11 Pasjonat (22,910 p.)
Gra fajna, co do kodu się nie wypowiem, ale na każdej innej fali przydałoby się usunąć martwych zombie bo ciężko odróżnić które są żywe a które nie
komentarz 17 kwietnia 2016 przez Paweł Głomski Obywatel (1,650 p.)
Właśnie o to chodzi :) Jakbyś pograł w oryginał, to zrozumiałbyś :)
+1 głos
odpowiedź 17 kwietnia 2016 przez pietrzakacper Mądrala (7,480 p.)
Fajny projekt, mam nadzieję, że bawiłeś się przy nim tak dobrze jak ja przy swoim xD

Jedna rzecz która mi przeszkadza to zombie nie reagujące na zderzenie ze sobą. W efekcie jeśli chodzisz dookoła nich nachodzą na siebie.

Jak zerknę w kod to się więcej wypowiem :)
komentarz 17 kwietnia 2016 przez Paweł Głomski Obywatel (1,650 p.)
Jest to jedna z rzeczy, które mam zamiar jeszcze dodać, mianowicie reagowanie przeciwników na otoczenie - znajdowanie najkrótszej drogi do celu z uwzględnieniem przeszkód. Wtedy może rozszerzę grę o nowe mapy.

Drugą jest multiplayer, ale nie wiem czy nie będzie to wymagało jakiś większych zmian, ponieważ jeszcze nigdy się w to nie bawiłem.
komentarz 17 kwietnia 2016 przez pietrzakacper Mądrala (7,480 p.)
Powodzenia w takim razie :)
komentarz 17 kwietnia 2016 przez Paweł Głomski Obywatel (1,650 p.)
Dzi-dzięki, przyda się :)
komentarz 18 kwietnia 2016 przez Paweł Głomski Obywatel (1,650 p.)
Dodałem te zderzenia przeciwników, O dziwo było całkiem łatwo, a przez to, że mam dodany odrzut przeciwnika przy trafieniu, to gdy trafi się jednego z grupy, efekt jest całkiem fajny :)
komentarz 19 kwietnia 2016 przez pietrzakacper Mądrala (7,480 p.)

Faktycznie fajnie to wygląda :)

+1 głos
odpowiedź 27 kwietnia 2016 przez Lafoniz Gaduła (4,370 p.)
edycja 27 kwietnia 2016 przez Lafoniz

1. Dlaczego na Twoim repozytorium wszystkie pliki wrzucone są do jednego katalogu? Bardzo ciężko jest przez to zorientować się z czego zbudowany jest projekt.

2. Dlaczego niektóre nazwy plików w ogóle mi nie mówią na temat ich funkcjonalności? "AK" to nie jest dobra nazwa dla pliku.

3. Dlaczego nie stosujesz jednolitej metody nazywania plików? "Ai_manager", "GameButton", "Zombie Defence". Według mnie powinieneś wybrać jedną metodę i się jej do końca trzymać, ulepsza to czytelność i estetykę.

Przejdę teraz do pliku: "Zombie Defence"

a) Zmienne screenWidth oraz screenHeight są typu int, tymczasem konstruktor sf::VideoMode przyjmuje unsigned int.

b) Byłoby według mnie czytelniej i jaśniej, gdybyś stworzył zamiast dwóch zmiennych, jedną typu sf::Vector2u która opisywałaby wymiary ekranu.

c) Nie wiem jaki był Twój plan przy tworzeniu gry, ale ustaliłeś z góry szerokość i wysokość okna. W tym momencie włączenie Twojej gry na pewnych platformach może być przez to niemożliwe. Spróbuj w przyszłości napisać projekt, który uwzględni fakt, że ludzie korzystają z urządzeń o różnych rozdzielczościach. Metody sf::VideoMode::getDesktopMode oraz sf::VideoMode::getFullscreenModes są kluczowe w tym celu, albowiem informują cię one o parametrach ekranu osoby grającej, dając możliwość odpowiedniego zareagowania. Oczywiście musiałbyś również na nowo napisać wiele algorytmów. DOPISEK: Zauważyłem, że dajesz grającemu możliwość zmiany rozdzielczości, to dobrze z Twojej strony.

d) Zamiast makra NULL, powinieneś wykorzystywać nullptr z C++11. Zauważ, że makro NULL to tak naprawdę 0, jeżeli poślesz do przeładowanej funkcji coś z wartością NULL może to zostać błędnie zinterpretowane jako liczba całkowita, zamiast wskaźnika.

e) W twojej pętli głównej korzystasz z "głupich" wskaźników (Survival*), czyli musisz samodzielnie martwić się o zwolnienie pamięci. W standardowej sytuacji to żaden kłopot, ale zastanów się co stanie się, gdy na przykład funkcja Game::run() wyrzuci wyjątek? Pamięć nie zostanie zwolniona i powstaną przecieki. Zamiast surowych wskaźników powinieneś używać "mądrych" wskaźników ze standardu C++11. Czyli np. std::unique_ptr<Survival>. Jaka jest zaleta takiego rozwiązania? W momencie, gdy program wyjdzie poza zasięg "mądrego" wskaźnika, obiekt ten zostanie automatycznie zwolniony, nie musisz nigdzie zabezpieczać się operatorami delete czyli delete[].

f) Osobiście nie użyłbym tego: "using namespace sf;". Podobnie z przestrzenią nazw std. Dlaczego? Zauważ, że pisząc grę będziesz często tworzyć klasy, które będą nazywać się podobnie do tych np. z SFML. Takie jak okno czy wydarzenie. Wykorzystując operator zasięgu dajesz jasny sygnał skąd pochodzą obiekty, których planujesz użyć.

g) Twoje przyciski nie wykorzystują polskich znaków. Próbowałeś coś na to poradzić? Najprostsza metoda to wykorzystanie obiektów klasy std::wstring które obsługują nasze rodzime znaki. Poczytaj o tym więcej, a całkiem łatwo zrozumiesz jak dodać obsługę dla różnych języków w swojej grze.

To jeszcze nie koniec, będę co jakiś czas dopisywał kolejne uwagi i propozycje, pozdrawiam Lafoniz.

komentarz 27 kwietnia 2016 przez Paweł Głomski Obywatel (1,650 p.)
edycja 27 kwietnia 2016 przez Paweł Głomski
Myślałem, że temat został zapomniany, a tu taka niespodzianka :).

Dzięki wielkie za rady, już poprawiłem większość rzeczy, które wymieniłeś.

1. Nie za bardzo rozumiem jak się korzysta z tego Githuba, więc wrzuciłem to tak, by po prostu było i każdy mógł zobaczyć kod bez ściągania plików.

Skoro już się wypowiedziałeś, to może umiałbyś rozwiać moje wątpliwości dot. programowania obiektowego. Mianowicie nie jestem pewny czy dobrze do tego podchodzę. Głównie chodzi mi o klasę Menu. Tworząc ją myślałem o tym, żeby była uniwersalna i mniej więcej tak samo podchodziłem do każdej innej klasy, ale z czasem zacząłem się zastanawiać, czy nie lepiej by było, gdybym tworzył od tej klasy klasy pochodne, z ustawionymi już wszystkimi wartościami, przyciskami, itp., bo jak możesz zobaczyć w Zombie Defence.cpp wszystkie przyciski do każdego menu muszę samemu tworzyć, pamiętać, by o żadnej funkcji nie zapomnieć, bo wywali jakiś błąd... Jakbym miał stworzone już "na sztywno" klasy odpowiedzialne za każde menu, to wystarczyłoby jedynie stworzyć zmienne ich typu w ZombieDefence. Według mnie byłoby to bardziej wygodne i przejrzyste, ale nie wiem jak to się ma do podejścia obiektowego, bo dotychczas przyjmowałem, że klasy mają być czymś uniwersalnym, dopiero później postanowiłem używać ich bardziej do podziału programu. Powiedz czy to jest dobre podejście :).
komentarz 27 kwietnia 2016 przez Lafoniz Gaduła (4,370 p.)

Zajrzałem do klasy Menu. Pierwszy problem na jaki zwróciłem uwagę to niekorzystanie z idiomu (techniki programowania) RAII - Resource Acquisition Is Initialization. Nie będę tego tłumaczył z ogólnego punktu widzenia, powiem tylko co to oznacza dla chociażby klasy Menu.

RAII zakłada (w tym przypadku), że zewnętrzne zasoby (takie jak sf::Texture czy sf::SoundBuffer) będziemy pozyskiwać w czasie pracy konstruktora, a oddawać w czasie działania destruktora, nigdy inaczej! Żeby być w zgodzie z RAII, nie możemy używać pośrednich funkcji do pozyskiwania zasobów, Ty w ten sposób korzystasz chociażby z Menu::loadBackground, co nie jest najlepszą techniką.

Dlaczego? Zauważ, że dla prawidłowej pracy obiektu, który korzysta z zewnętrznych zasobów dwie rzeczy muszą być spełnione:

1) Zasoby muszą zostać prawidłowo wczytane (W ogóle nie sprawdzasz czy funkcja loadFromFile zwróciła false czy true, spójrz w dokumentację i dowiedz się więcej o niej.)

2. Zasoby muszą zostać prawidłowo oddane.

Żeby Twoje menu działało, trzeba wywołać specjalną funkcję, jak zapomnisz o niej - to się zepsuje obiekt i w przypadku bardziej skomplikowanej sytuacji ciężko to będzie odnaleźć, natomiast z RAII, wczytanie zasobów zawsze się odbędzie, bo odpalenie konstruktora (jak i destruktora) jest gwarantowane.

Wcześniej podkreśliłem słowo "pozyskiwanie", nie jest to przypadek. W gruncie rzeczy klasa Menu nie powinna zajmować się wczytywaniem zewnętrznych zasobów, ona powinna jedynie dostawać je (np. pod postacią stałej referencji) od klasy, która wczytuje zasoby i nimi zarządza.

W ten sposób kod jest z punktu widzenia funkcjonalności dużo lepiej "rozmieszczony" i klasa Menu nie musi przy okazji sprawdzać, czy wczytanie zakończyło się pomyślnie - ona ma pewność, że tak było i może beztrosko z tych zasobów korzystać.

komentarz 27 kwietnia 2016 przez Paweł Głomski Obywatel (1,650 p.)
W sumie, teraz jak to czytam to wydaje się oczywiste :)

Znasz może jakieś dobre źródła, z których mógłbym dowiedzieć się o innych technikach programowania / dobrych nawykach? Moja nauka programowania obiektowego kończy się na pierwszych 7 lekcjach kursu pana Zelenta, więc zapewne reszta kodu wygląda podobnie i chyba nie ma sensu, żebyś marnował na niego czas, kiedy ja nie znam podstawowych technik...
komentarz 9 maja 2016 przez Lafoniz Gaduła (4,370 p.)
Dowiedz się kto stworzył C++ i zacznij czytać jego książki.
0 głosów
odpowiedź 17 kwietnia 2016 przez Avernis Nałogowiec (27,400 p.)
Kurs opengl masz tutaj: http://kurs-opengl.pl/
0 głosów
odpowiedź 17 kwietnia 2016 przez niezalogowany
Bardzo fajne:-)
0 głosów
odpowiedź 27 kwietnia 2016 przez Artur Wraga Obywatel (1,870 p.)
u mnie sie nie uruchamia...
komentarz 27 kwietnia 2016 przez Konrad Nabożny Stary wyjadacz (13,460 p.)
U mnie też nie.
komentarz 27 kwietnia 2016 przez Paweł Głomski Obywatel (1,650 p.)
Coś więcej powiedźcie, jak mam wam pomóc bez żadnych informacji... :)
komentarz 27 kwietnia 2016 przez Konrad Nabożny Stary wyjadacz (13,460 p.)
komentarz 27 kwietnia 2016 przez Paweł Głomski Obywatel (1,650 p.)
https://www.microsoft.com/pl-pl/download/confirmation.aspx?id=48145

Visual 2015 chyba sam instaluje tę paczkę - zawierającą brakujące biblioteki. Jeśli go nie instalowałeś to pewnie jej nie masz, stąd ten błąd.
komentarz 28 kwietnia 2016 przez Artur Wraga Obywatel (1,870 p.)
no u mnie to wyglada tak , że uruchamiam i nic sie nie dzieje tylko komputer "myśli" i mysli mysli mysli az zawiesiło się całkiem okienko eksploratora ... musialem zabic proces. jako administratoz tez nie pomoglo. Nie wiem jaki jest powod.

Podobne pytania

+21 głosów
6 odpowiedzi 1,279 wizyt
pytanie zadane 5 lutego 2016 w Nasze projekty przez pietrzakacper Mądrala (7,480 p.)
0 głosów
1 odpowiedź 225 wizyt
pytanie zadane 27 sierpnia 2017 w C i C++ przez Artur Koniec Gaduła (3,670 p.)
0 głosów
2 odpowiedzi 289 wizyt
pytanie zadane 25 grudnia 2015 w C i C++ przez pietrzakacper Mądrala (7,480 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...