Jakieś dwa tygodnie temu zacząłem tworzyć mały projekt narzędzia, który by pozwolił mi sprawdzić w praktyce wymyślony algorytm generowania ciągu tetrisowych klocków. Jest to narzędzie w kształcie zalążka prostej gry, będącej klonem Tetrisa na konsolę NES, a która w przyszłości będzie dawała pograć w klocki, zachowując mechanikę rozgrywki zgodną z oryginalną wersją na NES-a.
Wersja dla tego posta — Fairtris 1.0.0.19 (beta)
Najświeższa wersja — Fairtris 2.3.1.2 (więcej informacji w tym poście)
Póki co, zaimplementowane są fundamenty, czyli obsługa okna i renderowania w nim zawartości, wsparcie klawiatury i kontrolerów USB (oraz możliwość mapowania klawiszy/przycisków według własnego uznania), oprogramowane są także wszystkie menu gry, ze wsparciem efektów dźwiękowych.
Dodatkowo, narzędzie obsługuje dwie skórki — ”nowoczesną” i klasyczną — które umożliwiają renderowanie gry w odcieniach ciemnych i z dodatkowymi informacjami podczas rozgrywki, lub w sposób klasyczny, zgodny z nintendowskią wersją. Skórka klasyczna zaimplementowana jest po to, aby można było Fairtrisa wykorzystać na stronie zwanej Maxout Club (stworzonej na potrzeby CTWC 2020) i sprawdzić czy mój algorytm nada się do turniejów (i jak ogólnie sprawdzi się w meczach 1vs1). Zestawienie ekranów wszystkich scen w dwóch skórkach:
Małym dodatkiem jest obsługa paska postępu na przycisku aplikacji na pasku zadań. Przycisk ten wykorzystałem do podglądu danych na temat framerate'u (liczba klatek wyświetlana w formie tekstu) oraz obciążenia procesora przez Fairtrisa. Pasek postępu w kolorze zielonym to obciążenie w normie, żółtym to średnie, a czerwonym to wysokie (co zwiastuje lagi).
Narzędzie jest stworzone jako zwykła, jednowątkowa aplikacja okienkowa, której okno pozbawione jest belki. Jeśli okno nie jest wyświetlone na pełen ekran, to można je przesuwać w dowolne miejsce pulpitu (i dowolny ekran) za pomocą lewego przycisku myszy. Rolką myszy zmienia się rozmiar okna (opcję tę można zablokować w menu ustawień gry), natomiast domyślna klawiszologia wygląda tak:
MENU:
↑ ↓ — nawigowanie po pozycjach menu,
← → — zmiana opcji danej pozycji menu,
S — wybranie aktywnej opcji menu,
Z — powrót do poprzedniego menu.
ROZGRYWKA:
← → — przesuwanie klocka na boki,
↑ — hard-drop (natychmiastowe przyklejenie klocka do stosu, z dowolnej wysokości),
↓ — soft-drop (przyspieszone opuszczanie klocka),
Z — obrót klocka odwrotnie do ruchu wskazówek zegara,
X — obrót zgodnie z ruchem wskazówek zegara,
S — pauza lub wznowienie gry,
A — ukrycie lub pokazanie następnego klocka.
Dodatkowo, przycisk F2
pozwala zresetować mapowanie klawiszy i ustawić klawiaturę jako domyślne urządzenie sterujące (w dowolnej scenie), w razie gdyby ktoś tak zepsuł mapowanie, że nie potrafi nawigować po menu. Natomiast przycisk F1
minimalizuje narzędzie i otwiera główną stronę repozytorium — w przyszłości będzie tam readme.md
, a w nim samouczek.
Dla testów różnych rzeczy, póki co, w scenie rozgrywki obsługiwany jest klawisz Select
(na klawiaturze to klawisz A
), który symuluje koniec gry i przejście do sceny z podsumowaniem rozgrywki. I również dla testów, strzałka w górę powoduje renderowanie jaśniejszego tła — to do sprawdzenia migania tła po zdobyciu tetrisa. Obie te funkcje zostaną później usunięte. Natomiast Start
(na klawiaturze S
) powoduje pokazanie menu pauzy (tu już nic się nie zmieni, jest gotowe).
W najbliższych dniach zabiorę się za implementację właściwej części, czyli samej rozgrywki i trochę to potrwa, bo chcę idealnie przenieść mechanikę z NES-a do mojego narzędzia. Tymczasem szukam chętnych do pobawienia się obecną wersją i sprawdzenia, czy wszystko działa prawidłowo. W razie czego proszę o feedback i pochwalenie się swoimi przemyśleniami. ;)