#Piszemy gre w SFML’u Lekcja 2-3

!UWAGA! Kurs leży w kategorii ‚Obsolete’ co oznacza, że może być nieaktualny, zawierać błędy i nie polecam z niego korzystać. [INFO]

@INFO: Chciałbym wyjaśnić skąd się wzięła nazwa Lekcja 2-3, otóż jest to zamiennik dla starej wersji lekcji 2 oraz lekcji 3, są one wciąż dostępne z poziomu kategorii => Piszemy grę w SFML’u.

Lekcja 3 przy nieco innej koncepcji, tzn nie używamy tekstur z jakiegoś pliku, lecz tworzymy ją wewnątrz gry, nie wyświetlamy także mapy wczytywanej z pliku. Wszystko co zobaczymy w grze będzie wygenerowane przez nasz kod.

Niestety zmartwię was nieco, jeśli chodzi o kod konieczne jest pobranie tego kodu poniżej, gdzie cofamy się niemal do pierwszej lekcji. Polecam także samodzielną analizę kodu.
DOWNLOAD

Gra będzie przypominała nieco grę Asteroids, tylko że dodamy do niej parę featerów, ta koncepcja gry będzie finalną i tutaj zajmiemy się między innymi dużo bardziej zaawansowaną kolizją.

Jeżeli mnie posłuchałeś to w kodzie powinieneś znaleźć znaczniki //1, //2, itd. Teraz zajmiemy się ich wyjaśnianiem, zaczynamy od klasy Player.

//1 – zmniejszyła nam się ilość statusów w jakie może wejść gracz, jest to spowodowane tym, że nie mamy już klatek animacji, STATUS_ALIVE oznacza że gracz jest żywy, DEAD oczywiście że jest martwy, obecnie nie będą one do niczego służyły, ale w przyszłości dopiszemy tutaj specjalne efekty jakie można będzie zebrać w grze np IMMORTAL.

//2 i //4

 

Masz tutaj pełne prawo nie wiedzieć o co chodzi, skąd się wziął jakiś index w getPosition(). Jest to spowodowane tym, że rysujemy w grze sobie wielokąt, index to odniesienie do pozycji odpowiedniego wierzchołka (wierzchołki odpowiednio są ponumerowane na obrazku powyżej).

W konstruktorze nadajemy wartość ile wierzchołków ma mieć nasza figura, a następnie odpowiednim indeksom nadajemy odpowiednie wymiary, setOrigin() ustawia punkt wg którego będziemy obsługiwać naszą figurę, a naszym przypadku to środek ciężkości. Standardowo każda figura punkt origin ma ustawiony na lewy górny róg, teraz wszystkie operacje na tej figurze np setPosition będą robione względem tego punktu, dzięki temu gdy będziemy obracać nasz „statek” będzie się on obracał wokół środka, a nie bocznego punktu. Teraz getPosition() powinno być jasne, a jeśli nie to polecam sobie przetestować ten kod poprzez usunięcie np setOrigin, zobaczycie że gdy gracz się wtedy będzie obracał będzie to robił trochę w inny sposób.

//3

Te dwie metody zastąpiły nam metody goDown, Up, itd. i w zupełności nam wystarczą, od teraz do poruszania się w grze będziemy używać jedynie strzałki w górę, która będzie zwiększała prędkość gracza oraz strzałek w lewo/prawo które będą go obracały. Kąt pod jaki gracz ma lecieć jest liczony w update.

//5

Jeśli kiedykolwiek mówiłeś na matematyce: „do niczego w życiu nie przyda mi się trygonometria: to byłeś w błędzie, użyjemy jej tutaj. Prędkość x oraz y liczymy za pomocą sinusa i cosinusa, przy czym wartość cosinusa negujemy czyli zmieniamy mu znak, tutaj w kodzie zanegowałem prędkość, ale w tym wypadku to akurat obojętne ponieważ to jest mnożenie. W argumentach sin i cos kąty zamieniamy na radiany, bez tego kod by nie działał prawidłowo.

To tyle jeżeli chodzi o omówienie tego kodu, dodam jedynie że zmieniłem w klasie Game parę rzeczy, m.in dodałem antyaliasing.

Nasz statek nie hamuje, co może być trochę utrudniające rozgrywkę, mimo że w kosmosie nie ma tarcia nie będziemy się bawić w aż taką realistykę. Dodam, że ta część poniżej powstała dużo później niż to co wcześniej, trochę pokombinowałem oraz trochę wzorowałem się na pracy innych osób, ale wracajmy do naszego tutoriala.

Zacznijmy od stopniowego przyspieszania:

Zmieniliśmy przeliczanie kątów oraz użyliśmy static_cast, ponieważ chcemy koniecznie pracować tylko na typie float, w dodatku zmieniliśmy angle/180 na angle/360, bez tego nasz statek by się poruszał w złą stronę. Jak widać zmieniliśmy także sposób nadawania prędkości, jest on stopniowy, 0.2f wpływa na prędkość z jaką przyspieszamy, jak widać przy vy tutaj ją odejmujemy, ponieważ układ współrzędnych nie jest taki jak kartezjański, tutaj wartość Y rośnie „idąc” w dół.

Zmianie uległa także metoda update()

Tutaj największą zmianą jest dodanie spowolnienia statku,a le zacznijmy omawianie od początku, teraz w move() przekazujemy gotowe wartości, także zniknął ‚-‚ sprzed vy ponieważ teraz jest w accelerate, dwie linie poniżej spowalniają nasz statek, 0.02f wpływa na szybkość z jaką nasz statek zwalnia.

W następnej lekcji zajmiemy się wrogimi jednostkami.

Kod z tej lekcji
>>Pobierz<< | >>GitHub<<


  • Olgierd Jaros

    A jak zrobić by obiekt nie zatrzymywał się by wykonać obrót, tylko rozpoczął ruch po łuku?

  • Maciej

    Poświęciłem na zrozumienie ruchu gracza dosyć dużo czasu i mimo moich wysiłków nadal nie za bardzo wiem, co konkretnie się tam dzieje. Czy mogę prosić o jakieś wytłumaczenie samego poruszania obiektu za myszką?

  • Pingback: Piszemy grę w SFML'u | Szymon Siarkiewicz()

  • Krzychu

    Posiadam dziwny problem, otóż w momencie kiedy poruszam myszką obiekt porusza się znacznie szybciej.

    • Z tego co pamiętam związane jest to z tym, że generujesz eventy, z tego co pamiętam to wyrzucenie poruszanie poza pollEvent niwelowało problem