Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   посоветуйте годный твинер (http://www.flasher.ru/forum/showthread.php?t=211205)

undefined 12.07.2015 12:37

посоветуйте годный твинер
 
всю жизнь использовал классический флэшевый твин(fl.transitions.Tween). При этом делаю такой хак:
Код AS3:

private var tween:Tween;
public function startAnim():void {
    if (tween) {
        tween.fforward();
    }
    tween=new Tween(null,"",Regular.easeIn,0,2,0.2,true);
    tween.addEventListener(TweenEvent.MOTION_CHANGE,doAnim,false,0,true);
    tween.start();
}
private function doAnim(e:TweenEvent):void {
    if (tween.position <=1) {
        // анимация исчезновения
    } else if (tween.position >1) {
        // анимация появления
    } else if (tween.position==2) {
        //конец анимации
        tween.removeEventListener(TweenEvent.MOTION_CHANGE, doAnim);
        tween.stop();
        tween = null;
    }
}

Такой подход дает максимальную гибкость и позволяет одним методом скриптовать целые фильмы.Но вот наш дизайнер просит заанимировать разом 70-80 объектов в кадре и т.к. борьба идет за каждый такт, боюсь стандартный твин тут не сдюжит.Посоветуйте, плз, сторонний твинер что бы:
1) Был бесплатный
2) Предоставлял аналогичную гибкость
3) Рвал стандартный твин по производительности

caseyryan 12.07.2015 13:09

TweenLite, Caurina tweener

undefined 12.07.2015 13:13

caseyryan, а не покажешь пример кода-аналога из первого поста в исполнении, скажем,твинЛайта?

Добавлено через 5 минут
Мне крайне не нравится требование привязывать все к свойству анимируемого объекта, а если мне надо заанимировть,свойство text у текст филда?

Добавлено через 33 минуты
вопос скорее в том, есть ли у твинлайта хэндлер типа обычного TweenEvent.MOTION_CHANGE?

udaaff 12.07.2015 14:01

http://greensock.com/tweenlite-as

undefined 12.07.2015 14:05

Это я видел, но, похоже, твинлайт не позволяет следить за чем-нибудь типа tween.position
Что сильно ограничивает область его применения

illuzor 12.07.2015 14:09

undefined, есть TimelineLite/TimelineMax, который позволяет собирать анимации в виртуальные таймлайны и управлять ими, как угодно.

undefined 12.07.2015 14:29

Цитата:

есть TimelineLite/TimelineMax
Да, что-то близкое у них даже есть колбэк onUpdate.Но вот вопрос как внутри этого колбэка получить текущую позицию анимации?

illuzor 12.07.2015 14:32

undefined, в документации всё есть. http://greensock.com/asdocs/
Метод progress() возвращает позицию от нуля до единицы.

undefined 12.07.2015 14:59

illuzor,спасибо поковыряюсь.
2 all:Кто-нибудь может сказать из-за чего тормозит штатный твин и почему его рвут все сторонние?
Если поработать дебагером становится ясно, что штатный твин использует enterFrame.Может с этим связаны тормоза? Как тогда остальные делают? Через таймер?

Zebestov 12.07.2015 15:00

Eaze Tween — наше все!

undefined 12.07.2015 15:26

Цитата:

Eaze Tween — наше все!
Zebestov, тот же вопрос как в onUpdate узнать позицию анимации, если все, что туда передается я сам задаю?
И еще хотелось бы чтоб после вызова метода eaze что-нибудь возвращалось для управления анимацией, чтоб они не накладывались друг на друга.Меня ,впринципе, обычный твин устраивает всем кроме производительности.Все больше склоняюсь к мысли сделать свой по-быстрее.Только надо понять почему тормозит штатный, чтоб не наступать на те же грабли

Zebestov 12.07.2015 15:37

Во-первых не совсем понятна идея "управлять анимацией" с помощью твинов, которые созданы как раз для того, чтобы запрограммировать и забыть, дожидаясь, когда вся эта анимированная красота завершит движение.

Во-вторых, если надо (это редко) взять именно фазу твина, то я ее и анимирую. Ну т.е. это конечно может показаться нкудобным (а може так и есть), но мне легче раз в сто лет завести приветное поле _phase и твинить его, производя в onUpdate нужные вычисления, чем отказываться от удобного, шустрого, бесплатного твиннера. Там действительно дофига настроек, которые делают почти ненужным ручное вмешательство.

Дело вкуса :)

undefined 12.07.2015 15:47

Цитата:

Во-первых не совсем понятна идея "управлять анимацией" с помощью твинов, которые созданы как раз для того, чтобы запрограммировать и забыть, дожидаясь, когда вся эта анимированная красота завершит движение.
Например при клике запускается долгая анимация.Если юзер начнет остервенело кликать анимация не взорвется? Не хочется дизейблить кнопку пока идет анимация.А так остановил/смотал на конец начатую анимацию и начал новую.
Цитата:

но мне легче раз в сто лет завести приветное поле _phase и твинить его
Это если есть доступ к анимируемому DO.

Zebestov 12.07.2015 15:50

1. При запуске новой анимации можно прямо в твиннере указать стартовое положение + обозначить, что все прежнии анимации этого объекта следует прервать.

2. Про доступ к DO не понял. Где стартую твин — там и прописываю поле, там и обрабатываю update. Доступа к DO хватит и того, что есть по определению.

undefined 12.07.2015 16:00

Цитата:

При запуске новой анимации можно прямо в твиннере указать стартовое положение + обозначить, что все прежнии анимации этого объекта следует прервать.
А в конец смотать нельзя? Бывает, что в конце надо выполнить некий специфический код
Цитата:

2. Про доступ к DO не понял. Где стартую твин — там и прописываю поле, там и обрабатываю update. Доступа к DO хватит и того, что есть по определению.
Бр.т.е. анимируется по сути не объект, который должен двигаться/ меняться,а его родитель? А если анимаций несколько?

Zebestov 12.07.2015 16:12

Цитата:

Сообщение от undefined (Сообщение 1184849)
А в конец смотать нельзя? Бывает, что в конце надо выполнить некий специфический код.

onComplete же!

Цитата:

Сообщение от undefined (Сообщение 1184849)
т.е. анимируется по сути не объект, который должен двигаться/меняться, а его родитель? А если анимаций несколько?

Нет. Анимируется переменная phase там, где ты твиннер "заводишь". А в onUpdate ты на основании этой переменной phase делаешь с любым доступным объектом все, что душе угодно, если только этого ну никак нельзя было сделать напрямую.

undefined 12.07.2015 16:18

Цитата:

onComplete же!
Цитата:

+ обозначить, что все прежнии анимации этого объекта следует прервать
Он все равно вызовет onComplete?

Цитата:

Нет. Анимируется переменная phase там, где ты твиннер "заводишь". А в onUpdate ты на основании этой переменной phase делаешь с любым доступным объектом все, что душе угодно, если только этого ну никак нельзя было сделать напрямую.
Все равно не догоняю.Кому принадлежит переменная phase?

Zebestov 12.07.2015 16:21

Цитата:

Сообщение от undefined (Сообщение 1184852)
Он все равно вызовет onComplete?

Нет, зачем? Анимация же не будет завершена — она прервется. Если сильно нужно, можно вызвать необходимый метод там же, где мы и прерываем старую анимацию, задавая новую.


Цитата:

Сообщение от undefined (Сообщение 1184852)
Все равно не догоняю. Кому принадлежит переменная phase?

Будет проще пояснить, если ты набросаешь минимальный пример того, что ты вообще хочешь такого сделать, что выходит за рамки обычного твина.

undefined 12.07.2015 16:31

Цитата:

Будет проще пояснить, если ты набросаешь минимальный пример того, что ты вообще хочешь такого сделать, что выходит за рамки обычного твина.
Пример надуманый, но думаю суть поймешь.Имеется несколько текстовых полей внутри спрайтов.По какому-то событию надо плавно заанимировать текст части текстовых полей в зависимости от фазы твина.По другому событию требуется запустить анимацию оставшихся полей.Это , конечно, не выходит за рамки штатного твина, который, еще раз, меня устраивает всем кроме скорости. Интересует как бы ты это сделал в eazeTween?

Zebestov 12.07.2015 19:18

Ну, например, в каждом таком спрайте делаешь метод update(phase:int) {…} и вызываешь его по onUpdate в диапазоне 0…1, а уже в этом методе двигаешь текстовое поле, как положено по анимации. Один из вариантов.

caseyryan 12.07.2015 19:25

Цитата:

метод update(phase:int) {…}
Цитата:

его по onUpdate в диапазоне 0…1
Значит не int, а Number ;) Много раз на такие грабли наступал)

undefined 12.07.2015 19:36

Zebestov, кажется понял что ты предлагаешь.Думаю можно заставить eaze-tween мимикрировать под стандартный твин.Не подскажешь где можно найти хелп по нему? Интересует зачем нужна запись eaze(target).from(duration,from_obj) и чем это отличается от eaze(target).to(duration,from_obj)?

Zebestov 12.07.2015 19:51

caseyryan, точняк ыы :)
undefined, а хелпа сам не нашел :) но он и не нужен особо. Той памятки, что по ссылке + ASDoc-ов хватает для пользования. Запись удобна тем, что можно настраивать анимацию в одну строку. Забыл (никогда и не знал?) как этот стиль называется. Что касается from, так оно ж из названия понятно: это не "анимируй меня из текущего положения куда-то туда" как в to, а "анимируй меня откуда-то оттуда в мое текущее положение".

undefined 12.07.2015 20:14

Zebestov,понял, спасибо.Думаю тема исчерпала себя.

udaaff 13.07.2015 00:10

Цитата:

Запись удобна тем, что можно настраивать анимацию в одну строку. Забыл (никогда и не знал?) как этот стиль называется.
https://ru.wikipedia.org/wiki/Fluent_interface

undefined 22.11.2015 13:18

поднимаю эту тему т.к. решение оказалось спорным
zebestov,решил прикрутить по твоему совету этот твинер.Но вот какая беда:Если запустить одну анимацию
Код AS3:

eaze(target).to(dur,state1).onComplete(onComplete);

и пока она идет запустить вторую анимацию
Код AS3:

eaze(target).to(dur,state2).onComplete(onComplete);

хэндлер onComplete для первой анимации не вызовется.Хотелось бы некий аналог fforward типа
Код AS3:

tween.fforward();

Можно наверно и самому дернуть onComplete,но тогда надо как-то определить идет ли анимация.

Zebestov 22.11.2015 14:27

Не нужно ничего придумывать, достаточно во втором случае указать, чтобы не затиралась текущая анимация указанного объекта target:
Код AS3:

eaze(target).to(dur,state2,false).onComplete(onComplete); // вот это false третьим аргументом to(...)


undefined 22.11.2015 19:03

zebestov,благодарю.Мне оказывается как раз не надо чтоб onComplete для старого твина вызывался т.к. до старта нового твина меняется окружение и старая анимация становится иррелевантна ему. Решил с помощью
Код AS3:

EazeTween.killAllTweens();



Часовой пояс GMT +4, время: 07:02.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.