Zasadniczo jesteś na dobrej drodze - musisz wiedzieć, jak długo trwa animacja, aby zrobić coś takiego. Animacje to coś więcej niż kolekcja ramek, wokół nich znajdziesz wiele innych informacji, których potrzebujesz. Np. Ile jest klatek, czy animacja zapętla się, jak szybko się odtwarza (np. 10 klatek animacji na sekundę, 25 lub 60?). Każda animacja może być zdefiniowana w oparciu o kilka elementów danych, które niektóre uogólnione kody animacji mogą przeglądać i odtwarzać. Powinieneś obudować część animacji własnym bitem kodu, który nie zna nic oprócz tych definicji animacji i sposobu wyświetlania poszczególnych ramek obrazu. Oznacza to, że masz obiekt animacyjny, który możesz załadować, rozpocząć odtwarzanie, zatrzymać odtwarzanie i kazać renderować w określonym miejscu na ekranie.
Elastyczne podejście polega na zastosowaniu pewnego rodzaju definicji animacji do enkapsulacji tego rodzaju informacji. Zamiast mówić „animacja X to wszystkie klatki, po prostu je przeglądaj”, otrzymujesz coś bardziej złożonego.
Np. Z jakimś wymyślonym formatem danych
animacje =
{
{name = "walk", files = "walk * .png", frameCount = "12", loop = "true"},
{name = "fire" files = "fire * .png" frameCount = "6",
wydarzenia = {
{name = "bulletLeavesGun", frame = "4", param1 = "43", param2 = "30"}
}
}
}
Więc twój kod mówi coś takiego:
currentAnimation = animations.Get("fire");
currentAnimation.Play();
To, jak wykrywasz zdarzenia, może polegać na tym, że kod animacji oddzwania do Ciebie (tj. Gdy wykryje nowe zdarzenie, ponieważ animacja została odtworzona do określonej klatki, wywołuje kod gry, aby poinformować go o nowym zdarzeniu), lub poprzez odpytanie animacja taka:
List<Event> events = currentAnimation.EventsSinceLastCheck();
foreach (AnimationEvent event in events)
{
if (event.name == "bulletLeavesGun")
{
Vector2 bulletPosition = new Vector2(event.param1, event.param2);
Vector2 actualBulletPosition = new Vector2(
character.x + bulletPosition.x,
character.y + bulletPosition.y);
CreateBulletAt(actualBulletPosition);
}
}
Punkty do odnotowania:
- Kod animacji powinien istnieć oddzielnie od kodu gry. Naprawdę nie chcesz, aby Twój kod rozgrywki był zbyt ściśle powiązany z problemami z odtwarzaniem animacji.
- Kod animacji wie, czy zapętlić w oparciu o definicję animacji
- Kod animacji wie, kiedy animacja jest zakończona, i może oddzwonić do innego kodu, aby powiedzieć „hej, animacja zwana„ ogniem ”właśnie się zakończyła, co chcesz teraz zrobić?”.
- Kod animacji nie wie nic o zdarzeniach poza tym, że mają one nazwę i niektóre powiązane z nimi dowolne dane (param1 i param2)
- Kod animacji wie, na której klatce jest aktualnie, a kiedy zmienia się na nową, może sprawdzić i powiedzieć „och, jestem teraz na klatce 4, co oznacza, że wydarzenie o nazwie„ ogień ”właśnie się wydarzyło, dodaj to do moją listę ostatnich wydarzeń, abym mógł powiedzieć każdemu, kto o to zapyta ”.
Jeśli nie potrzebujesz, aby wystrzelenie pocisku odbyło się w ramach animacji, ale tylko po jej zakończeniu, możesz uzyskać znacznie mniej złożony system bez pojęcia zdarzeń. Ale nadal będziesz chciał systemu, w którym animacje odtwarzają się same, wiedzą, jak długo one trwają, i może oddzwonić do kodu gry po zakończeniu animacji.