Pregunta

Estoy escribiendo un juego con Flash CS5 / AS 3.0 que intenta simular la profundidad de campo dibujando todos los clips de películas relevantes según su posición y en orden ascendente, es decir, las cosas más bajas en la etapa se superponen en la etapa . Por lo tanto, un MOVIECLIP con una posición de Y 10, por lo tanto, tendría que tener un índice más bajo en comparación con un movieclip con una posición y de 20, por lo que la segunda se dibuja sobre la primera.

Escribí una función rápida y sucia para probar esto. Durante la traza, me he dado cuenta de que el índice del camión golpea 0 cuando me acerco a la cima del escenario, pero si voy demasiado lejos, desaparecerá completamente del escenario. Trace, luego comienza a generar este error:

argumentError: Error # 2025: El proyecto suministrado debe ser un niño de la persona que llama.
en Flash.Display :: DisplayObjectContainer / GetchildIndex ()
en EICT :: Juego / ReorganizedIsPlayIndexes ()
en EICT :: Juego / Loop ()

thetruck es un movieclip del vehículo controlado del jugador Los enemigos, los conos, las rocas son todas las matrices que contienen movieclips

Ninguno de ellos tiene oyentes 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]);
        }
    }

¿Fue útil?

Solución

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

Otros consejos

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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top