2d-platformer-00b

Wprowadzenie

@update: Tutorial przejdzie reboot (info [tutaj]). Cała seria pojawi się w nowych wpisach (te, które są teraz znikną). Kiedy pojawi się pierwsza lekcja? Nie wiem, tym razem chcę sobie przygotować prototyp tego co stworzymy, a więc musicie zaczekać aż zrobię grę „prywatnie” i dopiero wtedy zacznę dopisywać do tego tekst i go udostępniać. Pamiętajcie, że nie każdy ma wolne w wakacje, więc chwilę mi się z tym zejdzie, oczekujcie dodatkowych informacji na twitterze.

Słowem wstępu do Wstępu


Na samym początku chciałbym Cię przywitać w tym kursie. Zachęcam Cię do przeczytania tego wpisu, bo zawiera on wiele kluczowych informacji. W ramach ciekawostki dodam, że ten kurs jest zastępstwem dla mojego poprzedniego kursu [Piszemy grę w SFML’u].

Jeżeli będziesz miał jakieś pytania odnośnie konkretnej lekcji to zapraszam do komentarzy poniżej, w przypadku znalezionych błędów zapraszam do zakładki [issues]. Możesz się także skontaktować ze mną przez twittera [@S_Siarkiewicz].

Mam nadzieję, że te kurs okaże się dla Ciebie przydatny (o czym możesz dać znać np. w komentarzu) i nie przedłużając już więcej przejdźmy do właściwszej części wprowadzenia.

 

Czy ten kurs jest dla mnie? Kilka słów o wymaganiach


Jeżeli potrafisz programować w języku C++ na poziomie przynajmniej średnio-zaawansowanym, tzn. pojęcie programowania obiektowego nie jest ci obce oraz chcesz napisać swoją pierwszą grę to ten kurs jest dla Ciebie.

Jeżeli trafiłeś do tego wpisu bez znajomości programowania obiektowego lub bez umiejętności programowania w ogóle, to niestety ale najpierw musisz się doszkolić. Mini-ranking kursów, które polecam (pierwszy = najlepszy;  dodatkowo [!] oznacza „ścieżkę nauki”, którą ja podążałem):

  1. [!] [cpp0x.pl] (podstawy/obiektowy) – sam się uczyłem z tego kursu, przejście przez ten kurs wraz z samodzielnym robieniem prac domowych dostarczy ci wystarczającej wiedzy do rozpoczęcia tego kursu.
  2. [Od zera do gier kodera / Megatutorial Xion’a] – stary kurs, ale wciąż bardzo dobry.
  3. (opcjonalnie) [Kurs Mirosława Zelenta] (podstawy/obiektowy) – jako samodzielny kurs(y) raczej nie polecam (niestety część rzeczy z racji formy wideo jest pominiętych, dlatego też nie polecam jako samodzielny kurs).
  4. [!] (opcjonalnie + uzupełnienie) [Książka „Symfonia C++” – J. Grębosz] – ogólnie czytałem, jako książka uzupełniająca którą się przekartkowuje jest ok, pod wieloma względami ciężko jest ją polecić, ale może ktoś poszukuje czegoś uzupełniającego.

 

Czego mogę się spodziewać w tym kursie? (wstępne założenia)


W tym kursie zajmiemy się pisaniem gry (platformowej) od podstaw, wprowadzimy sobie także od zera bibliotekę (SFML), którą fajnie by było znać, ale nie musisz (całkowitych nowicjuszy zapraszam do [Sesji treningowej – Snake(SFML)].

Docelowo ten kurs jest skierowany do osób w wieku przynajmniej 14-15 lat, wynika to z faktu, że będziemy korzystali z „matematyki gimnazjalnej”, tzn. będziemy korzystali z następujących definicji (w nawiasach podałem wymagane definicje jedynie orientacyjnie):

  • układ kartezjański (ogólna idea);
  • wektor (punkt, długość wektora);
  • prostokąty (warunek nachodzenia na siebie dwóch prostokątów);
  • trygonometria (podstawy).

Część z tych definicji będę wprowadzał jeszcze raz, ale w przypadku części idei zdam się na Twoją wiedzę matematyczną.

Jak wspomniałem wcześniej, w tym kursie zajmiemy się pisaniem prostej gry platformowej (2D), w której poruszymy tematy takie jak (kolejność przypadkowa):

  • proste rozplanowanie gry (tylko „przelecimy” przez ten temat);
  • poruszanie i animacja postaci;
  • prostą fizykę (grawitacja, skok);
  • wczytywanie map kafelkowych;
  • prostą kolizję z innymi obiektami statycznymi (ściany, platformy, etc);
  • proste wykrywanie kolizji z obiektami dynamicznymi (np. wrogowie);
  • walka gracza z przeciwnikami;
  • „sztuczna inteligencja” przeciwników (bardzo uboga i nieskomplikowana);
  • zapisywanie stanu gry.

 

Zadania do samodzielnego wykonania


Część lekcji będzie posiadała zadania do samodzielnego wykonania, czy jeżeli wolisz: „zadania domowe”, które będą wymagały wykorzystania wiedzy uzyskanej podczas lekcji. Jednak podkreślę to jeszcze raz: to są zadania do samodzielnego wykonania.

Jeżeli ich nie zrobisz to nic się nie dzieje, najczęściej będą to rzeczy zupełnie opcjonalne: mające na celu poszukaniu własnych rozwiązań, zrobieniu czegoś lepiej lub upiększenia gry, czyli po prostu sprawdzeniu czy się potrafi wykorzystać poznaną wiedzę.

Jeżeli nie masz pomysłu jak takie zadanie rozwiązać, lecz chcesz wiedzieć jak takie rozwiązanie może wyglądać, to przy każdej pracy domowej znajduje się rozwiązanie, jednak bez wyjaśnienia! Jest to celowy zabieg, który w razie niezrozumienia czegoś ma na celu zmusić cię do przeanalizowania lekcji raz jeszcze (rozwiązanie zadanie zawsze będzie opierało się na poznanej wiedzy, więc odpowiedź jest zawsze gdzieś w lekcji – wystarczy chwilę poszukać i pomyśleć).

 

Schematyczny wygląd lekcji


Każda lekcja będzie składała się z kilku części:

  1. Wprowadzenia do tematu, czyli części typowo teoretycznej.
  2. Następnie kodu, do którego wyjaśnienia będą dopiero pod listingami (znowu: jest to sposób na zachęcenie Cię do samodzielnej analizy kodu).
  3. Pod koniec lekcji można się spodziewać Przydatnych Materiałów (spisu /najczęściej/ linków do których warto zajrzeć).
  4. Pracy domowej (wraz z rozwiązaniem).

 

Dostępność kodu


Kompletny kod z każdej lekcji będzie dostępny w [Repozytorium], przy czym każda lekcja będzie na swoim własnym odpowiednio nazwanym branch’u (np. Lekcja 1 o nazwie „[1] <jakaś nazwa>”, będzie znajdowała się w branch’u o nazwie: „Lekcja 1”); na master będzie kod z najbardziej aktualnej lekcji.

O ile kod z pracy domowej nie jest wymagany do kontynuowania kolejnych lekcji tak on będzie dostępny wyłącznie na blogu (mowa tutaj o przykładowych rozwiązaniach opcjonalnych części pracy domowej), a dopiero na samym końcu poradnika wszystkie prace domowe zostaną zintegrowane z całością.

Jeżeli pojęcie systemu kontroli wersji jest ci obce (i pewnie jest), to zapraszam do [Podstaw Git’a].

 

Sprawy techniczne


Poradnik jest oryginalnie pisany pod [SFML] w wersji 2.3.2, jednak powinien być także kompatybilny z późniejszymi wersjami (na szczęście SFML zachowuje kompatybilność wsteczną).

Do pisania kodu używam Microsoft Visual Studio 2015 Community, jednak Ty możesz korzystać ze swojego ulubionego środowiska (wszystko, byle nie DevCpp), np. może to być Visual w innej wersji, czy też Code::Blocks.

Jak nietrudno się domyślić ja będę korzystał z Windows‚a, dodajmy jeszcze że w wersji 64bit (ale to nie powinno mieć większego wpływu na pisanie projektu, więc jeżeli jakimś cudem masz wciąż 32-bitowy system to nie ma problemu).

Jeżeli chodzi o spis wszystkich lekcji, to wszystkie znajdują się pod swoją kategorią [Piszemy platformówkę 2D].

Co do częstotliwości nowych wpisów, to absolutnie niczego nie obiecuję i pozostańmy przy wersji, że przynajmniej raz na miesiąc się coś pojawi. Materiały ekskluzywne (specjalne zapowiedzi) będą publikowane na moim Twitterze z kolei informacje o pojawieniu się nowej lekcji będą dostępne na Twitterze oraz Facebook’u.

 

Dlaczego SFML?


Możesz się zastanawiać dlaczego mój wybór padł na SFML, a nie np na Unity, które w pewnym sensie jest prostsze niż SFML, a ilość pisanego tam kodu jest niewielka (wiele rzeczy jest już zrobiona za nas „za darmo”).

Otóż: celem tego kursu jest pokazanie w jaki sposób myśli się przy pisaniu gier, jakich technik się używa, w jaki sposób coś działa. W momencie gdy przejdziesz przez ten kurs i dopiero wtedy przejdziesz do kursu Unity to zauważysz, że wiele rzeczy jest dla Ciebie oczywistych, naturalnych i intuicyjnych (SFML pozwala zejść „niżej” niż Unity, ale wciąż jest na tyle „wysoko”, aby było stosunkowo proste i zrozumiałe).

W przeciwnym przypadku, tzn. rozpoczęcia nauki od Unity wiele trywialnych rzeczy będzie dla Ciebie niejasnych, nie będziesz także w stanie napisać niczego bardziej skomplikowanego ponieważ nie będziesz w stanie zrozumieć jak dana funkcja działa lub nawet nie przyjdzie Ci do głowy, że może ona istnieć (pomijam już fakt, że Unity wymaga innego sposobu myślenia, co może też stanowić problem).

W SFML wiele rzeczy będziemy musieli napisać sami, bardzo często prawie od zera. Ale to dobrze! Zobaczysz, że zdobyta w ten sposób wiedza jest uniwersalna i pomoże ci pisać gry lepsze i wydajniejsze.

@Changelog


Changelog, czyli spis zmian / założeń powstałych w trakcie pisania kursu (po publikacji danej lekcji)

  • Wprowadzenie – zrezygnowałem z idei forum na którym pojawiałyby się Wasze pytania, zadawajcie je w komentarzach lub [issues]

 

Przydatne materiały


  1. [Repozytorium projektu] – repo zawierające kod projektu.
  2. [Piszemy Platformówkę 2D] – odnośnik do kategorii zawierającej wszystkie wpisy z tej serii.

W pierwszej lekcji zajmiemy się wstępnym rozplanowaniem naszej gry.

Code ON!


  • Michał Karaś

    No to już nie mogę się doczekać 🙂

  • Adam Pajkert

    No no no 😀 A możemy się spodziewać osobnego brancha w którym gra będzie rozwijana po tutorialu? Kto wie, może oprócz mnie ktoś by się zainteresował i powstało by coś fajnego ^^

    • Gra pod ten poradnik jest pisana w taki sposób aby być bazą pod kolejne poradniki (co będzie widać że schematu z pierwszej lekcji)

  • Maciej Gwiżdż

    Zapowiada się

  • mcjulcz 44

    Nie mogę się już doczekać 🙂
    PS: Dziś kończę mojego snake’a w SFML’u i chętnie go porównam z tym na streamie 🙂

    • Adam Pajkert

      Fajny by było gdybyśmy mieli miejsce na podzielenie się swoimi projekcikami tutaj 😀 Chętniej zobaczyłbym twojego Snake’a. Może wrzucisz na Warsztat.gd?

      • mcjulcz 44

        Chętnie dodam jak skończę(pewnie za jakieś 2-3 godziny) 😉 Muszę jeszcze dodać „owocki”, które wąż by zjadał oraz samą śmierć węża, gdy ten spróbuje siebie zjeść. Sama mechanika węża, jak i on sam działa już bez zarzutu 🙂
        PS: Zawsze wolałem siedzieć po nocach niż po południu 😛

        • Adam Pajkert

          TVN nie jesteś sam 😀 Powodzenia 😀

          • mcjulcz 44

            Jednak wstawię jutro :/ Muszę wymyślić algorytm do wstawiania „owocka” w odpowiednie miejsca.

          • Adam Pajkert

            – Wstawiasz w randomowe miejsce
            – Sprawdzasz czy nie ma tam węża
            – Jeśli jest to przesuwasz o jedno pole w którąś stronę
            – Jeśli dalej jest na niej wąż – powtarzaj aż ci braknie stron 😀
            – Jeśli nie znalazł miejsca a natknął się na koniec mapy, powtórz algorytm

            Taki na szybko, nie jest mega wydajny, lecz spełni zadanie. Potem będziesz mógł go łatwo zmienić 😀

      • Jeżeli projekt jest skończony i chcecie się nim pochwalić to wystarczy wysłać maila, wtedy wymyśli się jakoś formę promocji. Mimo wszystko polecam warsztat.gd

  • Storkeus

    Brzmi bardzo Ciekawie, skorzystałem z jednego czy dwóch rozdziałów poprzedniego poradnika kiedy tworzyłem grę-prezent świąteczny dla mojego nauczyciela w liceum, teraz chciałem zapoznać się z resztą, a tu nowy poradnik, czekam z niecierpliwością.

    • Jakby co to poprzedni wciąż istnieje, tylko że jest w kategorii Obsolete (musisz ją wybrać z panelu po prawej).

      • Storkeus

        Wiem wiem, ale wolę sobie nie mieszać i poczekać na nowy 🙂