Actionscript 3: Поместить MovieClip на определенный слой? - PullRequest
0 голосов
/ 30 июня 2011

Я сейчас работаю над платформером, и у меня есть куча разных плиток, с помощью которых я формирую свои карты. Эти плитки очень отличаются по внешнему виду, и, помещенные помимо друг друга, они дают очень резкое изменение, которое не очень визуально привлекательно. Я пытался исправить это следующим образом:

У меня есть четыре слоя, по два на каждый блок, который я исчезаю. Первый слой - это место, где находится фактическая плитка, графика. Второй слой - маска. В слое маски у меня есть градиент, который является полной противоположностью слоя маски других плиток (слой маски 1 понижается, слой маски 2 повышается). Однако мне нужно иметь возможность изменять их динамически, размещать новые градиенты в соответствующем слое маски и новые плитки в соответствующем графическом слое.

Я гуглял в течение последнего часа или около того, пытаясь найти способ определить, на какой слой помещен новый MovieClip, но все, что я нашел, это setChildIndex, который, поскольку один слой действует как маска Я не могу использовать. Есть ли такая функция в Actionscript или я собираю все комбинации плиток вручную?

Спасибо за вашу помощь, -Birjolaxew

1 Ответ

1 голос
/ 30 июня 2011

Попробуйте использовать что-то вроде этого класса:

package
{
    import flash.display.Sprite;

    public class LayeredContainer extends Sprite
    {
        // vars
        private var _layers:Array = [];

        /**
         * Constructor
         */
        public function LayeredContainer()
        {
            createLayer("_fallback_");
        }

        /**
         * Defines the layers to use
         * @param ...layers A list of layers to add
         */
        public function createLayers(...layers):void
        {
            var i:String;
            for each(i in layers)
                createLayer(i);
        }

        /**
         * Creates a single layer, adding it to the top of the display list
         * @param id The layer id
         */
        public function createLayer(id:String):Sprite
        {
            var l:Sprite = new Sprite();
            _layers[id] = l;

            addChild(l);

            return l;
        }

        /**
         * Returns a layer based on id
         * @param id The layer to return
         */
        public function layer(id:String):Sprite
        {
            return _layers[id] || layer("_fallback_");
        }
    }
}

Затем вы можете создать свои слои и добавить такие вещи:

var lc:LayeredContainer = new LayeredContainer();
lc.createLayers("tiles", "whatever", "mask");

addChild(lc);

lc.layer("tiles").addChild(_some_tile_you_made_);
...