Путаница localToGlobal / globalToLocal AS3 - PullRequest
0 голосов
/ 29 марта 2011

Я хочу переместить экранный объект из одного контейнера в другой, но он должен появиться в том же месте на экране.

Я думал, что понял это несколько лет назад, но следующее не работает:

function moveToNewContainer(obj:DisplayObject, newParent:DisplayObjectContainer):void {
    var pos:Point = new Point(obj.x, obj.y);
    var currentParent:DisplayObjectContainer = obj.parent;
    pos = currentParent.localToGlobal(pos);
    currentParent.removeChild(obj);
    newParent.addChild(obj);
    pos = newParent.globalToLocal(pos);
    obj.x = pos.x;
    obj.y = pos.y;
}

Это не помещает объект в то же место, как я ожидал.

Кто-нибудь знает, что я делаю не так, пожалуйста?

Спасибо, Джеймс

Ответы [ 3 ]

7 голосов
/ 29 марта 2011

Использование localToGlobal / globalToLocal и установка свойств x и y, как вы показали, вычисляет правильную позицию для объекта в его новом родительском элементе, но не корректирует другие аспекты трансформации, такой как масштабирование или вращение. Другими словами, точка регистрации объекта действительно останется на том же месте, но объект может вращаться, масштабироваться или сдвигаться по-разному.

Решение вашей проблемы должно будет учитывать transform.concatenatedMatrix свойства старых и новых родителей - вам нужно будет умножить матрицу преобразования объекта на одно, а затем на обратное значение другого или что-то еще вдоль этих линий. Оставьте комментарий, если вам нужна помощь в разработке математики.

1 голос
/ 29 марта 2011

В вашем коде нет ничего плохого, если к обоим контейнерам не применены преобразования. Если ваши клипы масштабируются, поворачиваются и т. Д., Вам нужно обрабатывать это в дополнение к преобразованиям пространства координат, которые выполняют localToGlobal и globalToLocal.

0 голосов
/ 14 октября 2013

Вы должны проверить, действительно ли ваши контейнеры находятся на сцене. Если ваш новый контейнер не добавлен в качестве дочернего элемента для рабочей области, функция globalToLocal завершится сбоем только потому, что не знает, как правильно рассчитать эти данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...