Отправить все экземпляры контейнера ЗА всем остальным?

Нашел эту тему: AS3 setChildIndex на передний план Я пытаюсь добиться прямо противоположного.

«addChildAt» не работает для меня, когда я устанавливаю контейнер позади всего остального или чего-то подобного. А что касается самих звезд, я не могу отправить их обратно больше, чем слой 0 по какой-то странной причине (это выдаст мне ошибку 2006, заявив, что «Предоставленный индекс выходит за пределы»). Вот код:

Функция starsSpawn:

var starContainer:MovieClip = new MovieClip();
addChildAt(starContainer, 20);

Код звездного контейнера:

function starsSpawn()
{
    for(var i:int= 0; i < 30; i++)
    {
        var newStar = new starCode();
        var scaleXY = Math.random()*(2)+0.1;
        newStar.width = scaleXY;
        newStar.height = scaleXY;
        var positionX:Number = Math.random()*(stage.stageWidth + (1* newStar.width));
        var randomY:Number = Math.random()*(stage.stageHeight - newStar.height);
        newStar.x = positionX;
        newStar.y = randomY;
        starContainer.addChild(newStar);
    }
}

По сути, это работает следующим образом: создается контейнер, и цикл for создает 30 звездочек, каждая из которых содержит указанный код.


person Cray    schedule 11.12.2016    source источник
comment
по какой-то странной причине не могу отправить их обратно дальше уровня 0 Это не какая-то странная причина, именно так работает AddChildAt. Чтение документации по AddChildAt должно прояснить некоторые вещи.   -  person Brian    schedule 12.12.2016
comment
Документация откуда? Поиск в Google не дает мне ничего для addChildAt, только для addChild, и это не очень полезно для меня в этом сценарии.   -  person Cray    schedule 12.12.2016
comment
Странно, поиск as3 addChildAt дал мне это в качестве первого результата. Что вы искали?   -  person Brian    schedule 12.12.2016


Ответы (1)


Когда вы addChildAt(myChildMC, 0);, он добавляется с индексом 0, а все остальное увеличивается. Индексы порядка Z в AS3 являются непрерывными, что означает, что каждое пространство от нуля до самого высокого порядка z должно быть заполнено. Если я удалю все, что находится на слое 4, слой 5 соскользнет вниз, чтобы заполнить его, и так далее.

И я не думаю, что вы можете добавить что-то к индексу 20, если во всех других индексах нет дочерних элементов. Это может быть причиной вашей конкретной ошибки. Чтобы добавить что-то на верхний уровень, просто выполните addChild(myChild).

изменить

Поскольку похоже, что у вас есть представление о том, как z-порядок работает в обратном порядке, вы, вероятно, хотите, чтобы звезды были «перед» всем остальным, т. Е. Всегда сверху, т. Е. Всегда видны. Для этого просто выполните addChild(starsContainer) после добавления всех остальных контейнеров, спрайтов или мувиклипов. Если вы добавляете что-то на сцену во время выполнения, просто снова добавьте контейнер звезд (это не создаст второй контейнер, это буквально просто изменит z-порядок, если контейнер с таким именем уже есть... это часто непонятный момент).

person Neal Davis    schedule 11.12.2016
comment
Это не отвечает на мой вопрос; как мне получить звезды позади всего остального в игре? Установка отдельных звезд на 0 не поможет, и я не могу установить любое другое число, кроме 0, так что мне делать дальше, как мне получить это за всем? Взять все остальное и поставить перед звездами? Это был бы кровавый кошмар, ДОЛЖЕН быть более простой способ, и должно быть простое объяснение того, почему этот конкретный тип экземпляра не работает, как другие. У меня враги настроены на слой 3, контейнер для снарядов корабля игрока — на 1, а контейнер с оружием — на 2. - person Cray; 11.12.2016
comment
И вышеупомянутое это; нет ничего другого, для чего я использую AddChildAt и определяю слой или положение Z, если хотите. Изменение значений, чтобы я мог разместить звезды в самом конце (установив их на слой 3), дает мне ту же предыдущую ошибку. Так как же, черт возьми, мне заставить звезды стоять за всем, и я имею в виду все? - person Cray; 11.12.2016
comment
Просто сделайте addChildAt(starContainer, 0); - person Neal Davis; 11.12.2016
comment
Уровень 3 @XirmiX не самый задний. 0 это самая задняя часть. Может быть, я неправильно понял, но вы сказали изменить значения, чтобы я мог разместить звезды в самом конце (установить их на слой 3)... - person Neal Davis; 11.12.2016
comment
Тьфу, это действительно сбивает с толку, какой путь является задним слоем, а какой - передним, когда вы привыкаете к чему-то вроде GML в Game Maker Studio... Во всяком случае, я попытался установить его на 0, и он остается позади только нескольких вещей. , перед звездами почему-то еще дела. Любая идея, что с этим? - person Cray; 12.12.2016
comment
Какой? оно остается только за несколькими вещами, по какой-то причине все еще есть вещи перед звездами... это меня смущает. Это не имеет никакого смысла. Это как если бы я сказал, что положил этот блин в самый низ стопки, но над ним все еще есть блины. Конечно, перед вашими звездами еще есть дела, нулевой уровень — это самый задний план. ВСЕ будет перед звездами, если звезды будут на нуле. Вы хотите, чтобы звезды были на вершине стопки блинов, чтобы их ничего не закрывало? Потому что это полная противоположность тому, о чем вы просили. - person Neal Davis; 12.12.2016
comment
Если вы хотите, чтобы звезды имели самый высокий порядок z (были сверху и впереди всего), это заставит звезды закрывать то, что находится под или позади. В шляпном случае сделайте противоположное тому, что мы сделали. Вместо добавления в конец стека просто выполните addChild(starContainer);. Вот и все. Сделанный. - person Neal Davis; 12.12.2016
comment
Но если вы добавите что-нибудь после этого, это закроет звезды. Так что либо добавляйте starsContainer последним. Если вы когда-нибудь добавите что-то еще, либо добавьте это ниже звездочек, используя addChildAt, либо просто снова добавьте starsContainer. - person Neal Davis; 12.12.2016
comment
Чтобы объяснить порядок z по-другому, чем выше порядок z, тем он ближе к зрителю/пользователю. Нулевой порядок находится дальше на экране компьютера. Так что, если вы хотите, чтобы звезды скрывали что-то за ним/под ним/еще дальше, просто сделайте addChild, и он будет поверх всего. У вас как будто только перед и зад задом наперед. - person Neal Davis; 12.12.2016
comment
@XirmiX Почему AddChildAt(0) не работает? Что происходит, когда вы это делаете? - person Brian; 12.12.2016
comment
Это ставит его под все остальные блины. Все остальные ваши элементы будут прикрывать звезды. Это то, что вы хотите? @ Брайан, мне кажется, что он использует формулировку «спереди» и «сзади» назад или взаимозаменяемо. - person Neal Davis; 12.12.2016
comment
@NealDavis LOL за блинами. Вина не в наших звездах, а в наших блинах. Я искал разъяснения от ОП о том, почему addChildAt(0) не решил их проблему. Вопрос звучит так, будто они хотят, чтобы эти звездные мувиклипы отставали от всего остального, что и делает addChildAt(0). Чего-то здесь не хватает. - person Brian; 12.12.2016
comment
@ Брайан, да, но потом он также говорит, что когда он это делает, перед звездами все еще есть вещи Дох! Если звезды уйдут на задний план, ВСЕ будет впереди звезд. Вот почему я думаю, что он запутался в использовании этих терминов. Он думает, что хочет отправить их обратно, но я думаю, что на самом деле он хочет, чтобы они вышли вперед. Вот почему простой addChild() должен работать, ему просто нужно убедиться, что это добавлено последним, и если он добавит что-то еще после звездочек, снова добавить звездочки. Я могу ошибаться насчет того, чего он хочет, но это мое предположение. - person Neal Davis; 12.12.2016
comment
@Brian, кстати, addChildAt требует двух параметров. Вы, наверное, это знаете, но то, как вы это написали, может кого-то смутить. - person Neal Davis; 12.12.2016
comment
@Нил хороший улов; Я был небрежен. Я должен был написать addChildAt(pancake, 0); - person Brian; 12.12.2016
comment
Да, странно, я думаю одно, а пишу другое. Извините за путаницу. Я хочу, чтобы все было впереди звезд, а звезды позади всего. Однако addChildAt() не перемещает их за все. Единственное, что они остаются позади, — это главное меню и меню опций, все остальное по какой-то странной причине остается за звездами. Возможно потому, что звезды добавлены в самом начале. Итак, поскольку текущий метод не отправляет звезды позади всего (addChildAt), есть ли что-нибудь еще, что я могу сделать, или какую-либо другую структуру, которую я могу добавить, чтобы звезды были позади всего? - person Cray; 12.12.2016
comment
Ok. Давайте просто проясним... вы хотите, чтобы звезды были закрыты и скрыты всеми другими вещами, чтобы пользователь не мог их видеть, если что-то еще занимает те же координаты x/y. Это правильно? - person Neal Davis; 12.12.2016
comment
Приведите нам один конкретный пример чего-то, что остается за звездами после выполнения addChildAt(starContainer, 0) - person Neal Davis; 12.12.2016
comment
Я подозреваю, что starContainer добавляется в другой контейнер, а не прямо на сцену. Если это так, он может иметь индекс 0 (внутри своего контейнера), но все еще иметь что-то за ним, если на сцене есть объекты за родительским объектом starContainer. Можете ли вы проверить, так ли это, XirmiX? - person Cadin; 13.12.2016