Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 05.05.2014, 14:40
alexandrratush вне форума Посмотреть профиль Отправить личное сообщение для alexandrratush Найти все сообщения от alexandrratush
  № 1  
Ответить с цитированием
alexandrratush
 
Аватар для alexandrratush

Регистрация: Jul 2013
Адрес: Днепр
Сообщений: 529
Отправить сообщение для alexandrratush с помощью ICQ Отправить сообщение для alexandrratush с помощью Skype™
По умолчанию Имитация вращения барабана в слот-машинах

Здравствуйте! Возник вопрос в создании барабана слот-машины.
Starling я недавно начал использовать, поэтому возникли некие трудности.
Выставил количество кадров 60. При данной реализации, когда крутиться барабан, fps падает до 30. Это нормально или нет?

Вся проблема в применении фильтра BlurFilter. Без него все нормально проходит.
Подскажите как правильно применить фильтр в конкретной задаче.

Рут класс:
Код AS3:
package {
	import starling.display.Sprite;
	import starling.text.TextField;
	import starling.display.Quad;
	import starling.display.Image;
	import starling.textures.Texture;
	import starling.textures.TextureAtlas;
	import flash.display.Bitmap;
	import starling.events.Event;
	import starling.events.TouchEvent;
	import starling.events.Touch;
	import flash.geom.Point;
	import starling.events.TouchPhase;
 
	public class View extends Sprite {
		[Embed(source="assets/atlas.xml", mimeType="application/octet-stream")]
		private var AnimData:Class;
 
		[Embed(source="assets/atlas.png")]
		private var AnimTexture:Class;
 
		private var _slotMachines:SlotMachines;
 
		public function View() {
			addEventListener(Event.ADDED_TO_STAGE, onAdded);
 
			var texture:Texture = Texture.fromBitmap(new AnimTexture() as Bitmap);
			var atlasXML:XML = new XML(new AnimData());
			var textureAtlas:TextureAtlas = new TextureAtlas(texture, atlasXML);
 
			//
			_slotMachines = new SlotMachines(textureAtlas);
			addChild(_slotMachines);
		}
 
		private function onAdded(e:Event):void {
			stage.addEventListener(TouchEvent.TOUCH, onTouch);
		}
 
		private function onTouch(e:TouchEvent):void {
			var touch:Touch = e.getTouch(stage, TouchPhase.BEGAN);
			if (touch == null) return;
 
			if (!_slotMachines.isRun) {
				_slotMachines.run();
			} else {
				_slotMachines.stop();
			}
		}
 
	}
}
Барабан:
Код AS3:
package {
	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 com.greensock.BlitMask;
	import com.greensock.TweenMax;
	import flash.geom.Rectangle;
 
	public class SlotMachines extends Sprite {
 
		/** Атлас изображений */
		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:BlurFilter = new BlurFilter(0, 5);
 
 
		public function SlotMachines(textureAtlas:TextureAtlas) {
			_textureAtlas = textureAtlas;
			_assetsManager = new Assets(_textureAtlas);
 
			// Отрисовка машины
			draw();
		}
 
		/** Запуск машины */
		public function run():void {
			var slotItem:SlotItem;
			var image:Image;
			var ty:Number;
 
			// Включаем флаг
			_isRun = true;
 
			// Цикл по всем столбцам
			for each (slotItem in _slotsVector) {
 
				// Добавляем по 3 картинки
				addNewImages(slotItem);
 
				// Смещение по У для Твина
				ty = slotItem.height / 2;
 
				// Применяем фильтр
				slotItem.filter = _blur;
 
       			TweenMax.to(slotItem, .05, {y:ty, repeat:1000, yoyo:true});
			}
		}
 
		/** Остановка машины */
		public function stop():void {
			var slotItem:SlotItem;
 
			// В каждом столбце удаляем фильтр, сбрасываем позицию и удаляем эллементы
			for each (slotItem in _slotsVector) {
				slotItem.filter = null;
				slotItem.y = 0;
				slotItem.reset();
			}
 
			TweenMax.killAll();
 
			// Выключаем флаг
			_isRun = false;
		}
 
		/** Отрисовка машины */
		private function draw():void {
			var slotItem:SlotItem;
			var tx:int;
 
			_slotsVector = new Vector.<SlotItem>;
 
			// Создаем столбцы
			for (var i:int = 0; i < _numSlots; i++) {
				slotItem = new SlotItem();
 
				// Добавляем по 3 картинки
				addNewImages(slotItem);
 
				// Смещение каждого столбца
				slotItem.x = (slotItem.width + 5) * tx;
 
				// Добавляем столбец
				_slotsVector.push(slotItem);
				addChild(slotItem);
 
				tx ++;
			}
 
			// Размеры для маски
			var _w:Number = (slotItem.width + 5) * tx;
			var _h:Number = slotItem.height;
 
			// Маска
			this.clipRect = new Rectangle(0, 0, _w, _h);
		}
 
		/** Добавление новых (3) изображений */
		private function addNewImages(slotItem:SlotItem):void {
			var image:Image;
 
			for (var j:int = 0; j < 3; j++) {
				image = new Image(_assetsManager.getTexture("s" + randRange(1, 9)));
				slotItem.add(image);
			}
		}
 
		public function get isRun():Boolean {
			return _isRun;
		}
 
		private function randRange(minNum:Number, maxNum:Number):Number {
            return (Math.floor(Math.random() * (maxNum - minNum + 1)) + minNum);
        }
 
	}
}
Столбец в барабане:
Код AS3:
package  {
	import starling.display.Sprite;
	import starling.display.Image;
 
	public class SlotItem extends Sprite {
 
		/** Вектор всех изображений */
		private var _itemsVector:Vector.<Image>;
 
 
		public function SlotItem() {
			_itemsVector = new Vector.<Image>;
		}
 
		/** Добавление новой картинки */
		public function add(image:Image):void {
			var len:int = _itemsVector.length;
 
			// Если уже есть 3 картинки, то распределяем их вверх от 0 координаты
			if (len >= 3) {
				image.y = image.height * (3 - len - 1);
			} else {
				image.y = image.height * len;
			}
 
			// Добавляем
			_itemsVector.push(image);
			addChild(image);
		}
 
		/** Остановка и сброс */
		public function reset():void {
			var len:int = _itemsVector.length;
			var image:Image;
 
			// Первые 3 картинки удаляем 
			for (var j:int = 0; j < 3; j++) {
				image = _itemsVector[i];
 
				removeChild(image);
				_itemsVector.splice(i, 1);
			}
 
			// Остальные сдвигаем вниз
			for (var i:int = 2; i >= 0; i--) {
				image = _itemsVector[i];
 
				image.y = image.height * i;
			}
		}
 
	}
}
P.S. Не очень уверен в правильной реализации самого вращения барабана, но лучше ничего не придумал и не нашел пока.
Если есть готовые решение, или может кто готов поделиться своими наработками, буду очень признателен.
Спасибо!

Создать новую тему   Часовой пояс GMT +4, время: 09:31.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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