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]);
        }
    }
Foi útil?

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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top