As3: Как сделать так, чтобы видеоклипы с самой высокой Y-позицией появлялись спереди?

Как сделать так, чтобы видеоклипы, которые у меня есть на сцене (добавлены программно), появлялись впереди одного и другого?

Я хочу, чтобы те, кто имеет самое высокое значение Y, были перед теми, кто имеет более низкое значение Y.

Спасибо!

        private function buyWorker(event:MouseEvent):void
        {       

        //Random Y pos
            var randomYPos = Math.floor(Math.random() * 400);

        //Check if the player can afford it
            if (moneyAmount >= workerCost)
                {
                    clicksound.play();

                //Deduct the cost
                    moneyAmount -= workerCost;

                var worker:Worker = new Worker();

                //Spawn the worker
                    addChild(worker);

                    for (var i:int =0; i < (root as MovieClip).numChildren; i++)
                    {
                        var child:DisplayObject = (root as MovieClip).getChildAt(i);
                        if(child is Worker) {
                            workerArray.push(child);
                        }
                    }

                //Set the workers position
                    worker.x = -50;
                    worker.y = yRange(140, 520);
                }

            else
            {
                errorsound.play();
            }
        }

1 ответ

Решение

Сортировка детей любого контейнера по y свойство (вы также можете добавить сортировку по xпросто измени ["y"] -> ["y", "x"], так что это подойдет и для изометрических объектов, если они все имеют одинаковый размер, например, плитку 1x1):

public static function sortChildren(container:DisplayObjectContainer):void
{
    const children:Array = [];
    const len:uint = container.numChildren;
    const sortOnProps:Array = ["y"];

    var i:uint;
    for(i=0; i < len; i++)
        children.push(container.getChildAt(i));

    children.sortOn(sortOnProps, Array.NUMERIC);

    var child:DisplayObject;

    i = 0;
    while (i < len)
    {
        child = DisplayObject(children[i]);
        container.setChildIndex(child, i);
        i++;
    }
}

Тестовое задание:

    var container:Sprite = addChild(new Sprite()) as Sprite;

    var sh:Shape;
    for(var i:int =0; i < 100; i++)
    {
        sh = new Shape();
        sh.graphics.beginFill(0xFFFFFF*Math.random(), 1);
        sh.graphics.drawCircle(50, 50, 50);
        sh.graphics.endFill();
        container.addChild(sh);

        sh.x = int(Math.random() * 500);
        sh.y = int(Math.random() * 500);
    }

    sortChildren(container);

Результат:

Другие вопросы по тегам