Для цикла с проблемой onRollOver - PullRequest
1 голос
/ 30 марта 2009

Я не могу заставить этот цикл For работать с onRollOver.

for (var i:Number = 1; i<=4; i++) {
    this['videobutton'+i].onRollOver = function() {
        trace(i);
        this['stream'+i].pause(false);
        this['video'+i].attachVideo(this['stream'+i]);
        fadeIn(this['video'+i]);
    };
}

Кажется, это связано с переменной областью действия и i, но я не знаю, как это исправить.

След дает мне: 5

Есть идеи?

Вот исходный файл: http://drop.io/gqdcyp3

Обновление
Я решил это сам, но я не думаю, что это оптимальное решение:

var videos:Array = new Array(
'ltp_video-low1.flv',
'ltp_video-low1.flv',
'ltp_video-low1.flv',
'ltp_video-low1.flv'
);

function videoOver(buttonMC,video,stream) {
    buttonMC.onRollOver = function() {
    stream.pause(false);
    video.attachVideo(stream);
    fadeIn(video);
    };
}

function videoOut(buttonMC,video,stream) {
    buttonMC.onRollOut = function() {
    fadeOut(video);
    stream.pause();
    };
}

for (var i:Number=1; i<=4; i++) {
    this['connection'+i] = new NetConnection();
    this['connection'+i].connect(null);
    this['stream'+i] = new NetStream(this['connection'+i]);
    this['stream'+i].play(videos[i-1]);
    videoOver(this['videobutton'+i],this['video'+i],this['stream'+i]);
    videoOut(this['videobutton'+i],this['video'+i],this['stream'+i]);
}

Во всяком случае, это работает. Но было бы здорово, если бы кто-то мог дать мне решение, созданное из этого, так как оно работает. Как я могу иметь функции в цикле?

Ответы [ 3 ]

1 голос
/ 30 марта 2009

Хм, это может или не может помочь. Flash AS2 имеет дерьмовую область видимости, а также с вещами, управляемыми событиями, то, что было «i», будет отличаться от того, что «i». Где у вас есть

trace(i) 

хотя я немного его расширил, чтобы отследить ("i:" + i + "this.ID:"+this.ID) вы всегда получите 5, потому что хотя я был 1-4 в цикле, цикл завершился, и «i» остается 5 после нажатия кнопки (я немного не уверен, почему это 5, а не 4 ...). Я считаю хорошей практикой добавлять поле идентификатора в movieClips в подобных случаях.

Доступ к идентификатору осуществляется с помощью средства доступа к токену (я думаю, именно так он и называется), поскольку он не является нативным свойством класса MovieClip (полагаю, что «видеопрограмма» сделана из MovieClip)

for (var i:Number = 1; i<=4; i++) {
    this['videobutton'+i]["ID"]=i
    this['videobutton'+i].onRollOver = function() {
        trace("i:"+i+" this['ID']:"+this["ID"]);
        this['stream'+this["ID"]].pause(false);
        this['video'+this["ID"]].attachVideo(this['stream'+this["ID"]]);
        fadeIn(this['video'+this["ID"]]);
    }
}

Надеюсь, это сработает .... если нет, продолжайте писать!

1 голос
/ 30 марта 2009

Вам необходимо определить переменную, скажем, id внутри каждого из ваших videobutton мувиклипов. Эти переменные, в отличие от i, будут иметь разные значения для каждой кнопки. Тогда вы больше не используете this.i внутри своих функций onRollOver, вы используете this.id.

Кроме того, поскольку onRollOver запускается для каждой видеокоммутатуры, this внутри функции указывает на видеокнопку, а не на сцену.

Новый код будет:

for (var i:Number = 1; i<=4; i++) {
        this['videobutton'+i].id = i;
        this['videobutton'+i].onRollOver = function() {
        trace(this.id);
                ['stream'+this.id].pause(false);
                this.attachVideo(['stream'+this.id]);
                fadeIn(['video'+this.id]);
        };
}

Отслеживает числа от 1 до 5 в зависимости от того, на какую кнопку вы перевернетесь. Он должен работать и с видео, если с остальным кодом нет ничего плохого.

1 голос
/ 30 марта 2009

Я ничего не делал с Flash раньше, но похоже, что переменная i закрывается над . Код внутри обработчика опрокидывания выполняется только при опрокидывании, и в это время оценивается i; не в то время, когда функция определена.

Создав функцию обработчика в другой функции, каждый обработчик должен получить свой собственный i:

for (var i:Number = 1; i<=4; i++) {
        this['videobutton'+i].onRollOver = MakeRollOverHandler(i);
}

function MakeRollOverHandler(i:Number)
{
    return function()  {
        trace(i);
                this['stream'+i].pause(false);
                this['video'+i].attachVideo(this['stream'+i]);
                fadeIn(this['video'+i]);
        };
}

Возможно, вам придется настроить синтаксис ActionScript, но общая идея должна быть обоснованной, если параметры функции передаются по значению. Каждый вызов MakeRollOverHandler будет создавать отдельный i.

Из документов ActionScript я замечаю, что onRollOver не предоставляет никакой информации о том, какая кнопка вызвала событие. Обидно, потому что если бы это было так, вы могли бы использовать эту информацию и выбрать соответствующий набор полей.

...