Вот мой динозавр.
Сам барабан состоит из 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;
}
}
}
}