stage.addChild и слои - PullRequest
       13

stage.addChild и слои

3 голосов
/ 30 сентября 2009

У меня есть простая функция, которая, когда вы нажимаете на кнопку, добавляет видеоклип на сцену в случайном положении x и y. Проблема, которую я имею, состоит в том, что новые видеоклипы в конечном счете покрывают кнопку. Я попытался изменить z-индекс вновь созданного mc, чтобы он был ниже z-индекса кнопки, но это не решает проблему. Как остановить новый 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 ]

12 голосов
/ 01 октября 2009

Или, в качестве альтернативы, а возможно, и более длительного использования, не все добавленные объекты должны быть дочерними для того же слоя, что и кнопка.

Так что вместо:

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 layer и button 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 (хотя его нет в документации) - как говорит Рувим, он используется для новых 3D-преобразований. К сожалению, 3D-преобразования вообще не поддерживают z-сортировку или z-слои, поэтому в этом случае не помогают.

2 голосов
/ 04 октября 2009

Я знаю, что на этот вопрос уже был дан ответ, но вы также можете использовать 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 голосов
/ 01 октября 2009

Свойство «z» мувиклипа используется для трехмерных преобразований в Flash Player 10 - вместо этого вам нужно явно указать дочерний индекс 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);
}

(Примечание: если вы хотите расположить мувиклип на сцене случайным образом, вы должны использовать stage.stageWidth и stage.stageHeight, в противном случае вы получаете только ширину и высоту объектов на сцене, а не саму сцену. ).

0 голосов
/ 01 октября 2009

Таким образом, кнопка будет самым верхним элементом независимо от того, что вы делаете. Вызов 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);
0 голосов
/ 01 октября 2009

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 голосов
/ 01 октября 2009

MovieClip не имеет свойства с именем 'z' в AS3 (ссылка)

Вы должны прочитать в новой списке отображения модель для AS3. Это должно помочь вам понять, как объекты могут быть наложены друг на друга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...