Промяна на дъщерния индекс на филмови клипове въз основа на тяхната Y позиция?

Пиша игра с Flash CS5/AS 3.0, която се опитва да симулира дълбочина на рязкост, като рисува всички съответни филмови клипове въз основа на тяхната Y позиция във възходящ ред, т.е. нещата по-ниско на сцената се припокриват с нещата по-високо на сцената. Следователно MovieClip с Y позиция 10 ще трябва да има по-нисък индекс в сравнение с MovieClip с Y позиция 20, така че вторият се изчертава върху първия.

Написах бърза и мръсна функция само за да тествам това. По време на проследяването забелязах, че индексът на камиона достига 0, когато се приближа до върха на сцената, но ако отида твърде далеч нагоре, той напълно ще изчезне от сцената. След това Trace започва да генерира тази грешка:

ArgumentError: Грешка #2025: Предоставеният DisplayObject трябва да е дете на извикващия.
във flash.display::DisplayObjectContainer/getChildIndex()
в EICT::Game/ReorganizeDisplayIndexes ()
в EICT::Game/loop()

theTruck е филмов клип на контролирано от играча превозно средство Врагове, конуси, камъни са всички масиви, които съдържат филмови клипове

Никой от тях няма слушатели на събития.

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

person Anthony L    schedule 01.03.2012    source източник


Отговори (2)


Съвет: Не е необходимо първо да премахвате детето. Когато използвате addChild() върху обект, той автоматично се добавя отново към следващата най-висока дълбочина.

Това каза, просто ще трябва да направите нещо подобно:

drawableObjects.sortOn("y");

for each(var i:DisplayObject in drawableObjects)
{
    if(i.parent)
        i.parent.addChild(i);
}
person Marty    schedule 01.03.2012
comment
Благодаря, поразрових се с него и се оказа, че този код дори не е отговорен за изчезването на камиона. Въпреки това все пак ще използвам този метод. - person Anthony L; 01.03.2012

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

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

Освен това е малко разточително първо да подредите сортирането в низходящ ред и след това да обърнете масива. Подредете го във възходящ ред като начало!

person grapefrukt    schedule 01.03.2012