Изменение дочернего индекса MovieClips в зависимости от их положения Y? - PullRequest
0 голосов
/ 01 марта 2012

Я пишу игру с Flash CS5 / AS 3.0, которая пытается смоделировать глубину резкости, рисуя все соответствующие мувиклипы на основе их позиции Y в порядке возрастания, то есть вещи ниже на сцене перекрывают вещи выше на сцене,Поэтому MovieClip с позицией Y, равной 10, должен иметь более низкий индекс по сравнению с MovieClip с позицией Y, равной 20, поэтому второй будет нарисован поверх первого.

Я написал быстрый игрязная функция просто чтобы проверить это.Во время трассировки я заметил, что индекс грузовика достигает 0, когда я подхожу к вершине сцены, но если я подойду слишком далеко, он полностью исчезнет со сцены.Затем трассировка начинает генерировать эту ошибку:

ArgumentError: Ошибка # 2025: Указанный объект DisplayObject должен быть дочерним по отношению к вызывающей стороне.на flash.display :: DisplayObjectContainer / getChildIndex ()на EICT :: Game / ReorganizeDisplayIndexes ()at EICT :: Game / loop ()

theTruck - это мувиклип контролируемого игроком транспортного средства. Враги, конусы, скалы - это массивы, содержащие MovieClips

Ни у одного из них нет прослушивателей событий.

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

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Подсказка: вам не нужно сначала убирать ребенка.Когда вы используете addChild() для объекта, он автоматически добавляется на следующую высшую глубину.

При этом вам просто нужно сделать что-то вроде этого:

drawableObjects.sortOn("y");

for each(var i:DisplayObject in drawableObjects)
{
    if(i.parent)
        i.parent.addChild(i);
}
0 голосов
/ 01 марта 2012

Используйте setChildIndex вместо удаления и повторного добавления:

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

Также немного расточительно сначала упорядочить сортировку по убыванию, а затем перевернуть массив.Сортировать по возрастанию для начала!

...