ECW Dev. UI Animations
Ничего особенного, если не посмотреть в код...
В этом посте я поделился технической особенностью проекта. И вот, один из пунктиков: анимация элементов интерфейса.
Предыстория
Если не смотреть на уже готовые решения, то каким образом мы пишем анимацию? Примерно так:
Где у нас всё строго фиксировано. И текстура, и таймер, и функция анимации, и свойства, которые анимируются.
Велосипед не нужен
Дайте автомобиль
В этом проекте реализуется собственный фреймворк UI. А потому и возможность анимаций тут приходится костылять вручную. Дополнительным усложнением является то, что элементы рисуются посредством другого класса. Это означает, что сам элемент UI знать не знает ничего ни про атрибуты (текстуры, цвета, шрифты), ни про тайминги и функции для анимаций.
Единственное, что может сделать сам элемент - обозначить временную метку, когда именно произошла смена состояния.
Каково же было это печальное озарение, что одним
А базовый класс UI нуждается в жирной такой обёртке:
Аж целых 3 (5) функций, чтобы покрыть базовые потребности для анимаций.
SetVisible : чтобы иметь возможность просто "вырубить питание" для элемента и исключить его из вывода на экран.
Open/Close : то же самое, что и SetVisible, только с поддержкой анимации.
Show/Hide : то же самое, что Open/Close, только локального действия.
Но самым главным здесь является состояние b_closing, необходимое для блокировки ввода пользователя лишь с последующим переводом в состояние невидимости.
И всё?
1. Осталось только для каждого чиха прописать анимируемые атрибуты: offset, scale, color, rotation, image, text (анимация текста это вообще отдельное приключение...) и, возможно, что-то ещё
2. Для каждого анимируемого атрибута прописать свойства: timein{ delay, duration, function, target }, timeout: timein{}
3. Реализовать менеджер таймеров, который real-time будет щёлкать потенциальное количество таймеров в сотни-тысячи штук
Самое весёлое во всём этом, пожалуй, анимируемые атрибуты. Поскольку буквально для каждого спрайта нужно, например, анимировать цвет. По всем каналам отдельно. Итого, 1 color - 4 vertex - 20 float. Так это не только в памяти хранить нужно, а ещё производить постоянный расчёт lerp с использованием таймеров.
Так что это уже маленькая победа
Поскольку сейчас анимация, хоть на костылях, но честно работает из связки UI::Animated + TimersManager + Drawer