При написании кода ActionScript часто возникает потребность поменять местами два дочерних визуальных объекта внутри объекта-контейнера. Как правило, требуется выдвинуть определённый объект на «передний план», чтобы его не перекрывали другие объекты-«соседи». В качестве упомянутых ранее визуальных объектов, в большинстве случаев, выступают MovieClip (в ActionScript 2.0) и/или Sprite (в ActionScript 3.0). И именно на примере мувиклипов и спрайтов далее будет рассмотрено решение проблемы с перемещением визуального объекта на передний план.
Итак, допустим у нас есть два мувиклипа (для большей наглядности это будут перекрывающие друг друга прямоугольники красного и чёрного цветов). И мы хотим, чтобы по клику мышки MovieClip перемещался бы на передний план. В ActionScript 2.0 для этого можно воспользоваться методом swapDepths() (который динамически меняет «глубину» расположения мувиклипа) и методом getNextHighestDepth() (возвращает номер наивысшей свободной глубины).
Код ActionScript 2.0:
/*
создаём 1-й мувиклип (красный прямоугольник)
*/
var mc_1:MovieClip = _root.createEmptyMovieClip("mc_1",_root.getNextHighestDepth());
mc_1.beginFill(0xff0000,100);
mc_1.moveTo(0,0);
mc_1.lineTo(350,0);
mc_1.lineTo(350,200);
mc_1.lineTo(0,200);
mc_1.lineTo(0,0);
mc_1.endFill();
mc_1._x = 50;
mc_1._y = 50;
/*
создаём 2-й мувиклип (черный прямоугольник)
*/
var mc_2:MovieClip = _root.createEmptyMovieClip("mc_2",_root.getNextHighestDepth());
mc_2.beginFill(0x000000,100);
mc_2.moveTo(0,0);
mc_2.lineTo(350,0);
mc_2.lineTo(350,200);
mc_2.lineTo(0,200);
mc_2.lineTo(0,0);
mc_2.endFill();
mc_2._x = 150;
mc_2._y = 150;
/*
клик по мувиклипам будет запускать функцию foreground
*/
mc_1.onPress = foreground;
mc_2.onPress = foreground;
/*
функция, меняющая мувики местами
*/
function foreground(){
this.swapDepths(_root.getNextHighestDepth());
/*
а можно использовать ещё более универсальный код:
this.swapDepths(this._parent.getNextHighestDepth());
*/
}
Если вас смущает использование _parent в приведённом выше коде, то отсылаю вас к посту «Свойство parent у экранных объектов в ActionScript».
Результат:
Кстати, этот способ будет работать и для MovieClip-ов, созданных вручную в Adobe/Macromedia Flash.
В ActionScript 3.0 для изменения глубины вложения MovieClip-ов и Sprite-ов можно использовать ещё более обширный арсенал методов и свойств. Но рассмотрим только пример с применением метода setChildIndex() (позволяет динамически менять глубину вложения) и свойства numChildren (возвращает количество объектов-«детей» внутри родительского объекта).
Код ActionScript 3.0:
/*
импорт классов
*/
import flash.display.Sprite;
import flash.events.MouseEvent;
/*
создаём 1-й спрайт (красный прямоугольник)
*/
var sprite_1:Sprite = new Sprite();
sprite_1.graphics.beginFill(0xff0000,100);
sprite_1.graphics.drawRect(0,0,350,200);
sprite_1.graphics.endFill();
this.addChild(sprite_1);
sprite_1.x = 50;
sprite_1.y = 50;
/*
создаём 2-й спрайт (черный прямоугольник)
*/
var sprite_2:Sprite = new Sprite();
sprite_2.graphics.beginFill(0x000000,100);
sprite_2.graphics.drawRect(0,0,350,200);
sprite_2.graphics.endFill();
this.addChild(sprite_2);
sprite_2.x = 150;
sprite_2.y = 150;
/*
клик по спрайтам будет запускать функцию foreground
*/
sprite_1.addEventListener(MouseEvent.CLICK, foreground);
sprite_2.addEventListener(MouseEvent.CLICK, foreground);
/*
функция, меняющая спрайты местами
*/
function foreground(event:MouseEvent):void{
var sprite:Sprite = event.target as Sprite;
this.setChildIndex(sprite, this.numChildren - 1);
/*
или так:
sprite.parent.setChildIndex(sprite, sprite.parent.numChildren - 1);
*/
}
Результат:
Как видите, всё довольно просто. Причём я привёл далеко не все возможные способы решения поставленной задачи.
var index_int:int = parent_mc.getChildIndex(parent_mc.child_mc);
trace(index_int)
А потом на этот уровень переносить мувик.