Domanda

Sto scrivendo un gioco con Flash CS5 / AS 3.0 che cerca di simulare la profondità del campo disegnando tutte le clip cinematografiche rilevanti in base alla loro posizione Y in ordine ascendente, cioè le cose inferiori sul palcoscenico si sovrappongono le cose più in alto sul palco . Un MovieClip con una posizione Y per 10 dovrebbe quindi avere un indice inferiore rispetto a un MovieClip con una posizione Y di 20, quindi il secondo viene disegnato sopra il primo.

Ho scritto una funzione rapida e sporca solo per testare questo. Durante la traccia, ho notato che l'indice del camion colpisce 0 quando vado vicino alla cima del palco, ma se vado troppo lontano scomparirà completamente dal palco. Traccia quindi inizia a generare questo errore:

.

ArgumentError: Errore # 2025: La visualizzazione fornita deve essere un figlio del chiamante.
a flash.display :: DisplayObjectContainer / GetChildindex ()
A EIC :: gioco / reorganizedisplaySexes ()
A EICT :: Game / Loop ()

Thetruck è un MovieClip del veicolo controllato del giocatore Nemici, coni, rocce sono tutti matrici che contengono MovieClips

Nessuno di loro ha ascoltatori di eventi.

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

È stato utile?

Soluzione

Hint: You don't need to remove the child first. When you use addChild() on an object, it is automatically re-added to the next highest depth.

That said, you'll just need to do something like this:

drawableObjects.sortOn("y");

for each(var i:DisplayObject in drawableObjects)
{
    if(i.parent)
        i.parent.addChild(i);
}

Altri suggerimenti

Use setChildIndex instead of removing and re-adding:

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

Also, it's a bit wasteful to first order the sort in descending and then reversing the array. Sort it ascending to begin with!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top