ActionScript: меняем местами визуальные объекты

При написании кода 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); */ }

Результат:

Как видите, всё довольно просто. Причём я привёл далеко не все возможные способы решения поставленной задачи.

Автор: admin

Дата добавления: 2012-11-30

Просмотров: 10671

Рейтинг поста: +11-

Правила перепечатки

Социальные закладки:
Комментарии:
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2017-02-14
Вам придётся в переменную запоминать уровень, на котором изначально находился мувик:


var index_int:int = parent_mc.getChildIndex(parent_mc.child_mc);
trace(index_int)


А потом на этот уровень переносить мувик.
Комментатор
Комментарий добавил(а): Анна
Дата добавления: 2017-02-14
Подскажите пожалуйста, а как вернуть обратно Мувик на его "место"? У меня есть MC, на него startDrag. Когда я его хватаю, он перемещается на передний план: setChildIndex( MC, numChildren - 1 ); И затем, когда я его отпускаю stopDrag, он должен с переднего плана уйти на свое место. Как это реализовать?
Комментатор
Комментарий добавил(а): Иван
Дата добавления: 2013-01-29
Для смены глубин двух дочерних визуальных объектов, мне больше нравится метод -
swapChildren(child1:DisplayObject, child2:DisplayObject)
Меняет местами заданные объекты, при этом все остальные дочерние объекты в данном контейнере остаются на своих местах.
Добавить комментарий:







[ + ] помощь по форматирование текста

Идиот-тест

Если все обязательные поля (отмечены * ) заполнены необходимой информацией, то нажимаем кнопку Добавить комментарий.

Меню
Подписка
Рубрики
Метки
Последние комментарии
Рейтинг постов
Реклама
Друзья
География гостей
Статистика
Яндекс.Метрика