2011-03-29 4 views
0

한 컨테이너에서 다른 컨테이너로 표시 객체를 이동하지만 화면의 같은 위치에 표시하려고합니다. localToGlobal/globalToLocal AS3 혼란

은 내가이 년 전 이해 거라고 생각했지만, 다음은 작동하지 않습니다 내가 기대 한 것처럼

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; 
} 

이 같은 장소에서 개체를 배치하지 않습니다.

내가 잘못하고있는 것을 아는 사람이 있습니까?

감사합니다, 제임스 localToGlobal/globalToLocal를 사용하고 보여 새로운 부모의 개체에 대한 올바른 위치를 계산하지만, 변화의 다른 측면에 대한 조정하지 않습니다처럼 xy 속성을 설정

답변

7

크기 조정 또는 회전과 같은 즉, 객체의 등록 포인트는 실제로 같은 위치에 있지만 객체는 회전, 크기 조절 또는 다르게 분리 될 수 있습니다.

문제점에 대한 해결책은 이전 부모와 새 부모의 속성 인 transform.concatenatedMatrix을 고려해야합니다. 개체의 변형 행렬을 하나씩 곱한 다음 다른 행렬의 역행렬을 곱해야합니다. 그 라인들. 수학 계산에 도움이 필요하면 의견을 남기십시오.

+0

답장을 보내 주신 귀하와 Adam Smith에게 감사드립니다. 제가 말할 수있는 한, 스케일링, 회전 또는 전단 변환은 부모에게 없습니다. 두 부모의 위치를 ​​0,0으로 설정하여 문제를 해결했습니다. 분명히 다른 일이 있습니다. 그러나 귀하의 답변은 모두 유효합니다. – tarling

+0

이미 알았을 지 모르지만, 부모님의 * 조상 * 중 어느 누구도 근원까지 (최대 또는 최대까지) 크기 조정, 회전 또는 전단이 없는지 확인해야합니다. 첫 번째 공통 조상). – Aaron

+0

나는 그 루트에 올라가고있는 부모 중 어떤 곳에서도 그 타입의 변형이 없다는 것을 확인했다. 그러나 귀하는 귀하의 권리를 확인하고 귀하의 조언은 여전히 ​​유효합니다. – tarling

1

두 컨테이너 모두 변환이 적용되지 않은 경우 코드에 아무런 문제가 없습니다. 클립의 크기가 조절되고 회전 된 경우 등. localToGlobal 및 globalToLocal이 수행하는 좌표 공간 변환 외에도이를 처리해야합니다.

0

용기가 실제로 무대에 놓여 있는지 확인해야합니다. 새 컨테이너를 스테이지에 추가 할 자식으로 추가하지 않으면 함수 globalToLocal이 제대로 데이터를 올바르게 계산하는 방법을 알지 못하기 때문에 실패합니다.