DSP: Oś Y ogarnięta (prawdopodobnie)
Prawdopodobnie udało mi się zapanować nad osią Y. Jak pisałem poprzednio zacząłem nieco gubić się w temacie umiejscowienia gracza, planszy czy przeszkody. Wszystkiemu winna jest oś Y która punkt 0 ma w lewym górnym rogu i rośnie w dół - zupełnie odwrotnie niż bym chciał 😉
Szukałem informacji czy aby nie można programowo odwrócić tej osi i przerobić jej na bardziej oczywistą, „szkolną” wersję. Niestety nie udało się.
Zajrzałem więc do kodu. Problem tkwił tylko w poruszaniu się w pionie (bo oś X działa tak jak „powinna”) więc pole do analizy było całkiem dobrze ograniczone. Potrzebowałem dobrze ograć wysokość całej planszy, umiejscowienie i wysokość gruntu oraz skok gracza.
Przed zmianami w kodzie znajdowały się m.in takie babole:
-
rysowanie przeszkody:
painter.drawRect(cls.obstacle_x + cls.background_x, cls.h - 50, cls.obstacle_w, -cls.obstacle_h)
- ujemna wysokość? -
rysowanie gruntu:
painter.drawRect(0, cls.h - 50, cls.w, 50)
- dlaczego 0? Co to jest to 50?
Musiałem zaadresować 2 problemy: wartości początkowe oraz wartości zmieniające się wraz z ruchem. Ten pierwszy zabieg pozwolił wyrzucić wszelkie magiczne ustawianie wartości poza same metody - i odpowiednie udokumentowanie ich. Dzięki temu rysowanie gruntu wygląda teraz tak: painter.drawRect(cls.ground_x, cls.ground_y, cls.ground_w, cls.ground_h)
- prawda, że lepiej? 😃 Wszystkie wartości ustawiane są teraz poza samym rysowaniem i wygląda to tak:
ground_w = w
ground_h = 50
ground_x = x
ground_y = h - ground_h # h of the stage minus ground h
W drugim przypadku, gdy gracz a tym samym sama plansza musi się ruszać również ustawiłem wszystkie wartości początkowe przeszkody w jawny sposób, aktualizowanie pozycji wrzuciłem do metody która zajmowała się aktualizacją pozycji samej planszy a w samym rysowaniu korzystałem z ładnie ustawionych wcześniej wartości. Wygląda to tak:
obstacle_w = 10
obstacle_h = 20
obstacle_x = 410
obstacle_y = h - ground_h - obstacle_h
@classmethod
def move_forward(cls):
# adjust background and all elements on the stage
cls.x -= cls.move_size
cls.obstacle_x -= cls.move_size
@classmethod
def draw(cls, painter):
# […]
# obstacle drawing
painter.setBrush(QtGui.QColor(0, 0, 255))
painter.drawRect(cls.obstacle_x, cls.obstacle_y, cls.obstacle_w, cls.obstacle_h)
Podsumowując: wszelką „obleśność” ustawianych wartości wyrzuciłem poza metody w których mogę korzystać z pięknie przygotowanych i gotowych do wykorzystania wartości typu obstacle_x
czy ground_h
i nie muszę się zastanawiać czy aby na pewno poprawnie odjąłem wartość itp. +10 do czytelności 😉
Prawdziwym sprawdzianem dla aktualnego kodu będzie kolejna funkcjonalność którą chciałbym zaimplementować - skakanie na platformy i poruszanie się po nich. Oj, będzie się działo…
Dla ciekawskich tutaj można znaleźć diffa z poprzedniej i aktualnej wersji kodu.