Flash: перемещение фрагмента ролика из контейнера в другой с сохранением положения и поворота - PullRequest
0 голосов
/ 23 февраля 2012

Как видно из заголовка, у меня есть 2 контейнера MovieClips (mc1, mc2), каждый из которых имеет отдельный поворот x, y.Я хочу взять дочерний элемент из mc1 и добавить его в mc2, сохраняя при этом те же значения x, y и поворота на экране, чтобы вы увидели добавленный дочерний элемент mc, как будто он не изменил положение или поворот, просто переместился на другой MC,Есть идеи как?

Ответы [ 3 ]

1 голос
/ 23 февраля 2012

Может быть, этот фрагмент кода может вам помочь: вы можете указать точку, которую вы хотите перевести в систему координат другого фрагмента ролика.

public static function localToLocal(from:Sprite, to:Sprite, origin:Point):Object
{
     var point:Point = new Point(origin.x,origin.y);
     point = from.localToGlobal(point);
     point = to.globalToLocal(point);
     return point;
}

Проблема остается, если имеется несколько подпунктов.-movieclips, которые вращаются индивидуально.В противном случае вы можете использовать только один поворот, который вы применили к мувиклипу, и применить его к новому обертке-клипу.

1 голос
/ 23 февраля 2012

Вы можете использовать localToGlobal() и globalToLocal() для достижения этого.

var positionInMc1:Point = new Point(child.x, child.y);
var positionInStage:Point = mc1.localToGlobal(positionInMc1);
var positionInMc2:Point = mc2.globalToLocal(positionInStage);

mc2.addChild(child);
mc2.x = positionInMc2.x;
mc2.y = positionInMc2.y;

Редактировать:

Однако, это не будет правильно обрабатывать вращение.Поэтому вам, вероятно, придется повернуть child после этого, чтобы исправить вращение mc1 и mc2.Поскольку они находятся на одном уровне, вам, вероятно, следует повернуть child на разницу между их вращениями.

Редактировать:

Из кода, который вы разместили ниже:

child.rotation -= mc2.rotation;
0 голосов
/ 23 февраля 2012

Если бы вы получили глубоко вложенные преобразования, я бы использовал что-то вроде этого. Например, у вас есть вложенные спрайты mc1.mc2.mc3 и вы хотите присоединить mc3 к mc4. Этот пример показывает, насколько правый вектор (1, 0) в одной системе координат отличается от того же вектора в другой.

function reattach(target:DisplayObject, to:DisplayObjectContainer):void {
    var center:Point = target.localToGlobal(new Point(0,0));
    // vector (1, 0) from old local coordinate system
    var oldVector:Point = target.localToGlobal(new Point(1,0)).subtract(center);
    var newCenter:Point = to.globalToLocal(center);
    to.addChild(target);
    target.x = newCenter.x;
    target.y = newCenter.y;
    // vector (1, 0) from new local coordinate system
    var newVector:Point = target.localToGlobal(new Point(1,0)).subtract(center);
    // angle between these two vectors
    var angle:Number = Math.acos((oldVector.x*newVector.x + oldVector.y*newVector.y)/(oldVector.length*newVector.length)) * 180 / Math.PI;
    if (oldVector.x*newVector.y - oldVector.y*newVector.x > 0) angle = -angle;
    // rotating for delta angle
    target.rotation += angle;
}

reattach(mc1.mc2.mc3, mc4);

Необходимо изменить, если какой-либо из спрайтов масштабируется

...