Question

J'écris un jeu avec Flash CS5 / As 3.0 qui tente de simuler la profondeur de champ en tirant tous les clips de films pertinents en fonction de leur position Y dans l'ordre croissant, c'est-à-dire que les choses plus bas sur la scène se chevauchent les choses sur la scène . Un mouvement mobile avec une position Y de 10 devrait donc avoir un indice inférieur comparé à un MOVIECLIP avec une position Y de 20, de sorte que la seconde est donc dessinée sur le premier.

J'ai écrit une fonction rapide et sale juste pour tester cela. Pendant la trace, j'ai remarqué que l'indice du camion frappe 0 quand je vais près du sommet de la scène, mais si je vais trop loin, cela disparaîtra complètement de la scène. Trace commence alors à générer cette erreur:

ArgumentError: Erreur # 2025: L'affichage fourni doit être un enfant de l'appelant.
à flash.display :: displayObjectContainer / getchildindex ()
Chez EICT :: Game / ReorganizeisplayIndexes ()
chez EICT :: jeu / boucle ()

thetruck est un MovieClip du véhicule contrôlé du joueur Les ennemis, les cônes, les roches sont tous des tableaux contenant des Movieclips

Aucun d'entre eux n'a d'auditeurs d'événements.

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

Était-ce utile?

La solution

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

Autres conseils

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!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top