Показать сообщение отдельно
Старый 11.05.2014, 20:53
alexandrratush вне форума Посмотреть профиль Отправить личное сообщение для alexandrratush Найти все сообщения от alexandrratush
  № 7  
Ответить с цитированием
alexandrratush
 
Аватар для alexandrratush

Регистрация: Jul 2013
Адрес: Днепр
Сообщений: 529
Отправить сообщение для alexandrratush с помощью ICQ Отправить сообщение для alexandrratush с помощью Skype™
Вот мой динозавр.
Сам барабан состоит из 2-х классов.
Пока работает, а там увидим что с ним будет.
Демо выложил на свой сервер.

Код AS3:
package {
	import com.greensock.easing.*;
	import com.greensock.TweenMax;
	import starling.display.Sprite;
	import starling.display.Image;
	import starling.textures.TextureAtlas;
	import starling.textures.Texture;	
	import starling.textures.RenderTexture;
	import starling.filters.BlurFilter;
	import starling.display.Quad;
	import flash.geom.Rectangle;
 
 
	public class SlotMachines extends Sprite {
 
		/** Количество картинок в каждом столбце (максимальное) */
		public static const SLOT_ICON_MAX:int = 9;
 
		/** Количество видимых частей картинок */
		public static const SLOT_ICON_VIEW:int = 3;
 
		/** Атлас изображений */
		private var _textureAtlas:TextureAtlas;
 
		/** Менеджер, который выдает нам отдельные картинки из атласа */
		private var _assetsManager:Assets;
 
		/** Количество столбцов в слот-машине */
		private var _numSlots:int = 5;
 
		/** Вектор всех столбцов */
		private var _slotsVector:Vector.<SlotItem>;
 
		/** Запущена ли машина */
		private var _isRun:Boolean;
 
		/** Фильтр размытия */
		private var _blur:MotionBlurFilter = new MotionBlurFilter(89.5, 2);
 
		/** Маска */
		private var _clipRect:Rectangle;
 
		/** Количество остановленых столбцов */
		private var _countStop:int;
 
		/** Блокировка запуска/остановки машины, пока не будет запущена/остановлена вся анимация */
		private var _blocking:Boolean = false;
 
 
		public function SlotMachines(textureAtlas:TextureAtlas) {
			_textureAtlas = textureAtlas;
			_assetsManager = new Assets(_textureAtlas);
 
			// Отрисовка машины
			draw();
		}
 
		/** Запуск машины */
		public function run():void {
			if (_blocking) return;
 
			var slotItem:SlotItem;
			var image:Image;
			var ty:Number;
			var d:Number = 0;
 
			// Включаем флаг
			isRun = true;
 
			// Количество запусков сбрасываем
			_countStop = 0;
 
			// Включаем блокировку (выключим, только когда все будет запущено)
			_blocking = true;
 
			// Цикл по всем столбцам
			for each (slotItem in _slotsVector) {
 
				// Добавляем картинки в столбец
				addNewImages(slotItem, SLOT_ICON_MAX - SLOT_ICON_VIEW);
 
				// Смещение вниз У для Твина каждого столбца
				ty = slotItem.height - _clipRect.height;
 
				// Задержка анимации
				d += .2;
 
				// Анимация
				slotItem.tween = new TweenMax(slotItem, .1, {
						y:ty, 
						repeat:-1, 
						delay:d, 
						onStart:onStartFunc, 
						onStartParams:[slotItem], 
						onComplete:onCompleteFunc, 
						onCompleteParams:[slotItem], 
						yoyo:true, 
						ease:Linear.easeIn } 
					);
			}
		}
 
		/** Старт анимации столбца */
		private function onStartFunc(slotItem:SlotItem):void {
			// Применяем фильтр
			slotItem.filter = _blur;
 
			// Добавляем один запуск и проверяем для разблокировки машины
			if (++_countStop == _numSlots) {
				_blocking = false;
			}
		}
 
		/** Завершение анимации */
		private function onCompleteFunc(slotItem:SlotItem):void {
			slotItem.filter = null;
			slotItem.y = 0;
			slotItem.reset();
 
			// Отнимаем один запуск и проверяем для разблокировки машины
			if (--_countStop == 0) {
				_blocking = false;
			}
		}
 
		/** Остановка машины */
		public function stop():void {
			if (_blocking) return;
 
			var slotItem:SlotItem;
			var d:int = 1000;
 
			// Выключаем флаг "запуска"
			isRun = false;
 
			// Включаем блокировку (выключим, только когда все будет остановлено)
			_blocking = true;
 
			// Скоротить анимацию
			for each (slotItem in _slotsVector) {
				// Здесь баг твина, поэтому ставим костыль :)
				// Ниже строчка не сработает ((
				// slotItem.tween.repeat = d;
				slotItem.stopTween(d);
 
				d += 1000;
			}
		}
 
		/** Отрисовка машины */
		private function draw():void {
			var slotItem:SlotItem;
			var tx:int;
 
			_slotsVector = new Vector.<SlotItem>(5, true);
 
			// Создаем столбцы
			for (var i:int = 0; i < _numSlots; i++) {
				slotItem = new SlotItem();
 
				// Добавляем картинки
				addNewImages(slotItem, SLOT_ICON_VIEW);
 
				// Смещение каждого столбца
				slotItem.x = (slotItem.width + 5) * tx;
 
				// Добавляем столбец
				_slotsVector[i] = slotItem;
				addChild(slotItem);
 
				tx ++;
			}
 
			// Размеры для маски
			var _w:Number = (slotItem.width + 5) * tx;
			var _h:Number = slotItem.height;
 
			// Маска
			_clipRect = new Rectangle(0, 0, _w, _h);
			this.clipRect = _clipRect;
		}
 
		/**
		 * Добавление новых изображений в столбец
		 * @param	slotItem	Столбец
		 * @param	count		Количество добавлений
		 */
		private function addNewImages(slotItem:SlotItem, count:int):void {
			// TODO Нужно переделать, чтобы передавать массив с значениями названий картинок
			// Сейчас выбираеться рандом
			var image:Image;
 
			for (var j:int = 0; j < count; j++) {
				image = new Image(_assetsManager.getTexture("s" + randRange(1, 9)));
				slotItem.add(image);
			}
		}
 
		public function get isRun():Boolean { return _isRun; }
		public function set isRun(value:Boolean):void {
			_isRun = value;
		}
 
		public function get blocking():Boolean { return _blocking; }
 
		private function randRange(minNum:Number, maxNum:Number):Number {
            return (Math.floor(Math.random() * (maxNum - minNum + 1)) + minNum);
        }
 
	}
}

Код AS3:
package  {
	import com.greensock.TweenMax;
	import flash.utils.clearTimeout;
	import flash.utils.setTimeout;
	import starling.display.Sprite;
	import starling.display.Image;
 
	public class SlotItem extends Sprite {
 
		/** Вектор всех изображений */
		private var _itemsVector:Vector.<Image>;
 
		private var _count:int = 0;
 
		private var _intervalId:uint;
 
		public var tween:TweenMax;
 
 
		public function SlotItem() {
			_itemsVector = new Vector.<Image>;
		}
 
		public function stopTween(d:int):void {
			_intervalId = setTimeout(delayedFunction, d);
		}
 
		private function delayedFunction():void {
			clearTimeout(_intervalId);
			tween.repeat = 5.0;
		}
 
		/** Добавление новой картинки */
		public function add(image:Image):void {
			var len:int = _itemsVector.length;
 
			// Если уже есть картинки, то распределяем их вверх от 0 координаты
			if (len >= SlotMachines.SLOT_ICON_VIEW) {
				image.y = image.height * (SlotMachines.SLOT_ICON_VIEW - len - 1);
			} else {
				image.y = image.height * len;
			}
 
			// Добавляем
			_itemsVector.push(image);
			addChild(image);
		}
 
		/** Остановка и сброс */
		public function reset():void {
			var i:int
			var len:int = _itemsVector.length;
			var image:Image;
			var deleteImageCount:int = SlotMachines.SLOT_ICON_MAX - SlotMachines.SLOT_ICON_VIEW;
			var imageCount:int = SlotMachines.SLOT_ICON_VIEW;
 
			// Первые картинки удаляем 
			for (i = 0; i < deleteImageCount; i++) {
				image = _itemsVector[0];
 
				removeChild(image);
				_itemsVector.splice(0, 1);
			}
 
			// Разворачиваем
			_itemsVector = _itemsVector.reverse();
 
			// Остальные сдвигаем вниз
			for (i = 0; i < imageCount; i++) {
				image = _itemsVector[i];
				image.y = image.height * i;
			}
		}
 
	}
}