PDA

Просмотр полной версии : Проблема с добавлением кнопки в мувиклип


Mulin
19.01.2011, 14:12
Всем доброго времени суток. Столкнулся с такой проблемой. Есть XML файл ноды которого создают циклом экземпляры мувиклипа и экземпляры кнопки для мувиклипа, код

for (var i:Number = 0; i<vsego; i++)
{
//создает экземпляры кнопки
var delite_btn:MovieClip = Scrol_mc.vid_mc.attachMovie("delite_btn", "Scrol_mc" +i, i);
delite_btn._x = 265;
delite_btn._y = i*65+5;
//создает экземпляры мувиклипа
var Mediablock:MovieClip = Scrol_mc.vid_mc.attachMovie("Mediablock", "Scrol_mc"+i, i);
Mediablock._y = i*65;
Mediablock._alpha = 70;

Scrol_mc.vid_mc это контейнер для скролинга экземпляров. Проблема в том, что я немогу добавить в контейнер одномременно и кнопку и мувиклип. То есть можно либо одно либо другое, но вместе не работают., не запускается цикл впринципе и поле пустое. Если код изменить таким образом

for (var i:Number = 0; i<vsego; i++)
{

//создает экземпляры кнопки
var delite_btn:MovieClip = Scrol_mc.attachMovie("delite_btn", "Scrol_mc" +i, i);
delite_btn._x = 265;
delite_btn._y = i*65+5;
//создает экземпляры мувиклипа
var Mediablock:MovieClip = Scrol_mc.vid_mc.attachMovie("Mediablock", "Scrol_mc"+i, i);
Mediablock._y = i*65;
Mediablock._alpha = 70;

То цикл создается, элементы создаются, но разумеется delite_btn не скролиться, скролиться только Mediablock. Что делать как быть? :(

udaaff
19.01.2011, 14:51
Ну так вы их на одну и ту же глубину добавляете.

Mulin
19.01.2011, 14:57
А как поставить другую? Думаете в этом проблема?

Добавлено через 20 минут
Разобрался с глубиной, но она ничего не решает. Если выставить скажем число 3 для кнопки, то просто пропадает третий по счету экземпляр мувиклипа. Я вот думаю, если поставить кнопку непосредственно в мувиклип, не циклом, а сделать частью мувиклипа. Разумеется в таком случае она просто так не заработает, курсор над кнопкой будет посылать команду как еслибы он был над мувиклипом, но могет это как нить можно обойти?

mooncar
19.01.2011, 16:39
Можно. Используйте непрерывную проверку на hitTest. Только кнопка должна быть не символом типа Button, а символом типа MovieClip.

А по проблеме. Вообще, я бы сделал либо две пачки приаттачиваемых мувиков в разных контейнерах, чтобы не было конфликотв с глубинами, либо во втором наборе просто прибавил к глубине некую константу, которая зависела бы от количества мувиков в первой пачке (то есть начал бы отсчет с vsego). То есть нумерация глубин продолжалась бы с определенного значения, и ничто бы не исчезало.

Mulin
19.01.2011, 17:01
mooncar, две пачки контейнеров не лучший выход, это скролить два контейнера нужно. Хотя... можно привязать _y нескролируемого к _y скролируемого. Жесть конечно, но выход. Что касается кностант. Оно не только исчезает, но и кнопка все равно на месте исчезнувшего контейнера не появляется. Вобщем вопрос пока открыт.
Немножко офтопика. Делаю скрол вместе с блюром. То есть в направлении скролинга контейнер должен размывается. Включить фильтр не проблема, по событию колеса он включается, а вот как его выключить?

mooncar
19.01.2011, 17:09
Пример. Рисуем mc, добавляем в кадр код и нажимаем после компиляции на mc.
import flash.filters.BlurFilter;

var filterArray:Array = new Array();
var filter:BlurFilter = new BlurFilter(30, 30, 2);
filterArray[0] = filter;
mc.filters = filterArray;

mc.onRelease = function()
{
var filter:BlurFilter = this.filters[0];
filter.blurX = 0;
filter.blurY = 0;
filterArray[0] = filter;
mc.filters = filterArray;
};

То есть выбираем нулевые параметры блюра и переназначаем массив фильтров.
То, что тут на onRelease, прикручиваем к нужному событию колесика.

PS. Новый вопрос - новая тема.

Mulin
19.01.2011, 17:45
mooncar, в том то и дело, что срабатывает он единожды, произошло событие onMouseWheel - фильтр применился, а как его убрать после окончания действия onMouseWheel?

Добавлено через 2 минуты
Я так применяю

//импортирую фильтра
blurstart = new flash.filters.BlurFilter(0, 10, 2);
blurend = new flash.filters.BlurFilter(0, 10, 2);

и применяю переменные

//переменные
vidthumbs_mc.filters = [blurstart];
vidthumbs_mc.filters = [blurend];

mooncar
19.01.2011, 17:52
У обработчика onMouseWheel есть аргумент, принимающий отрицательные или положительные значения в з-ти от направления вращения колесика:
import flash.filters.BlurFilter;

var filterArray:Array = new Array();
var filter:BlurFilter = new BlurFilter(30, 30, 2);
filterArray[0] = filter;
mc.filters = filterArray;

var mouseListener:Object = new Object();
mouseListener.onMouseWheel = function(delta) {
if (delta < 0)
{
var filter:BlurFilter = this.filters[0];
filter.blurX = 0;
filter.blurY = 0;
filterArray[0] = filter;
mc.filters = filterArray;
}
};
Mouse.addListener(mouseListener);
Или вы о каком событии говорите? "после окончания действия onMouseWheel" - это что конкретно-то?
Спустя сколько-то миллисек. блюр должен плавно убраться? Просто выключиться? Не очень понятно.

Добавлено через 23 минуты

Я так применяю

Так применяйте так же на нужное событие, только нули задайте, и фильтр обнулится.
blurend = new flash.filters.BlurFilter(0, 0, 0);

Mulin
19.01.2011, 18:24
Я плохо иногда обьясняю ). Вобщем суть такова. При вращении колесика, в сам момент перемещения контейнера, блюр включается, как только колесико перестало вращаться, контейнер не двишгаеться, фильтр не применяется. Вышеозначенным способом очень легко включить фильтр, а вто как его выключить в тот момент, когда колесо мыши не вращаеться?

mooncar
19.01.2011, 19:18
Если мувик vidthumbs_mc, то вот рабочий пример:
import flash.filters.BlurFilter;

var filterArray:Array = new Array();
var filter:BlurFilter = new BlurFilter(0, 0, 2);
var canSetBlur:Boolean = true ;
var to:Number ;

var mListener:Object = new Object();
mListener.onMouseWheel = mouseWheel;
Mouse.addListener(mListener);

function mouseWheel(delt:Number)
{
clearTimeout(to); //Если скроллинг продолжается, то установка блюра в 0 отменяется
if (canSetBlur) //триггер предотвращает множественные повторные установки блюра в 10
{
filter.blurX = 0;
filter.blurY = 10;
filterArray[0] = filter;
vidthumbs_mc.filters = filterArray;
canSetBlur = false ;
}

//Вводим отсроченную установку блюра в 0 после установки в 10
to = setTimeout(resetState, 200);

//какие-то движения mc
vidthumbs_mc._y += delt;
}

function resetState ()
{
canSetBlur = true ;
filter.blurX = 0;
filter.blurY = 0;
filterArray[0] = filter;
vidthumbs_mc.filters = filterArray;
}

Я бы еще ввел плавное увеличение-уменьшение блюра при начале и остановке движения... Но это факультативно.

Mulin
19.01.2011, 19:40
Вот спасибо :) сейчас буду разбирать код

mooncar
19.01.2011, 19:50
Вложение, если что непонятно, гляньте.
Там самое главное - после каждого движения колесика делается попытка установки блюра в 0 через 200 миллисекунд.
Если колесико опять успеет повернутся, то отсроченная установка в 0 отменяется.
Это для того, чтобы по завершению движения с мувика был снят блюр, но в процессе движения колесика установленный первый раз блюр держался.

Mulin
19.01.2011, 19:50
Я бы еще ввел плавное увеличение-уменьшение блюра при начале и остановке движения... Но это факультативно.
Это я и собираюсь додумать, еще раз спасибо

mooncar
19.01.2011, 19:55
Пожалуйста.

Это я и собираюсь додумать, еще раз спасибо
Вот был такой вариант, как во вложении к этому посту.
Но сейчас лично я пользуюсь классом TweenLite... там есть работа с фильтрами.

Mulin
19.01.2011, 20:02
Я только начал осваивать твины, пробывал скрол с плавным стартом и торможением сделать, думаю на примере вашего последнего вложения можно что нить придумать.