По суті, ви на правильному шляху - вам потрібно знати, скільки часу триває анімація, щоб робити подібні речі. Анімації - це не просто колекція кадрів, навколо них є всяка інша інформація. Наприклад, скільки кадрів є, чи працює цикл анімації, як швидко відтворюється (наприклад, 10 кадрів анімації в секунду або 25, або 60?). Кожну анімацію можна визначити за допомогою декількох фрагментів даних, які деякі узагальнені коди анімації можуть переглядати та відтворювати. Вам слід укласти анімаційну частину у свій власний біт коду, який не знає нічого, крім цих визначень анімації та способів відображення окремих кадрів зображень. Тобто, майте об’єкт анімації, який ви можете завантажити, почати грати, припинити грати і сказати візуалізувати у певному місці на екрані.
Гнучкий підхід полягає у використанні свого роду анімаційного визначення для інкапсуляції подібної інформації. Тому замість того, щоб просто сказати, що «анімація X - це всі ці кадри, просто грайте через них», ви отримуєте щось трохи складніше.
Наприклад, з якимось форматируемим формою даних
анімації =
{
{name = "walk", files = "walk * .png", frameCount = "12", loop = "true"},
{name = "fire" files = "fire * .png" frameCount = "6",
події = {
{name = "bulletLeavesGun", frame = "4", param1 = "43", param2 = "30"}
}
}
}
Тож у вашому коді написано щось на кшталт:
currentAnimation = animations.Get("fire");
currentAnimation.Play();
Як виявляти події, можна або за допомогою анімаційного коду, який повертає вас назад (тобто коли він виявляє нову подію, оскільки анімація відтворюється до певного кадру, він називає ваш ігровий код, щоб повідомити про нову подію), або опитуючи анімація так:
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);
}
}
Бали, які слід зазначити:
- Анімаційний код повинен існувати окремо від коду гри. Ви дійсно не хочете, щоб ваш ігровий код був занадто щільно прив’язаний до гайок і болтів відтворення анімації.
- Код анімації знає, чи потрібно циклічно робити, залежно від визначення анімації
- Код анімації знає, коли анімація зроблена, і може передзвонити на якийсь інший код, щоб сказати: «Ей, анімація під назвою« вогонь »щойно закінчена. Що ти хочеш зараз зробити?»
- Код анімації нічого не знає про події, крім того, що вони мають ім'я та деякі довільні дані, пов’язані з ними (param1 та param2)
- Код анімації знає, на якому кадрі він перебуває в даний момент, і коли він зміниться на новий кадр, він може перевірити і сказати "о, я зараз на кадрі 4, це означає, що ця подія під назвою" пожежа "щойно відбулася, додайте це до мій список останніх подій, тому я можу сказати кожному, хто про це запитує ».
Якщо ви не потребуєте вистрілу кулі в анімації, але лише після того, як вона закінчиться, ви можете піти з набагато менш складною системою без поняття подій. Але ви все одно хочете, щоб система, де анімації відтворювались самостійно, знала, як довго вони тривають, і зможете передзвонити до ігрового коду, коли анімація завершиться.