我想将显示对象从一个容器移动到另一个容器,但是它显示在屏幕上的相同位置。
我以为自己多年前就明白这一点,但以下内容并不奏效:
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;
}
这并不会将对象置于我预期的相同位置。
有人知道我做错了吗?
谢谢, 詹姆斯
答案 0 :(得分:7)
使用localToGlobal
/ globalToLocal
并设置您展示的x
和y
属性,为新对象计算正确的位置父级,但不会调整转换的其他方面,如缩放或旋转。换句话说,对象的注册点确实会保留在同一个位置,但对象可能会以不同方式旋转,缩放或剪切。
您的问题的解决方案需要考虑旧父母和新父母的transform.concatenatedMatrix
属性 - 您需要将对象的变换矩阵乘以1,然后乘以另一个的倒数,或类似的规定。如果你需要帮助来计算数学,请发表评论。
答案 1 :(得分:1)
您的代码没有任何问题,只要两个容器都没有应用转换。如果缩放,旋转等剪辑,除了localToGlobal和globalToLocal所做的坐标空间变换之外,还需要处理它。
答案 2 :(得分:0)
您必须检查您的容器是否实际放置在舞台上。如果您的新容器未作为子级添加到stage,则函数globalToLocal会失败,因为它不知道如何正确计算该数据。