ANIMACJE WARSTW- IZOMETRIA W ŚWIECIE PROSTOKĄTNYM- CZEŚĆ 3

Witam wszystkich czytających ten artykuł. Powiedzmy, że jest to część trzecia cyklu o izomerii w świecie prostokątnym, choć temat poruszany w tym artykule można zastosować w dowolnie innym modelu świta 2D. Poniższy zrzut ekranu z działającego kodu dołączonego do artykułu wprowadzi w temat.

Na obrazie nie widać animacji, ale po uruchomieniu dema i po dojściu w to miejsce świata powinieneś Czytelniku zobaczyć:
-animację wody
-animację rosnącego zboża
-animację wirnika wiatraka
-animację koła młyńskiego

Sposób realizacji animacji nie jest trudny. Przebiega on dokładnie tak samo jak animacja ruchu postaci. Kolejne klatki są przerzucane przez zegar gry. W tym tekście chciałbym zwrócić uwagę na pewien problem:

Kiedy animować?

Świat gry można podzielić na warstwy, w których mogą się znaleźć: obiekty żywe, obiekty statyczne animowane lub nieanimowane.

Każdy obiekt dla stanu gry reprezentowany jest przez układ liczb- parametrów. Dla człowieka- gracza wystarczy tylko grafika. Stąd można dokonać kolejnego podziału obiektów, który prawidłowo przemyślany będzie decydować o prędkości gry. Mam nadzieję, że poniższym rysunkiem uda mi się lepiej wprowadzić w omawiane zagadnienie.

Niebieski obszar to kafle widoczne. Jednocześnie są to warstwy utworzone na zasadach opisanych w cyklu artykułówGiganty świata 2D. Do kafli tych warstw są ładowane dane przechowywane w szarych kaflach mapy świata na zasadzie taśmociągu. Idea też jest opisana w Gigantach… Taki układ organizacji podsuwa pewien pomysł na animację. Otóż animowane klatki warstw można podzielić na animację wpływającą na zachowanie poza częścią widoczną lub nie wpływającą. To znaczy: na przykład animacja wody nie ma żadnego wpływu na to, co się dzieje poza częścią widoczną. To samo dotyczy ruchu wirnika wiatraków czy koła młyńskiego. Przykładów można mnożyć. Ale może wystąpić taka animacja, która stanem swych klatek będzie o czymś decydować i poza częścią widoczną. Może to być zboże lub inne uprawy. Chodzi mi o to, że żniwa będą w tedy, gdy zboże dojrzeje. Czyli jest to na przykład dziesiąta klatka animacji. Tak więc, życie poza częścią widoczną musi się toczyć na tych samych zasadach co w części widocznej. Jedynie rezygnuje się z wyświetlania klatek. Ze zliczania nie. Mając to na uwadze należy wprowadzić podział animowanych obiektów.
W kodzie programu utworzyłem do tego zarys klasy TCykl, zapisanej w unit UnitCyklSwiata. Rozbudowując tą klasę można obsłużyć wiele zdarzeń. Na przykład produkcja jednostek, szkolenie itp. Procedura zliczająca klatki dla obiektów dopisanych do TList tej klasy wywoływana jest w zegarze gry

Wynik zliczeń animacji jest pamiętany w wybranych kaflach świata gry. Jest to ten rekord danych

Dla elementów typu woda, wiatrak, młyn itp. Takie zliczanie odbywa się w kaflach warstwach widocznych. Takich kafli jest dużo mniej niż wszystkich kafli świata 2D. Wynik zliczeń jest zapisywany tym samym rekordzie pojedynczego kafla i przerzucany podczas przesuwania świata na tych samych zasadach co obrazy. W kodzie programu wykonuje to nowa procedura dopisana w tej części

procedure Animacja;

Procedura ta występuje w klasie TKostkaMapy oraz TKostkaGruntuMapy Jedynie należy podczas ładowania świat zdecydować, co mam być animowane. Konkretnie wybrać kafle.

Wybór kafli do animacji

Jest to ważny element struktury organizacji zapisu świata gry. Ja ze swojego rozwiązania nie jestem w pełni zadowolony. Otóż świat buduję w swoim edytorze, który ma być uniwersalnym edytorem. No i do końca nie jestem zdecydowany jak tą uniwersalność zapewnić. Tak wiec w kodzie dołączonym do artykułu dopisałem pewną stałą tablicę przechowującą dane o animowanych obiektach

Teraz jedynie podczas ładowania gry sprawdzam czy danej klatce warstwy istnieje wybrany obiekt. Jeżeli tak to na taką klatkę ustawiam flagę animacji. Patrz kod

Takie podejście wydłuża czas ładowania pliku.A plik jest duży bo zawiera 512×384 kafli w trzech warstwach. Co daje 589824 kafli. Taki mały gigant. Lepszym rozwiązaniem byłoby ustalenie tego w momencie tworzenia świata. Czyli edytorze.

Animacja w pojedynczym kaflu

W tej części do kodu wprowadziłem do wszystkich warstw możliwość wyświetlania dwóch obrazów w jednym kaflu. W poprzedniej części było to zastosowane do płynnych przejść terenu. Teraz taką właściwość posiada każdy kafel. Praktycznie daje to nam aż sześć warstw rysunku. Dużo. Można, więc zrezygnować z trzeciej warstwy. Na pewno wydatnie przyspieszy to grę. Aby to sprawdzić należy wyrzucić z kodu te linie zaznaczone czerwoną czcionką

oraz

Ale nie o tym chcę tu napisać. Na stronie grafika 2D z której pobrałem grafikę klatki do animacji na przykład młyna są tak zorganizowane

Co prowadzi do takiego rozwiązania: wyświetl budynek a potem animowane klatki koła w odpowiednich współrzędnych. Cały proces animacji przebiega w tej procedurze

Dla warstwy gruntu jest bardzo podobnie. Jedynie nie ma tam możliwości nakładania klatek z poza obrazu innego niż rysunek wyświetlany na pierwszym obrazie. Ponieważ zakładam ze cały grunt i wszystkie jego klatki animacji można, zapisać w jednym obrazie. Tak jak poniżej

Można teraz sobie wyobrazić, że dodajemy tu klatki animacji błota, lawy, ruchomych pisaków itp. Jednym obrazem załatwiamy cały grunt świata 2D. Wyświetlanie obu obrazów w jednym kaflu wykonuje procedura

I to by było na tyle w tej części.

Pozdrawiam Adam Lasko (oksal) Zbylitowska Góra 1 XII 2007

PS
Do prawidłowego działania przykładu wymagane są te pliki

swiat_512x384.mue2D
teren_rosliny.oil
swiatynie.oil
zamki.oil
pierwotny001.oil
wiatrak.oil
mlyn.oil
D3DX81AB.DLL
MPPSDK.DLL

Plik swiat_512x384.mue2D został zmieniony co do organizacji zapisu. Nie będzie prawidłowo czytany dla poprzednich części i na odwrót.

Autor: oksal

Załączniki

  • zip izo3
    Rozmiar pliku: 6 MB