2009-09-30 3 views
3

버튼을 클릭하면 무작위 x 및 y 위치에서 스테이지에 무비 클립을 추가하는 간단한 함수가 있습니다. 내가 가지고있는 이슈는 결국 새로운 무비 클립이 결국 버튼을 덮는다는 것입니다. 새로 만든 mc의 z- 인덱스를 단추의 z- 인덱스 아래로 변경하려고 시도했지만 문제가 해결되지 않습니다. 새로운 mc가 이미 존재하는 요소를 은폐하는 것을 어떻게 막을 수 있습니까?stage.addChild 및 레이어링

friends1_btn.addEventListener(MouseEvent.CLICK, friendMaker); 

function friendMaker(evt:MouseEvent):void { 
    var newFriend:Teddy = new Teddy(); 
    newFriend.x = Math.random()*stage.width; 
    newFriend.y = Math.random()*stage.height; 
    newFriend.z = 0; 
    stage.addChild(newFriend); 
} 

답변

12

또는 다른 방법으로 longterm을 더 많이 사용하면 추가 된 모든 객체가 버튼과 같은 레이어의 하위 레이어로 포함되지는 않습니다.

그래서 대신

:

stage 
    | 
    +--- object 1 
    | 
    +--- object 2 
    | 
    +--- button 
    | 
    +--- object 3 

은 유무 : 심지어

stage 
    | 
    +--- object layer 
    |  | 
    |  +--- object 1 
    |  | 
    |  +--- object 2 
    | 
    +--- button 

또는를 : object layerbutton layer 단순히 Sprite 객체가 될 수

stage 
    | 
    +--- object layer 
    |  | 
    |  +--- object 1 
    |  | 
    |  +--- object 2 
    | 
    +--- button layer 
      | 
      +--- button 

, 즉 :

var objectLayer:Sprite=new Sprite(); 
var buttonLayer:Sprite=new Sprite(); 
stage.addChild(objectLayer); 
stage.addChild(buttonLayer); 
buttonLayer.addChild(myButton); 

등등.

Z- 색인을 이동하는 것보다 오히려 장기간 생각하는 것이 더 유용 할 것입니다.르우벤이 말한대로, 그것은 새로운 3D 변환을 위해 사용되는 -

또한, 업데이트 된 플래시 플레이어 10 은 (는 문서에 아니더라도).z 속성을 가지고있다. 슬프게도 3D 변환은 z 정렬이나 z 레이어링을 지원하지 않으므로이 경우 도움이되지 않습니다.

+0

네, 약간 복잡한 점 때문에이 방법을 추천합니다. 때때로 당신은 한 가지보다 더 높은 것을 원하지만 다른 것보다 높지는 않습니다. 따라서 관리가 훨씬 쉬워집니다. – Allan

+0

어떤 이유로 Sprite를 사용하지 않고도이 작업을 수행 할 수 있는지 알고 싶었지만 예상대로 실제로 작동하는 유일한 대답입니다. 따라서 bravo, IanT. 결과적으로 코드에 한 줄 더 추가해야했습니다. newFriend을 표시하려면 다음과 같이 작성해야합니다. objectLayer.addChild (newFriend); – staypuffinpc

+0

한 가지 더 : 위에서 작성한 작은 비주얼은이 답변의 내용을 이해하는 데 매우 유용했습니다. 감사합니다. – staypuffinpc

0

무비 클립 당신은 AS3에 대한 새로운 display list 모델에 읽어해야

AS3 (reference)에서 'Z'라는 이름의 때에 프로퍼티가 없습니다. 객체가 서로 쌓을 수있는 방법을 이해하는 데 도움이됩니다.

+0

Flash Player 10을 타겟팅하는 경우에 해당합니다. – mrkishi

+0

원본 코드에서 보여주지 않은 한 가지는 이러한 mcs 및 btn의 z- 인덱스를 추적하여 예상대로 읽는 것입니다. 그래서 as3은 z-index w/o 오류를 지정했지만 수정하는 데는 올바른 속성이 아닙니다. 여기에있는 모든 사람들이 지적했듯이, 레이어 링은 실제로 디스플레이 목록에서 처리됩니다 (왜 "레이어"속성이 없습니까?). – staypuffinpc

+0

감사합니다. Kishi. 내 플래시 참조 북마크를 업데이트했습니다. – jessegavin

0

swapChildren()해야합니다.

friends1_btn.addEventListener(MouseEvent.CLICK, friendMaker); 

function friendMaker(evt:MouseEvent):void { 
    var newFriend:Teddy = new Teddy(); 
    newFriend.x = Math.random()*stage.width; 
    newFriend.y = Math.random()*stage.height; 
    stage.addChild(newFriend); 
    stage.swapChildren(newFriend, friends1_btn); 
} 
+0

이 스크립트를 실행하려고하면 오류가 발생합니다. "오류 # 2025 : 제공된 DisplayObject가 발신자의 자녀 여야합니다." – staypuffinpc

0

이 방법을 사용하면 어떤 작업을 하든지 버튼이 맨 위에 표시됩니다. 이미 (동일한 컨테이너에) 추가 된 항목에 대해 addChild를 호출하면 맨 위에 readd가 표시됩니다.

friends1_btn.addEventListener(MouseEvent.CLICK, friendMaker); 

    function friendMaker(evt:MouseEvent):void { 
     var newFriend:Teddy = new Teddy(); 
     newFriend.x = Math.random()*stage.width; 
     newFriend.y = Math.random()*stage.height; 

     stage.addChild(newFriend); 
     stage.addChild(friends1_btn); 
    } 

또한

stage.swapChildrenAt(stage.getChildIndex(friends1_btn), stage.numChildren - 1); 
0

MovieClip의의 "Z"속성

stage.addChild(friends1_btn); 

를 대체하여 동일한 기능을 수행 할 수있는 플래시 플레이어 10에서 3D 변환을 위해 사용된다 - 대신 당신은 MovieClip의 하위 색인을 명시 적으로 설정해야합니다.

좋은 방법은 없습니다. 당신이 무작위로 스테이지에 무비 클립을 배치하려는 경우 그렇지 않으면 당신은 폭을 받고, 당신이 stage.stageWidthstage.stageHeight를 사용해야하고, -

friends1_btn.addEventListener(MouseEvent.CLICK, friendMaker); 

function friendMaker(evt:MouseEvent):void { 
    var newFriend:Teddy = new Teddy(); 
    newFriend.x = Math.random()*stage.width; 
    newFriend.y = Math.random()*stage.height; 
    stage.addChild(newFriend); 
    stage.setChildIndex(friends1_btn,stage.numChildren-1); 
} 

(A 보조 노트를 : 오 수동으로 전면 friends1_btn의 인덱스를 설정 무대 자체가 아니라 무대 위의 물건 높이).

+0

불량. 이 기능이 제대로 작동되기를 기대했지만 버튼을 클릭하면 "오류 # 2025 : 제공된 DisplayObject가 발신자의 자녀 여야합니다."라는 메시지가 나타납니다. – staypuffinpc

+0

좋아, 더 명확히하기 위해, 이것은 실제로 무대에서 newFriend 객체를 생성했지만, 오류를 얻는 것 외에도 버튼 상단에 있었다. – staypuffinpc

2

이 질문에 대한 답변은 이미 알고 있지만 addChildAt()를 사용하여 DisplayObject를 추가 할 인덱스를 지정하거나 numChildren을 사용하거나 추가 할 인덱스를 직접 기록 할 수 있습니다.

private var friends1_btn:Sprite; 

function friendMaker(evt:MouseEvent):void 
{ 
    var newFriend:Teddy = new Teddy(); 
    newFriend.x = Math.random()*stage.width; 
    newFriend.y = Math.random()*stage.height; 
    stage.addChildAt(newFriend, stage.numChildren-1); 
    //or if your not sure if the button will always be on top 
    stage.addChildAt(newFriend, stage.getChildIndex(friends1_btn)-1); 
} 

당신은 버튼을 짧게 단계에서 제거됩니다로도 방식으로 인해 깜박 거리는 원인이됩니다,이 사건이 Event.ADDED_TO_STAGE를 트리거 유지할으로 무대에 원래의 버튼을 계속 추가 할하지 마십시오 디스플레이 목록이 작동합니다.

+0

흥미롭게도 stage.numChildren-1 코드는 제대로 작동하지만 stage.getChildIndex (friends1_btn) -1은 오류를 반환합니다. "오류 # 2025 : 제공된 DisplayObject가 발신자의 자식이어야합니다." 버튼을 클릭하면 이것은 여러분이 여기에 제시 한 다른 답변의 대부분과 함께 반환되는 동일한 오류입니다. 버튼 (이 경우)은 스테이지의 자식이므로이 오류가 왜 발생하는지 확신 할 수 없습니다. 어떤 아이디어? – staypuffinpc

+0

정말이 방법을 테스트하는 빠른 방법은 다음 중 하나를 수행하는 것입니다 stage.contains (friends1_btn) 포함되어 있으면 true를 반환하지만 부모가 단순히 추적 (friends1_btn.parent)을 수행하는지 확인하려면 네가 얻는 것을 알아라. – enzuguri

관련 문제