Chciałbym lepiej zrozumieć, jak ludzie w prawdziwym świecie radzą sobie z animacją.
Czy ładujesz 1 duży obraz, a następnie rysujesz różne prostokąty na podstawie ramki animacji?
Czy ładujesz pliki obrazów X do tablicy i rysujesz element w tablicy na podstawie ramki animacji?
Jak radzisz sobie z posiadaniem różnych długości animacji dla różnych duszków.
Powiedzmy, że chodzenie postaci zajmuje 4–8 klatek, a fale na plaży - 2–3 klatek. Jak poradziłbyś sobie z tą sytuacją? Zobacz poniżej
Dim Waves(1) as Sprite
Dim Char(5) as Sprite
Sub Animate()
Frame += 1
Draw Char(Frame)
Draw Waves(Frame)
If Frame = 5 Then Frame = 0
End Sub
Oczywiście Fale zakończyłyby się błędem przekroczenia granicy.
A może duszek martwi się własną animacją i wcale nie dba o ramkę. Czy każdy duszek zna własną pętlę animacji?
Chciałbym, żeby animacja wiedziała, ile ma klatek. Miejsce i sposób ich przechowywania jest względnie nieistotne, z wyjątkiem problemów z wydajnością (np. Możesz chcieć mieć tę samą teksturę). Nigdy nie dodawałbym 1 do liczby klatek, dodawałbym deltaTime * animSpeed i konwertował tę wartość na liczbę całkowitą podczas wyświetlania. W ten sposób możesz spowolnić lub przyspieszyć animacje i być niezależnym od klatek na sekundę.
Więc duszek miałby animację, która się aktualizuje.
źródło
Dlaczego nie zapisać liczby klatek dla każdego z twoich obiektów? Osobiście przekazuję liczbę klatek w animacji do moich obiektów w ich konstruktorach, a następnie mam standardową funkcję Animate (), która pobiera liczbę klatek w animacji.
źródło
To zależy od wdrożenia. W moim silniku wykonuję animacje zarówno w Direct3D, jak i DirectDraw.
W DirectDraw tworzę jeden duży obraz. Wszystko i tak jest przechowywane w pamięci systemowej, co ostatecznie sprowadza się do jednowymiarowego bloku danych.
Plusy:
Cons:
Nie można po prostu skopiować jednej klatki na ekran, musisz to zrobić ręcznie.
Olbrzymi blok pamięci. Tłoczenie ramek wiąże się z karą.
W Direct3D używam osobnych tekstur. Jest tak, ponieważ nie mam pojęcia o ograniczeniach tekstury urządzenia, więc nie wiem, czy obsługuje on tekstury o wielkości całego obrazu.
Plusy:
Cons:
źródło
W moich grach przekazałem mojej klasie podstawowej Sprite wiedzę o tym, jak się rysować, a wszystkie animowane elementy dziedziczą tę wiedzę: liczba i czas trwania klatek animacji, pozycja na ekranie itp. Główna pętla gry po prostu iteruje przez wszystkie duszków, prosząc każdego o narysowanie się według własnego uznania. Wydaje się, że działa dość dobrze i jest nieco bardziej modułowy do uruchomienia: jeśli dodasz nowego duszka, który ma inną pętlę animacji (lub nawet bardziej skomplikowaną: wiele stanów animacji), nie musisz wracać i przepisywać programu Animate () procedura uwzględniająca dodatkową złożoność:
Za każdym razem, gdy wywoływana jest metoda update () duszka, wie, czy powinna przerysować tę samą klatkę co poprzednio, przejść do następnej klatki w bieżącej animacji, przejść do nowej animacji itp.
Ma to tę dodatkową zaletę, że znacznie ułatwia dostosowanie szybkości klatek w celu dostosowania do różnych prędkości renderowania zegara / platformy, ponieważ jedyną zmianą jest to, jak często wywołujesz Animate ().
źródło