Gra 2D, część 9: Efektowne przejścia między stanami
25.08.2010 - Marcin Milewski
ImplementacjaOmówiliśmy przed chwilą kilka kwestii związanych z implementacją rozwiązania. Ze względu na fakt, że w przyszłości planujemy zintegrować naszą aplikacją z jakimś językiem skryptowym (najprawdopodobniej będzie to Lua), to nasza implementacja będzie dosyć prosta. Zacznijmy od klasy reprezentującej efekt przejścia. Jej zachowanie do przesady przypomina dowolny ze stanów aplikacji - inicjalizacja, po czym wykonywanie cyklu obsłuż zdarzenia-uaktualnij-narysuj. Cechą charakterystyczną klasy efektu będzie to, że każda jej instancja będzie przechowywała poprzedni oraz następny stan aplikacji. W momencie zakończenia wykonywania kodu efektu sterowanie zostanie przekazane do tego drugiego, a aplikacja będzie działała tak, jakby tego efektu nigdy tam nie było. Opakowywanie stanów w klasie efektu.
Tak więc klasa TransitionEffect dziedziczy po AppState, oto jej ogólny schemat:
Typ efektu określa, który efekt będzie reprezentowała konkretna instancja tej klasy. Możliwa jest aktualnie jedna z trzech wartości - FadeIn, FadeOut oraz PinWheelOut. Wyliczenie TransitionEffectType definiujemy w pliku Types.h:
Efekty przejścia będą najczęściej tworzone przez stany gry takie jak menu główne, hall of fame czy ekran wyboru poziomu. Dlatego do deklaracji każdej z klas potomnych dołączamy kod pozwalający pobrać inteligentny wskaźnik na this, co oznacza zmianę klas dziedziczących po AppState według schematu:
Jak działa efekt fade-out?Zanim przejdziemy do szczegółów konstrukcji klasy efektów przejść, rzućmy okiem na sposób, w jaki możemy zaimplementować efekt fade-out (znany też jako fade to black lub bardziej ogólnie: fade to color) Przede wszystkim potrzebujemy przechowywać dwa stany: pierwszy, który będzie znikał oraz drugi, który zostanie uruchomiony po zakończeniu się efektu. Na potrzeby tego przykładu załóżmy, że efekt zawsze trwa 2 sekundy. Schemat działania wyglądałby mniej więcej tak (pseudokod):
Jak widać, implementacja jest równie prosta co opisywany efekt. Dlatego zanim przejdziemy dalej, polecamy każdemu spróbować go zaimplementować. Ilustracja przepływu sterowania, gdy używamy efektu przejścia.
Zauważmy, że napisaliśmy tutaj dokładnie jeden efekt, którego w żaden sposób nie da się modyfikować. A gdyby tak dodać możliwość definiowania czasu trwania efektu, a następnie dodać możliwość ustawienia początkowej i końcowej wartości przezroczystości? Wtedy automatycznie otrzymalibyśmy efekt fade-in. Te dwa efekty różnią się głównie tym, czy zwiększamy aktualną wartość przezroczystości czy ją zmniejszamy. Poza tym w fade-out chcemy rysować from_state, a w fade-in - to_state, ale o takie szczegóły umiemy szybko zadbać. Ponadto, dzięki możliwości manipulowania początkową oraz końcową przezroczystością, możemy tworzyć efekty częściowego zaciemnienia a następnie rozjaśnienia obrazu. Przykładową implementację zobaczymy niebawem. |
Copyright © 2008-2010 Wrocławski Portal Informatyczny
design: rafalpolito.com