![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Feb 2011
Сообщений: 100
|
Неа, не работает. То ли в конвейере есть ошибка, то ли я его не так приспособил.
В результате написал своё, которое работает. Ради спортивного интереса, прилагаю свой рабочий вариант и тот же самый вариант с конвейером. Можешь попробовать его оживить, мн было бы интересно посмотреть. Там в архиве TweenQueue - вариант с конвейером, TweenQueue2 - работающиё вариант без конвейера. В Main у поля _q достаточно менять тип с TweenQueue2 на TweenQueue для смены теста. |
|
|||||
|
Да не, багов то в конвеере нет.
(тесты, конечно хороши для демонстрации багов, а не их отсутствия, но загнать багу в полторы сотни строк, покрытых на 100% всё же сложно) Есть ньюансы самой логики конвеера. Впринципе, Ваша реализация в данном случае не сложнее применения конвеера, но, всё-таки, рабочий код: package { import com.greensock.data.TweenLiteVars; import com.greensock.TweenLite; import com.potapenko.remake.Conveyor; import flash.events.Event; /** * ... * @author Dima */ public class TweenQueue { private var _conv: Conveyor = new Conveyor(); private var _isPlaying:Boolean = false; public function TweenQueue() { _conv.addEventListener(Event.COMPLETE, onConvComplete); } private function onConvComplete(event:Event):void { _isPlaying = false; } public function add(target: Object, duration: Number, tween: Object): void { addMany(Vector.<Object>([target]), Vector.<Number>([duration]), Vector.<Object>([tween])); } public function addMany(targets: Vector.<Object>, durations: Vector.<Number>, vars: Vector.<Object>): void { _conv.add(startTweenSet, new TweenSet(targets, durations, vars)); if (!_isPlaying) { // Вот эти вот фокусы с проверками, не дошёл ли до конца конвеер и можно ли вызвать play // в боевом коде у нас загнаны внуть конвеера в новую функцию launch() // а выставление _isPlaying = false - в конец функции play() // Для заранее запрограммированных действий оно не надо было, а для очереди оказалось важно _conv.play(); _isPlaying = true; } } private function startTweenSet(ts:TweenSet):void { _conv.stop();// Начало асинхронного блока ts.play(resume); } public function resume(): void { _conv.play();// Конец асинхронного блока } } } Я так понял - задача - сделать список с плавно разъезжающимися элементами? Так для этого не нужно очередей. Просто при добавлении/удалении элемента каждому оставшемуся назначаем твин в точку, в которой он должен быть - 50 объектов - 50 одновременных твинов - ничего страшного. (при этом плюём с высокой колокольни двигался ли он до этого или нет - TweenLite автоматом прерывает передыдущий твин для объекта, на который вешается следующий) Всё! Ну если не считать, что надо применить некоторые хитрости, чтобы одновременное движение и исчезание под этим элементом другого - не выглядело криво (например, у меня они исчезали скейлом в 0 и при уменьшении сдвигались в сторону, но можно и таки ввести ожидание конца исчезновения или ещё что) Последний раз редактировалось expl; 22.12.2012 в 18:13. |
|
|||||
|
Регистрация: Feb 2011
Сообщений: 100
|
Ага, вот тоже думал что надо эвент на окончание конвейера как-то использовать, но уже столько перепробовал до этого, что плюнул).
Цитата:
|
|
|||||
|
Регистрация: Aug 2012
Сообщений: 108
|
Короче, вот в чем смысл: как они переделали это - nextTween, autoPlay?
|
![]() |
![]() |
Часовой пояс GMT +4, время: 21:43. |
|
|
« Предыдущая тема | Следующая тема » |
|
|