对于onRollOver问题的循环

时间:2009-03-30 08:57:12

标签: flash actionscript actionscript-2 for-loop

我无法使用onRollOver来实现这个For循环。

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 个答案:

答案 0 :(得分:1)

之前我没有对Flash做过任何事情,但看起来变量i正在closed over。翻转处理程序内的代码仅在翻转时执行,此时评估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没有提供有关触发事件的按钮的任何信息。这是一种耻辱,因为如果它确实你可以使用该信息选择适当的字段集。

答案 1 :(得分:1)

嗯,这可能会有所帮助,也可能没有帮助。 Flash AS2有糟糕的糟糕范围,并且还有事件驱动的东西,“我”将与“我”不同。你在哪里

trace(i) 

虽然我把它扩展了一点(“i:”+ i +“this.ID:”+ thishisID) 你将永远得到5,因为虽然我是1-4循环,循环已经完成,按下按钮后“i”仍为5(我有点不确定为什么它是5而不是4 ...)。我发现在这种情况下向movieClip添加ID字段是一种很好的做法。

使用令牌访问器访问ID(我认为这就是所谓的),因为它不是MovieClip类的本机属性(我猜测“videobutton”是由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"]]);
    }
}

我希望这有效......如果没有,请继续发帖!

答案 2 :(得分:1)

你需要在每个id movieClip中定义一个变量,比如说videobutton。与i不同,这些变量对每个按钮都有不同的值。然后,您不再在onRollOver函数中使用this.i,而是使用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之间的数字。如果其他代码没有其他任何问题,它也应该与视频一起使用。