localToGlobal / globalToLocal AS3混乱

时间:2011-03-29 14:08:51

标签: actionscript-3 coordinates

我想将显示对象从一个容器移动到另一个容器,但是它显示在屏幕上的相同位置。

我以为自己多年前就明白这一点,但以下内容并不奏效:

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 个答案:

答案 0 :(得分:7)

使用localToGlobal / globalToLocal并设置您展示的xy属性,为新对象计算正确的位置父级,但不会调整转换的其他方面,如缩放或旋转。换句话说,对象的注册点确实会保留在同一个位置,但对象可能会以不同方式旋转,缩放或剪切。

您的问题的解决方案需要考虑旧父母和新父母的transform.concatenatedMatrix属性 - 您需要将对象的变换矩阵乘以1,然后乘以另一个的倒数,或类似的规定。如果你需要帮助来计算数学,请发表评论。

答案 1 :(得分:1)

您的代码没有任何问题,只要两个容器都没有应用转换。如果缩放,旋转等剪辑,除了localToGlobal和globalToLocal所做的坐标空间变换之外,还需要处理它。

答案 2 :(得分:0)

您必须检查您的容器是否实际放置在舞台上。如果您的新容器未作为子级添加到stage,则函数globalToLocal会失败,因为它不知道如何正确计算该数据。