Alterando o índice filho de MovieClips com base na posição Y?
-
14-11-2019 - |
Pergunta
Estou escrevendo um jogo com Flash CS5/AS 3.0 que tenta simular a profundidade de campo desenhando todos os clipes de filme relevantes com base em sua posição Y em ordem crescente, ou seja,as coisas mais baixas no palco se sobrepõem às coisas mais altas no palco.Um MovieClip com posição Y de 10 precisaria, portanto, ter um índice mais baixo em comparação com um MovieClip com posição Y de 20, de modo que o segundo fosse desenhado em cima do primeiro.
Eu escrevi uma função rápida e suja apenas para testar isso.Durante o rastreamento, percebi que o índice do caminhão chega a 0 quando chego perto do topo do palco, mas se subir muito ele desaparece completamente do palco.Trace então começa a gerar este erro:
ArgumentoErro:Erro #2025: O DisplayObject fornecido deve ser filho do chamador.
em flash.display::DisplayObjectContainer/getChildIndex()
em EICT::Game/ReorganizeDisplayIndexes()
em EICT::Game/loop()
O TheTruck é um movimento dos inimigos de veículos controlados pelo jogador, cones, rochas são todas as matrizes que contêm movieclips
Nenhum deles possui ouvintes de eventos.
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]);
}
}
Solução
Dica:Você não precisa remover a criança primeiro.Quando você usa addChild()
em um objeto, ele é automaticamente adicionado novamente à próxima profundidade mais alta.
Dito isto, você só precisará fazer algo assim:
drawableObjects.sortOn("y");
for each(var i:DisplayObject in drawableObjects)
{
if(i.parent)
i.parent.addChild(i);
}
Outras dicas
Use setChildIndex em vez de remover e adicionar novamente:
for (var a:int = collisionLayer.numChildren - 1; i >= 0; i--)
{
collisionLayer.setChildIndex(drawableObjects[i], i);
}
Além disso, é um desperdício ordenar primeiro a classificação em ordem decrescente e depois inverter a matriz.Classifique em ordem crescente para começar!