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);
Результат: