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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 18.11.2013, 15:11
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 23  
Ответить с цитированием
Akopalipsis
Banned

Регистрация: Mar 2013
Сообщений: 1,864
Мне кажется, вот только как смог сократить код.
Цитата:
Тут больше интересно зачем АйФейсы !
Не для понта! Неужели, Вы опытные люди не понимаете для чего это?) я бы увидев такую постановку,
сразу понял, для чего это и от куда ноги растут. Ну а диспетчер нужен, так как интерфейс расширяет IED.
Но я не знаю пока как решить это. И интерфейс нужен на сто процентов и диспетчера тащить не хочется в этот класс.
Код AS3:
package 
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.display.DisplayObject;
	import flash.geom.Point;
	import flash.geom.Rectangle;
 
	public class ScalePlugin
	{
		private static var _eventDispatcher:EventDispatcher = new EventDispatcher();
 
		private var _object:DisplayObject;
		private var _point:Point;
		private var _bounding:Rectangle;
		private var _delay:Number;
		private var _currentTime:Number;
		private var _totalTime:Number;
 
		private var _coefficientWidth:Number;
		private var _coefficientHeight:Number;
 
		private var _speedWidth:Number;
		private var _speedHeight:Number;
 
		private var _speedX:Number;
		private var _speedY:Number;
 
		private var _finishX:int;
		private var _finishY:int;
 
		private var _scaleX:Number;
		private var _scaleY:Number;
		private var _callBack;
		private var _isCallBack:Boolean;
 
		public function setScale(object:DisplayObject,
										   scaleX:Number = 1.0,
										   scaleY:Number = 1.0,
										   delay:Number = 1.0,
										   point:Point = null,
										   callBack:Function=null,
										   bounding:Rectangle=null):void
		{
			if (!_object)
			{
				_object = object;
				_coefficientWidth = _object.width / 100;
				_coefficientHeight = _object.height / 100;
				_bounding = bounding;
			}
			if (!point) 
			{
				_point = new Point();
				_point.x = _object.width / 2 + _object.x;
				_point.y = _object.height / 2 + _object.y;
			}
			else 
			{
				_point = point;
			}
 
			_scaleX = scaleX;
			_scaleY = scaleY;
			_delay = delay;
			if (callBack)
			{
				_callBack = callBack;
				_isCallBack = true;
			}
			_currentTime = 0;
 
			//разница между текущеми и финишными размерами
			var differenceWidth:Number = _coefficientWidth * scaleX * 100 - _object.width;
			var differenceHeight:Number = _coefficientHeight * scaleY * 100 - _object.height;
 
			//время которое будет затрачено на увеличение
			_totalTime = differenceWidth / _coefficientWidth * (_delay / 100);
 
			//если время отрицательное делаем его положительным
			if (_totalTime < 0) _totalTime *= -1;
 
			_speedWidth = differenceWidth / _totalTime;
			_speedHeight = differenceHeight / _totalTime;
 
			//узнаем разницу между выбранной точкой и координатами обьекта
			var shiftX:Number = _point.x -_object.x;
			var shiftY:Number = _point.y - _object.y;
 
			//вычитаемое - растояние, уменьшив на которое значение координат обьекта, получим финишные координаты
			var subtrahendX:Number = shiftX - (_coefficientWidth * 100 * scaleX) / (_object.width / shiftX);
			var subtrahendY:Number = shiftY -  (_coefficientHeight * 100 * scaleY) / (_object.height / shiftY);
 
			_finishX = _object.x + subtrahendX;
			_finishY = _object.y + subtrahendY;
 
			if (_bounding)
			{
				if (_finishX > _bounding.x)_finishX = _bounding.x;
				if (_finishY > _bounding.y)_finishY = _bounding.y;
				if (_finishX < _bounding.x - ((_coefficientWidth * 100 * scaleX) - _coefficientWidth * 100))_finishX = _bounding.x - ((_coefficientWidth * 100 * scaleX) - _coefficientWidth * 100);
				if (_finishY < _bounding.y - ( (_coefficientHeight * 100 * scaleY) - _coefficientHeight * 100))_finishY = _bounding.y - ( (_coefficientHeight * 100 * scaleY) - _coefficientHeight * 100);
			}
			_speedX = (_finishX - _object.x) / _totalTime;
			_speedY = (_finishY - _object.y) / _totalTime;
 
		}
		public function advanceTime(time:Number):void 
		{
			_currentTime += time;
			if ( _currentTime  >  _totalTime )
			{
				var finishWidth:int = _coefficientWidth * _scaleX * 100;
				var finishHeight:int = _coefficientHeight * _scaleY * 100;
 
				_object.width = finishWidth;
				_object.height = finishHeight;
 
				_object.x = int(_finishX);
				_object.y = int(_finishY);
				_eventDispatcher.dispatchEvent(new Event(Event.COMPLETE));
				return; 
			}
			_object.width = time * _speedWidth+_object.width;
			_object.height = time*_speedHeight+_object.height;
			_object.x = time*_speedX+_object.x;
			_object.y = time * _speedY + _object.y
			/*if (_isCallBack)
			{
				_callBack(params);
			}*/
		}
	}
 
}

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

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

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


 


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


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