Показать сообщение отдельно
Старый 22.12.2012, 17:59
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 12  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Да не, багов то в конвеере нет.
(тесты, конечно хороши для демонстрации багов, а не их отсутствия, но загнать багу в полторы сотни строк, покрытых на 100% всё же сложно)
Есть ньюансы самой логики конвеера.
Впринципе, Ваша реализация в данном случае не сложнее применения конвеера, но, всё-таки, рабочий код:
Код AS3:
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.