Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Визульное выделение объектов на сцене (http://www.flasher.ru/forum/showthread.php?t=122886)

Intruder1 20.03.2009 14:30

Визульное выделение объектов на сцене
 
Подскажите пожалуйста, кто делал визуальное выделение муви-клипа, как это можно реализовать? Т.е. на сцене есть mc, в виде прямоугольника, окружности и т.д.
Нужно как-то показать, какие в данный момент выделены (selection).
Пробовал рисовать на graphics мувика, маленькие окружности в углах мувика. Но они плавают, при изменении размеров клипа

serenkiy 20.03.2009 16:48

Думаю стоит применить какой-нибудь фильтр, например, свечение (GlowFilter).

Роман Вадимович 20.03.2009 17:05

Задача не очень простая, как кажется.
Фильт наиболее простой способ, это легче чем рисовать прямоугольную рамку.
Я в подобных случаях делал класс (ObjectSelector) у которого были подобные методы:
1) add( object:DisplayObject ) - добавить в список выделения объект
2) remove( object:DisplayObject ) - удалить объект из списка выделения
3) removeAll() - удалить все объекты из списка выделения

Внутри (ObjectSelector) был массив, в кором я хранил этот список.
Не знаю поможет ли это - мне было удобнее сделать так.

Intruder1 20.03.2009 17:17

Цитата:

Сообщение от Роман Вадимович (Сообщение 807192)
Задача не очень простая, как кажется.
Фильт наиболее простой способ, это легче чем рисовать прямоугольную рамку.
Я в подобных случаях делал класс (ObjectSelector) у которого были подобные методы:
1) add( object:DisplayObject ) - добавить в список выделения объект
2) remove( object:DisplayObject ) - удалить объект из списка выделения
3) removeAll() - удалить все объекты из списка выделения

Внутри (ObjectSelector) был массив, в кором я хранил этот список.
Не знаю поможет ли это - мне было удобнее сделать так.

Спасибо. Это понятно. Но больше интересует, как нарисовать саму рамку?

GFreemen 20.03.2009 17:36

Код AS1/AS2:

function risovanie_obramlenie(element_name:MovieClip){
        var element_rect_obj:Object=element_name.getRect(_root.konteiner_vivoda);
        //если ОБРАМЛЕНИЕ выделения не были добавлены
        if(_root.konteiner_vivoda.element_obramlenie==underfined){
                //добавляем клип для рисования обрамления
                _root.konteiner_vivoda.createEmptyMovieClip("element_obramlenie",glubina_kursor+1);
        }
        _root.konteiner_vivoda.element_obramlenie._x=element_rect_obj.xMin;
        _root.konteiner_vivoda.element_obramlenie._y=element_rect_obj.yMin;
        _root.konteiner_vivoda.element_obramlenie.clear();
        //параметры для рисования линии с градиентом
        colors = [0xFF0000, 0x0000FF];
        alphas = [100, 100];
        ratios = [0, 0xFF];
        matrix = {a:200, b:0, c:0, d:0, e:200, f:0, g:200, h:200, i:1};
        spreadMethod = "reflect";
        interpolationMethod = "linearRGB";
        focalPointRatio = 0.9;
        _root.konteiner_vivoda.element_obramlenie.lineStyle(3);
        _root.konteiner_vivoda.element_obramlenie.lineGradientStyle("linear", colors, alphas, ratios, matrix, spreadMethod, interpolationMethod, focalPointRatio);
        _root.konteiner_vivoda.element_obramlenie.moveTo(-10, -10);
        _root.konteiner_vivoda.element_obramlenie.lineTo(-10, element_rect_obj.yMax-element_rect_obj.yMin+10);
        _root.konteiner_vivoda.element_obramlenie.lineTo(element_rect_obj.xMax-element_rect_obj.xMin+10, element_rect_obj.yMax-element_rect_obj.yMin+10);
        _root.konteiner_vivoda.element_obramlenie.lineTo(element_rect_obj.xMax-element_rect_obj.xMin+10, -10);
        _root.konteiner_vivoda.element_obramlenie.lineTo(-10, -10);
        _root.konteiner_vivoda.element_obramlenie.endFill();
}

В общем теория такая:
1. В функцию/метод передаем ссылку на мувик1, который надо выделить. (у меня это происходило по нажатию на него).
2.Узнаем его размеры.
3.Создаем мувик2 где будет рисоваться "выделение", и засовываем его на самый верх.
4.ставим мувик 2 в координаты (глобальные) левого верхнего угла мувика1.
5.делаем небольшой отступ (у меня 10 клеток) и рисуем квадрат в мувике2.
если мувик1 меняет свои координаты (например его перетаскивают и т.д.) или меняет свой масштаб/размеры, то по событию движения мыши (если по онЭнтерФрейму - то визуально заметны скачки) каждый раз запускаем эту функцию.
У меня это в АС2. В третьем реализовать не сложнее.

Роман Вадимович 20.03.2009 17:45

Аналогично.
Мне кажется рамка не должна быть внутри выделяемых Вами объектов.
Допустим все объекты которые Вам нужны находятся в контейнере objectsSprite.
В objectsSprite Вы можете создать пустой контейнер для вашей рамки.
Каждый раз когда выполняется изменяется содержимое контейнера - перерисовывать рамку.
Благодаря классу, который я Вам предложил, можно организовать не подсвечиваение выделенных объектов, а прорисовку рамки
Это может быть достигнуто путем перебора объектов и вычисления верхней левой и нижней правой точек.
Когда границы известны достаточно вызвать drawRect с нужными размерами.

Alex Lexcuk 20.03.2009 19:31

попробуйте фильтром так
Код:

mc.filters = new Array(new GlowFilter(0xFF0000,1,6,6,6));//свечение (обрисовка контуром)
Если надо убрать фильтр
Код:

mc.filters = null;

Intruder1 24.03.2009 18:42

Всем спасибо. Всё таки остановился на фильтре


Часовой пояс GMT +4, время: 07:30.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.