2012-03-01 2 views
0

Flash CS5/AS 3.0으로 게임의 Y 위치를 기준으로 모든 관련 동영상 클립을 그리면 심도를 시뮬레이트합니다. 즉, 스테이지의 아래쪽에있는 것들이 스테이지의 위쪽에 겹쳐집니다. 따라서 Y 위치가 10 인 MovieClip은 Y 위치가 20 인 MovieClip에 비해 색인이 낮아야하므로 두 번째 항목이 첫 번째 항목 위에 그려집니다.Y 위치를 기준으로 MovieClips의 하위 색인을 변경합니까?

나는 이것을 테스트하기 위해 빠르고 더러운 함수를 작성했습니다. 트레이스가 진행되는 동안 무대 위로 올라갈 때 트럭 인덱스가 0에 도달했음을 알았지 만, 너무 멀리 올라가면 무대에서 완전히 사라질 것입니다. 추적이 오류를 생성하는 시작 :

ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
        at flash.display::DisplayObjectContainer/getChildIndex()
        at EICT::Game/ReorganizeDisplayIndexes()
        at EICT::Game/loop()

theTruck 플레이어 제어 차량 적의 무비 클립입니다, 바위는 그

없음 이벤트 리스너가없는 무비 클립을 포함하는 모든 배열은 콘입니다.

private function ReorganizeDisplayIndexes(): void 
    { 
     var drawableObjects:Array = new Array(); 
     drawableObjects.push(theTruck); 
     drawableObjects = drawableObjects.concat(Enemies, Rocks, Bushes); 
     drawableObjects.sortOn("y", Array.DESCENDING | Array.NUMERIC); 
     drawableObjects.reverse(); 
     trace(collisionLayer.getChildIndex(theTruck)); 
     for (var a:int = collisionLayer.numChildren - 1; a >= 0; a--) 
     { 
      collisionLayer.removeChildAt(a); 
     } 
     for (var i:int = 0; i < drawableObjects.length; i++) 
     { 
      collisionLayer.addChild(drawableObjects[i]); 
     } 
    } 

답변

1

힌트 : 먼저 아이를 제거 할 필요가 없습니다. 개체에 addChild()을 사용하면 다음으로 높은 깊이로 자동으로 다시 추가됩니다.

말했다, 당신은 단지 이런 식으로 뭔가를해야합니다 :

drawableObjects.sortOn("y"); 

for each(var i:DisplayObject in drawableObjects) 
{ 
    if(i.parent) 
     i.parent.addChild(i); 
} 
+0

고마워, 나는 그걸로 주위를 망 쳤어. 그리고이 코드는 트럭을 처음부터 사라지게 할 책임조차 없다는 것이 밝혀졌다. 그래도 나는이 방법을 대신 사용할 것이다. –

0

사용되는 setChildIndex 제거 및-추가 재 대신 : 또한

for (var a:int = collisionLayer.numChildren - 1; i >= 0; i--) 
{ 
    collisionLayer.setChildIndex(drawableObjects[i], i); 
} 

먼저에 약간의 낭비입니다 배열을 내림차순으로 정렬 한 다음 배열을 역순으로 정렬하십시오. 오름차순으로 정렬하여 시작하십시오!

관련 문제