PDA

Просмотр полной версии : Параметр в addFrameScript


Psycho Tiger
13.11.2009, 20:04
Хочу остановить и убрать видимость.
Такой вариант не нравится.
mc.addFrameScript(0, function(mc:MovieClip):Function { return function():void { mc.stop(); mc.visible = false }}(mc) );

Ещё есть что?

Felicast
13.11.2009, 20:33
mc.addEventListener(Event.ENTER_FRAME, enterFrameListener);
function enterFrameListener(event:Event):void
{
var mc:MovieClip = event.target as MovieClip;
if (mc && (mc.currentFrame == 0))
{
mc.stop();
mc.visible = false;
}
}

TanaTiX
13.11.2009, 20:34
А какой вариант лучше? И чем?

SamFR
13.11.2009, 22:33
Мне думается, что лучше всё-же второй вариант. Привычнее как-то)
Единственно что, условие (mc.currentFrame == 0) нужно заменить на (mc.currentFrame == 1), т.к. отсчёт кадров начинается с 1, а не с 0. И ещё в конце обработчика можно написать mc.removeEventListener(Event.ENTER_FRAME, enterFrameListener), чтобы он зря не отрабатывал каждый кадр. При условии, конечно, что скрыть нужно единожды.

Felicast
14.11.2009, 11:37
первый тоже имеет право на жизнь, но я бы вынес функцию отдельно.
Единственно что, условие (mc.currentFrame == 0) нужно заменить на (mc.currentFrame == 1), т.к. отсчёт кадров начинается с 1, а не с 0.
ага. я просто очень редко использую MovieClip, поэтому не помню таких тонкостей

Psycho Tiger
14.11.2009, 19:11
Вы издиваетесь?)
Я же имею ввиду не вообще "как это можно сделать", а вменяемые варианты :)

TanaTiX - мой вариант лучше, быстрее и правильнее. Когда нужно нажать на какую нибудь кнопку мышкой (у которого mouseEnabled=true) - мы ведь подписываем объект на MouseEvent.CLICK, а не stage, где в последствии через getObjectsUnderPoint определяем список того, что под нами и циклом сравниваем элемент с собой?

SamFR, привычно то привычно, но ведь мы наследуемся от шейпа, от спрайта, от эвент диспатчера наконец. Можно ведь сразу от мувиклипа, тоже привычней)

Felicast, за помощь спасибо, но я бы сказал, твой вариант права на жизнь не имеет)

SamFR
14.11.2009, 20:28
Ну не знаю, не знаю... Во-первых, от MovieClip-а я наследовать никого не призываю :) А насчёт правильнее... не уверен. Просто, наверное, не очень доверяю недокументированным возможностям, и использую их только при крайней необходимости. Мало ли, что адобовцы к следующей версии плеера придумают :)

Насчёт скорости – да, наверное, addFrameScript() побыстрее будет, но так ли уж в данном случае важна разница в пару миллисекунд?

Добавлено через 5 минут
Кстати, больше вариантов, как вменяемых, так и невменяемых, в голову что-то не приходит...

Felicast
14.11.2009, 21:25
Я же имею ввиду не вообще "как это можно сделать", а вменяемые варианты
вы спросили
Ещё есть что?
вам ответили.
Felicast, за помощь спасибо, но я бы сказал, твой вариант права на жизнь не имеет)
аргументируйте пожалуйста

Psycho Tiger
14.11.2009, 23:07
Зачем вешать обработчик, который будет вызываться каждый кадр, который возможно будет вызывать неудобства (добавить/удалить листенер при уничтожении объекта), если можно добавить код к кадру?

SamFR
15.11.2009, 01:23
Ну не обязательно он должен отрабатывать каждый кадр. Если больше не планируется возвращение к первому кадру, либо больше не нужно в этом кадре мувик скрывать, то в теле обработчика можно сразу же отписаться от энтерфрейма. Тогда он сработает только один раз.

Я не говорю, что навешивание обработчика – самый красивый и правильный метод, просто больше документированных возможностей отловить наступление кадра я не знаю. А к недокументированным своё отношение я уже высказал выше.

P.S. Кстати, мы ведь не знаем, как работает addFrameScript()... Вполне может оказаться так, что он делает то же самое :) Ведь MovieClip, всё-таки, является наследником спрайта, и было бы логичным реализовать мувиклиповские методы, основываясь на базовой функциональности.

Vier
03.04.2010, 21:30
addFrameScript() добавляет скрипт конкретному экземпляру или самому классу?

Psycho Tiger
03.04.2010, 21:38
К экземпляру конечно.

Котяра
05.04.2010, 10:31
а так разве на работает?
mc.addFrameScript(0, function():void { mc.stop(); mc.visible = false });
другой вариант:
прописать в классе для mc метод
function frame1(){ stop(); visible = false };
если тебе нужно параметры передавать тогда:
http://gorbatov.blogspot.com/2007/09/addframescript.html

Psycho Tiger
05.04.2010, 15:21
а так разве на работает?
Писал же, что работает - но мне такой подход не нравится.

А подход что ты дал - да, хороший. Наверное, там утечек уже быть не должно - сейчас без нужды тестить.