Проблема цикла Netstream () - PullRequest
0 голосов
/ 30 марта 2009

Я предварительно загружаю 4 FLV-фильма и скрываю их, когда я переключаю ролик видеоклипа, я хочу, чтобы FLV-видео исчезло и началось воспроизведение. У меня есть этот рабочий код, но я чувствую, что он написан очень плохо.

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]);
}

Вместо этого я хочу что-то вроде этого: Но это не работает, что-то не так с attachVideo (), я думаю.

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('ltp_video-low1.flv');
    this['videobutton'+i].i = i;
    this['videobutton'+i].onRollOver = function() {
        this['stream'+this.i].pause(false);
        this.attachVideo(['stream'+this.i]);
        fadeIn(['video'+this.i]);
    };
    this['videobutton'+i].onRollOut = function() {
        this['stream'+this.i].pause();
        this.attachVideo(['stream'+this.i]);
        fadeOut(['video'+this.i]);
    };
}

Вот весь код:

// Import TweenLite
import gs.*;
import gs.easing.*;

// Creates the fade functions
function fadeIn(video) {
    TweenLite.to(video,0.5,{_alpha:100, ease:Regular.easeOut});
}
function fadeOut(video) {
    TweenLite.to(video,0.5,{_alpha:0, ease:Regular.easeOut});
}

// Parses the Flashvars into arrays
var titles:Array = (_level0.titleVars) ? _level0.titleVars.split(',') : [];
var urls:Array = (_level0.urlVars) ? _level0.urlVars.split(',') : [];

// Sets the mouse action
function SetMouseAction(indexNumber, buttonMC, arrowMC, dynamicTF, linkURL):Void {
    buttonMC.colorText = dynamicTF;
    buttonMC.onRollOver = function() {
        TweenLite.to(arrowMC,0.2,{_x:"2", _alpha:80, ease:Back.easeOut, tint:0x7cb0b7});
        this.colorText.textColor = 0x7cb0b7;
        // Fixes the Flash bug with button over each other
        if (indexNumber == 1 || indexNumber == 2 || indexNumber == 3) {
            stream1.pause(false);
            fadeIn(video1);
        }
        if (indexNumber == 4 || indexNumber == 5 || indexNumber == 6) {
            stream2.pause(false);
            fadeIn(video2);
        }
        if (indexNumber == 7 || indexNumber == 8 || indexNumber == 9) {
            stream3.pause(false);
            fadeIn(video3);
        }
        if (indexNumber == 10 || indexNumber == 11 || indexNumber == 12) {
            stream4.pause(false);
            fadeIn(video4);
        }
    };
    buttonMC.onRollOut = function() {
        TweenLite.to(arrowMC,0.2,{_x:37, _alpha:100, ease:Back.easeOut, tint:0xFFFFFF});
        this.colorText.textColor = 0xffffff;
    };
    buttonMC.onRelease = function() {
        if (linkURL) {
            getURL(linkURL);
        }
    };
}

// Loops trough all the MC
for (var i:Number = 1; i<=12; i++) {
    SetMouseAction(i,this["link"+i],this["arrow"+i],this["text"+i],urls[i-1]);
    this["text"+i].text = titles[i-1];
}





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]);
}



/*
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('ltp_video-low1.flv');
    this['videobutton'+i].i = i;
    this['videobutton'+i].onRollOver = function() {
        this['stream'+this.i].pause(false);
        this.attachVideo(['stream'+this.i]);
        fadeIn(['video'+this.i]);
    };
    this['videobutton'+i].onRollOut = function() {
        this['stream'+this.i].pause();
        this.attachVideo(['stream'+this.i]);
        fadeOut(['video'+this.i]);
    };
}
*/

1 Ответ

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

В исходном коде у вас есть:

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

videoOver(this['videobutton'+i],this['video'+i],this['stream'+i]);

В этом случае attachVideo вызывается для видеообъекта.

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

Во втором фрагменте кода вы делаете это:

this['videobutton'+i].onRollOver = function() {
  this['stream'+this.i].pause(false);
  this.attachVideo(['stream'+this.i]);
  fadeIn(['video'+this.i]);
};

Таким образом, attachVideo вызывается для объекта видеоблоки, а не для видеообъекта.

Кроме того, я не думаю, что ссылка на поток будет работать, так как ваша переменная this будет видеотекстовой кнопкой, которая, насколько я могу судить, не определила это значение (ссылка "this" внутри функции () {} - это не то же самое, что ссылка this за ее пределами).

Я думаю, что вызов fadeIn также может работать неправильно, так как я думаю, что область будет испорчена.


Вот кое-что, что может сработать. Я вообще не проверял, но, надеюсь, вы поймете, что я пытаюсь сделать.

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('ltp_video-low1.flv');
  this['videobutton'+i].i = i;
  setHandlers(i);
}

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

function onVideoButtonRollOut(i:Number):Void {
  this['stream' + i].pause();
  fadeOut(this['video' + i]);
}

function setHandlers(i:Number):Function {
  this['videobutton'+i].scope = this;
  // This essentially fixes the scope issue.  The value of i is retained
  // properly due to the property of closures.
  this['videobutton'+i].onRollOver = function() {
    this.scope.onVideoButtonRollOver.apply(this.scope, [i]);
  }
  this['videobutton'+i].onRollOut = function() {
    this.scope.onVideoButtonRollOut.apply(this.scope, [i]);
  }
}

Хотя я не очень доволен этим. Я думаю, что код, вероятно, должен быть реорганизован таким образом, чтобы у вас был один объект на группу, с такими элементами, как «поток», «соединение» и т. Д. Я думаю, что это сделает вещи намного чище, так как вам не придется постоянно ссылаться к указателю.

...