Привет!
Я использую вот этот transform manager:
http://blog.ryantan.net/2010/08/free-transform-manager/
И пытаюсь ограничить область трансформации:
http://ki44321.ho.ua/testmanager/
Но получается совсем криво.
Вот исходник (FlashDevelop project):
http://ki44321.ho.ua/testmanager/source.rar
Я наследую класс FreeTransformManager и переопределяю функцию onStageMMove

Код AS3:
override protected function onStageMMove(evt:MouseEvent):void {
if (mIsDown) {
var currX:Number;
var currY:Number;
var flag:Boolean = true;
currX = stage.mouseX;
currY = stage.mouseY;
dX = currX - oriX;
dY = currY - oriY;
if (mode == 0) {
//moving
if (_bounds.left.hitTestObject(transformContainer))
if (dX < 0) flag = false;
if (_bounds.right.hitTestObject(transformContainer))
if (dX > 0) flag = false;
if (_bounds.top.hitTestObject(transformContainer))
if (dY < 0) flag = false;
if (_bounds.bottom.hitTestObject(transformContainer))
if (dY > 0) flag = false;
if(flag)
onTranslate(dX, dY);
}
else
{
///scale
currX = me.mouseX;
currY = me.mouseY;
var currAngle:Number = getAngleFromMouseCoord(currX, currY, oriCP);
//trace('currAngle=' + currAngle);
dAngle = currAngle - oriAngle; //trace('dAngle=' + dAngle);
var newDist:Number = Math.sqrt(Math.pow(currX - oriCP.x, 2) + Math.pow(currY - oriCP.y, 2));
var percentage:Number = newDist / oriDist;
//trace('newDist=' + newDist + ', oriDist=' + oriDist + ', percentage=' + percentage);
if (testHit() && percentage > 1) return
flag = true;
if (_bounds.left.hitTestObject(transformContainer))
if ((dY < 0 && dAngle>0) || (dY > 0 && dAngle<0)) flag = false;
if (_bounds.right.hitTestObject(transformContainer))
if ((dY < 0 && dAngle>0) || (dY > 0 && dAngle<0)) flag = false;
if (_bounds.top.hitTestObject(transformContainer))
if ((dY < 0 && dAngle>0) || (dY > 0 && dAngle<0)) flag = false;
if (_bounds.bottom.hitTestObject(transformContainer))
if ((dX < 0 && dAngle>0) || (dX > 0 && dAngle<0)) flag = false;
if(flag)
onTransform(dAngle, percentage);
clear();
drawLine(oriCP.x, oriCP.y, currX, currY, 0x110000);
drawLine(oriCP.x, oriCP.y, oriX, oriY, 0x001100);
}
}
}
Проверка hitTest:

Код AS3:
private function testHit():Boolean
{
for (var i:String in _bounds)
if (_bounds[i].hitTestObject(transformContainer))
return true;
return false;
}
Конструктор:

Код AS3:
private var _bounds:Object = { };
private var _isTest:Boolean = false;
// bounds movieClip со сцены, в котором расположенны 4 мувика:
// левая граница, нижняя граница, правая и верхняя граница
public function TransformManagerBounds(bounds:MovieClip, showInterestingStuff:Boolean = false)
{
if (bounds && bounds.l && bounds.r && bounds.t && bounds.b)
{
_bounds.left = bounds.l;
_bounds.right = bounds.r;
_bounds.top = bounds.t;
_bounds.bottom = bounds.b;
}
else
return;
}
Как сделать правильно?