stage.addChild和分层

时间:2009-09-30 18:54:33

标签: actionscript-3

我有一个简单的功能,当你点击一个按钮时,会在一个随机的x和y位置将一个影片剪辑添加到舞台上。我遇到的问题是新的电影剪辑最终掩盖了按钮。我试图将新创建的mc的z-index更改为低于按钮的z-index,但这并不能解决问题。如何阻止新的mc覆盖已经存在的元素。

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

6 个答案:

答案 0 :(得分:12)

或者 - 或者更多地使用longterm - 不要将所有添加的对象作为与按钮相同的图层的子项。

所以而不是:

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

有:

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

甚至:

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

object layerbutton layer只能是Sprite个对象,即:

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

等等。

我认为你会发现长期思考这种方式更有用,而不仅仅是改变z指数。

顺便提一下,更新的Flash Player 10 具有.z属性(即使它不在文档中) - 正如Reuben所说,它用于新的3D变换。遗憾的是,3D变换对z排序或z分层没有任何支持,所以在这种情况下没有帮助。

答案 1 :(得分:2)

我知道这个问题已经得到解答了,但您也可以使用addChildAt()来指定要添加DisplayObject的索引,可以使用numChildren,也可以保留自己的索引记录来添加。< / p>

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,由于显示列表的工作方式,按钮将从舞台中短暂移除,因此也会导致闪烁。

答案 2 :(得分:0)

MovieClip在AS3 (reference)

中没有名为“z”的属性

您应该阅读AS3的新display list模型。它应该可以帮助您了解对象如何相互叠加。

答案 3 :(得分: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);
}

答案 4 :(得分:0)

无论您做什么,这种方式都将确保按钮是最顶级的项目。在已添加的内容(在同一容器中)上调用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;

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

您也可以通过替换

来做同样的事情
stage.addChild(friends1_btn);

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

答案 5 :(得分:0)

MovieClip的“z”属性用于Flash Player 10中的3D转换 - 而您需要明确设置MovieClip的子索引

一种好方法是手动将friends1_btn的索引设置为前面:

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

(旁注 - 如果你想在舞台上随机定位一个MovieClip,你应该使用stage.stageWidthstage.stageHeight,否则你只能得到舞台上物体的宽度和高度,不是舞台本身。)