Мне кажется, вот только как смог сократить код.
Цитата:
|
Тут больше интересно зачем АйФейсы !
|
Не для понта! Неужели, Вы опытные люди не понимаете для чего это?) я бы увидев такую постановку,
сразу понял, для чего это и от куда ноги растут. Ну а диспетчер нужен, так как интерфейс расширяет 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);
}*/
}
}
}