У меня была быстрая игра, вот что я придумал:
В моем примере есть MovieClip на сцене, называемая «шар», и несколько других MovieClip, разбросанных вокруг для использования в качестве dropTargets.
ball.addEventListener(MouseEvent.MOUSE_DOWN, pickUp);
stage.addEventListener(MouseEvent.MOUSE_UP, dropIt);
function pickUp(event:MouseEvent):void
{
var ballPoint:Point = ball.parent.localToGlobal( new Point(ball.x, ball.y) );
ball.parent.removeChild(ball);
addChild(ball);
ball.x = ballPoint.x;
ball.y = ballPoint.y;
ball.startDrag();
}
function dropIt(event:MouseEvent):void
{
ball.stopDrag();
if(!event.target.dropTarget) { return };
var dropT:MovieClip = event.target.dropTarget.parent;
var ballPoint:Point = dropT.globalToLocal( new Point(ball.x, ball.y) );
ball.parent.removeChild(ball);
dropT.addChild(ball);
ball.x = ballPoint.x;
ball.y = ballPoint.y;
}
По сути, обработчик PickUp удаляет «шариковый» MovieClip из его родителя и добавляет его в корневой DisplayObject. Это гарантирует, что шар находится сверху, поэтому dropTarget будет работать (dropTarget будет работать только с объектами ниже в порядке стека). Положение шара x / y вычисляется (с использованием localToGlobal) для его нового родителя и применяется. Тогда начало перетаскивания называется.
Обработчик dropIt сначала вызывает stopDrag, а затем возвращает, если не может найти dropTarget. Новая x / y позиция для мяча вычисляется с использованием globalToLocal на этот раз, чтобы получить новую позицию в своей цели падения. Затем мяч удаляется и добавляется к его новому родителю (dropTarget). Новая позиция применяется.
Кажется, в моем случае очень хорошо работает.
Также ... Я обнаружил, что хороший способ проверить, работает ли он, это временно применить другие фильтры размытия или dropShadow к dropTargets на сцене. Таким образом, когда вы уроните шарик на них, он унаследует фильтр, и вы увидите некоторую визуальную обратную связь.