SFML-owe zabawy #1 - Wycentrowany puzelek


2018-07-05, 00:00

Tak jak zapowiadałem w poprzednim wpisie - robimy projekt! Dziś na szybko opowiem Wam główne koncepcje oraz zasady kontrybucji. Mam nadzieję, że wyjdzie nam coś świetnego. Do dzieła! :)

Scenariusz główny

Podstawowy scenariusz, który chciałbym wdrożyć:

Otwieramy program. W menu pojawia się przycisk “Create World”. Po kliknięciu uruchamia się panel, w którym możemy przeciągać elementy gry wg zdefiniowanej siatki. Po zakończeniu etapu tworzenia świata klikamy przycisk “Play”. Umieszczamy bohatera na mapie i po naciśnięciu klawisza Enter - gramy.

Na pierwszy rzut oka nie jest on skomplikowany, ale już można założyć potrzebę implementacji takich mechanizmów jak:

  • drag & drop
  • sterowanie bohaterem
  • wykrywanie kolizji

Czyli będzie zabawy na conajmniej kilka tygodni :) Po zaimplementowaniu pierwszego scenariusza zabierzemy się za release wersji prototypowej i dokładanie nowych opcji. Nie mogę się doczekać!

Organizacja wspólnej pracy

W niedzielę założyłem repozytorium na naszym GitHubie, do którego będę dorzucał kod: https://github.com/CppPolska/MarioEdit. Jeżeli macie jakieś zastrzeżenia, albo chcecie dorzucić feature - zachęcam do otworzenia pull-requesta. Jeżeli zarówno kod jak i funkcjonalność będą dobre, na pewno domergujemy je do mastera.

MarioEdit: co już mamy?

Do utworzonego przeze mnie repozytorium już coś dorzuciłem :) Póki co na środku mamy kafelek ze słynnym pytajnikiem. Po najechaniu na niego kursorem myszy kafelek się powiększa. Niby nic wielkiego, ale już mnie cieszy :)

Pierwszy kod

Źródełka znajdują się w katalogu src. Wewnątrz mamy katalog classes w którym znajduje się logika biznesowa projektu oraz katalog tests na testy automatyczne. Klasą, od której wszystko się zaczyna to Game. Tutaj tworzymy okno, inicjujemy klasy zależne od klasy RenderWindow, obsługujemy pętlę główną.

Kafelki

Gry platformowe często składają się z kafelków (ang. tiles). W skrócie: każdy element gry to prostokąt o określonych wymiarach i teksturze. Jeżeli coś nie wygląda jak prostokąt, to znaczy że część tekstury jest przeźroczysta. Niemniej jednak wszelkie obliczenia (kolizje, zdarzenia kursora myszki itp) obliczane są na podstawie wymiarów kafelka. Fajną opcją jest składanie większych elementów świata z kafelków (np. generowanie komina). Chyba w tą stronę będę chciał pójść w przyszłości. A co Wy myślicie na ten temat?

Animacja kafelka

Na środku ekranu póki co znajduje się jeden kafelek. Po najechaniu na niego kursorem myszki pojawi nam się prosta “animacja” - kafelek powiększy się. W przyszłości można pokusić się o zastosowanie mechanizmów nazywanych easing, aby ten efekt był bardziej gładki. Do tego, przy kliknięciu będzie można odrobinę pomniejszyć kafelka i go przyciemnić - chyba da to wrażenie, że coś chcemy z tym kafelkiem zrobić.

Obsługa kursora myszy i klawiatury

Obsługę klawiatury też już mamy - odpowiada za to klasa Keyboard, której stan aktualizowany jest przy wystąpieniu zdarzeń sf::Event::KeyPressed oraz sf::Event::KeyReleased. Są do niej napisane testy - działa :)

Obsługa myszki - klasa Cursor. Tutaj udało mi się wychwycić moment MouseEnter oraz MouseLeave. Nie jest to zrobione idealnie, będzie potrzeba nad tym trochę popracować. Do kursora podczepiłem jakiś obrazek tak, aby nie latał po ekranie kursor systemowy - grafika jest bardzo tymczasowa.


Reasumując: Nie ma tego wiele, jest to bardzo mały zalążek. Nie zmienia to jednak tego, że mamy spory potencjał w projekcie do wykorzystania :)

Co dalej?

Pracę nad projektem chciałbym podzielić na krótkie iteracje, w których znajdować się będzie kilka rzeczy do zrobienia. Wolałbym nie planować projektu z góry, ponieważ koncepcje projektu mogą się zmieniać, gdy ten zacznie nabierać kształtu. Najbliższą iterację projektu chcę poświęcić na ulepszenie mechanizmu budowania:

  1. Podpięcie źródeł GoogleTest i SFML, aby całość kompilowała się pod systemami Windows/Linux/MacOs w jednakowy sposób
  2. Poprawa skryptu budowania, instrukcja kompilacji i budowania projektu
  3. Propozycja od Wojtka Razika - wdrożenie Continuous Integration - TravisCi?
  4. Poprawa skalowania ViewPort-u przy zmianie rozmiaru okna

Może ktoś z Was już na tym etapie jest chętny i dołączy do MarioEdit? Dajcie koniecznie znać w komentarzach! :)



Marcin Kukliński

Zawodowo backend developer, hobbystycznie pasjonat języka C++. Po godzinach poszerza swoją wiedzę na takie tematy jak teorii kompilacji oraz budowa formatów plików. Jego marzeniem jest stworzyć swój własny język programowania.

Pssst! Używamy Cookies. Poprzez używanie naszego serwisu zgadzasz się na odczytywanie i zapisywanie Cookies w swojej przeglądarce.