Gra 2D, część 2: Wyżej, dalej, szybciej - poruszanie postacią
05.01.2010 - Marcin Milewski
Poprzedni artykuł - tworzenie okna i sprite'y Następny artykuł - przewijana mapa W tym artykule zajmiemy się stworzeniem postaci sterowanej przez gracza. Stworzymy w tym celu model, według którego bohater będzie się poruszał, aby ostatecznie tchnąć w niego życie i oddać kontrolę nad nim graczowi. Artykuł ten bazuje na kodzie stworzonym w poprzedniej części cyklu, o tworzeniu okna i animacji na sprite'ach. Lekko uaktualnioną wersję źródeł można znaleźć tutaj. Oto efekt, który uzyskamy podczas tego artykułu: Na początek kilka założeń dotyczących animacji oraz poruszania postacią w grze:
Przyjmujemy, że przez pojęcie "gracza" rozumiemy osobę siedzącą przed komputerem, a postać sterowana w grze to "bohater" czy właśnie "postać". Animacja bohateraJak zaznaczyliśmy we wstępie, nasz bohater będzie mógł znajdować się w jednym z trzech stanów: idzie w prawo, idzie w lewo lub stoi. Każdemu z tych stanów odpowiada jeden wiersz na teksturze. Oto interesujący nas kawałek tej tekstury: Aktualne wymiary obrazka to 1024x1024, więc trzeba dokonać stosownego uaktualnienia w pliku Renderer.cpp w metodzie DrawSprite:
Musimy także poinformować program, gdzie na teksturze znajdują się poszczególne animacje. Przypomnijmy, że definiuje się je w pliku SpriteConfig.cpp:
Natomiast klasę Engine należy poinformować, że nasza tekstura jest teraz w pliku tex.bmp (przy okazji zmieńmy nazwę zmiennej na bardziej odpowiednią). Ponadto włączamy test przezroczystości nakazując, aby piksele, które mają współrzędną A (od Alpha) większą niż 0.5 były rysowane jako przezroczyste. Pole m_player klasy App będzie reprezentowało postać sterowaną przez gracza. Metoda SetSprites przekaże postaci informację o sprite'ach, które ma wykorzystywać do odpowiednich animacji. Pokaż/ukryj kod
Wskaźnik na obiekt bohatera dodajemy do klasy App. Należy dołączyć także odpowiedni nagłówek oraz zainicjować wskaźnik bohatera. Deklaracja klasy App wygląda teraz następująco: Pokaż/ukryj kod
Obiekt postaci należy oczywiście aktualizować oraz rysować. Zrobimy to miejscach, gdzie wcześniej aktualizowane oraz rysowane były przykładowe liczniki, czyli w metodach odpowiednio Update oraz Draw.
Szczegóły dotyczące klasy Player omówimy za chwilę. Teraz potrzebujemy jeszcze struktury, pozwalającej nam określić stan, w którym może znajdować się bohater. Zgodnie z założeniem podajemy tylko 3 stany. W pozostałych stanach będziemy odtwarzali animację któregoś ze zdefiniowanych stanów. Do opisania stanu definiujemy odpowiednie wyliczenie w pliku Types.h:
Trochę ruchu nikomu jeszcze nie zaszkodziło ;)Nasz bohater będzie poruszał się w dwuwymiarowym układzie współrzędnych. Mamy zatem ruch w poziomie oraz w pionie. Do modelowanie tego pierwszego użyjemy ruchu jednostajnego, czyli prędkość poruszania się będzie stała w dla konkretnego stanu postaci. Wyróżniamy 3 takie stany:
Pojawia się pytanie: czy taki model wiernie oddaje rzeczywistość? Odpowiedź brzmi: nie, ale to nie szkodzi. Zauważmy, że czas, w którym ciało przyspiesza (np. moment przejścia od stanu spoczynku do chodu) jest bardzo krótki. Jego pominięcie zostanie zauważone (o ile w ogóle) dopiero po dokładnym przyjrzeniu się ruchu postaci. Przypomnijmy zależności między wartościami, które występują w ruchu jednostajnym: Inaczej wygląda rzecz, kiedy przyjrzymy się ruchowi w pionie. Gdyby postać poruszała się wyłącznie góra-dół (czyli prędkość pozioma byłaby równa 0), moglibyśmy rozważyć zaniedbanie przyspieszenia w pionie. Zwróćmy także uwagę, że tor, po którym poruszałby się bohater, byłby stosunkowo krótki, więc pominięcie przyspieszenia nie byłoby widoczne na pierwszy rzut oka. Jednak, jak wspomnieliśmy, ruch naszego bohatera odbywa się w dwóch wymiarach. Kiedy postać wykona skok po skosie, to oczekiwanym torem jego ruchu będzie parabola. Zwróćmy uwagę, że ruch ten będzie trwał wystarczająco długo, aby zauważyć tor, po którym porusza się sprite. Dlatego ruch w pionie opiszemy jako połączenie ruchu jednostajnie opóźnionego (wznoszenie się postaci) z ruchem jednostajnie przyspieszonym (opadanie). Przypomnijmy wzory wykorzystywane do opisania ruchu jednostajnie przyspieszonego/opóźnionego: Na poniższej animacji widzimy dwa sposoby poruszania się postaci. Sprite po lewej jest aktualizowany z wykorzystaniem ruchu jednostajnie przyspieszonego/opóźnionego, a sprite po prawej - ruchu jednostajnego prostoliniowego: (3 ocen) |
Copyright © 2008-2010 Wrocławski Portal Informatyczny
design: rafalpolito.com