Mając do dyspozycji bibliotekę graficzną - wyświetlenie czegoś na ekranie nie jest specjalną filozofią. Inaczej ma się natomiast sprawa z wprawieniem obiektów w ruch i tej tematyce zostanie poświęcony niniejszy rozdział.
Zanim przejdziemy do właściwej części rozdziału, koniecznym jest przygotowanie struktury, która będzie reprezentowała obiekt na scenie. Struktura dla obiektu w niniejszym rozdziale będzie skromna, ponieważ jedyne co będziemy w niej przechowywali to pozycję w osiach X i Y. Na potrzeby niniejszego rozdziału struktura obiektu będzie więc wyglądała następująco:
Do tego wszystkiego dorzucimy jeszcze wektor przechowujący obiekty:
Przechowywanie wszystkich obiektów sceny w jednym kontenerze ma dla nas istotne znaczenie oraz niesie ze sobą wiele konsekwencji. Tymi konsekwencjami są:
Na chwilę obecną nie będzie nas interesowało personalizowanie własności obiektów, więc kwestie związane z dziedziczeniem nie będą na razie omawiane. W każdym razie praca na zbiorach danych jest dużo wygodniejsza i praktyczniejsza aniżeli indywidualne podejście do każdego obiektu sceny dlatego też użycie kontenera do przechowywania obiektów jest po prostu zalecane i tym samym wskazane.
Wektor, który został już przez nas stworzony wypełnimy danymi. Tymi danymi są oczywiście obiekty sceny z którymi będziemy pracować:
Obiekty jak już wspominałem w niniejszym rozdziale są skromne i posiadają jedynie swoje położenie - na nasze obecne potrzeby jest to w zupełności wystarczające.
Istotną zaletą umieszczenia wszystkich obiektów w jednym kontenerze jest możliwość łatwego implementowania wszelkiego rodzaju algorytmów. W tym wypadku będzie to algorytm rysujący obiekty na scenie:
W powyższym algorytmie przyjęto, że każdy obiekt będzie reprezentowany przez czerwone kółko - nic nie stoi oczywiście na przeszkodzie by to były sprajty, jednak im kod krótszy tym prostszy do zrozumienia, więc taka też implementacja zostanie zastosowana w niniejszym rozdziale.
Jeżeli do tej pory programowałeś tylko i wyłącznie w konsoli bądź tworzyłeś aplikacje okienkowe to z pewnością przemieszczanie obiektu z pozycji obecnej w osi x do pozycji x=100 napisałbyś tak:
Jeżeli miałbyś następnie przemieścić obiekt w osi y do pozycji y=300 to zapewne napisałbyś kod następujący:
Takie podejście tworzenia ruchu w grze jest złe z kilku powodów:
Skoro wiesz już jak nie należy robić przemieszczania obiektów to czas najwyższy zapoznać się z dobrymi i sprawdzonymi praktykami. Przyjrzyjmy się zatem uważnie naszej głównej pętli gry:
Istotą poprawnego pisania gier u podstaw jest zrozumienie jaka idea przyświeca głównej pętli gry - tą ideą oczywiście jest renderowanie jednej klatki w każdym jednym przebiegu pętli. Oznacza to, że w jednym przebiegu pętli możemy zmodyfikować pozycje wszystkich obiektów pamiętając jednocześnie, że myślimy o kolejnej klatce, która ma się pokazać użytkownikowi gry, a nie o efekcie docelowym jaki użytkownik chce osiągnąć (np. przemieścić postać z punktu A do punktu B). Przemieszczenie wspomnianej postaci z punktu A do punktu B musi nastąpić w czasie, a zatem klatka po klatce będziemy przesuwali obiekt tak aby znalazł się bliżej punktu B. Przemieszczanie obiektu możemy zrealizować np. tak:
Jeszcze lepszym rozwiązaniem będzie, jeżeli umieścimy powyższą funkcję jako metodę struktury RObject i pozbędziemy się argumentów fPredkosc oraz obiekt. Pole fPredkosc przeniesiemy oczywiście do struktury RObiekt tak abyśmy mogli każdemu obiektowi nadawać różne prędkości. Po wspomnianych przeróbkach i złożeniu kodu w całość, aplikacja będzie wyglądała następująco:
W tym rozdziale dowiedziałeś się jak powinien być zorganizowany kod w głównej pętli gry. Ponadto dowiedziałeś się w jaki sposób należy organizować kod gry od postaw tak, aby był on zarówno elastyczny jak i łatwy w utrzymaniu.