1

我无法使用 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]);
}

无论如何,这行得通。但是,如果有人可以给我一个由此创建的解决方案,那就太好了,因为它有效。我怎样才能在循环中拥有这些功能?

4

3 回答 3

1

我以前没有对 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 没有提供有关触发事件的按钮的任何信息。很遗憾,因为如果这样做,您可以使用该信息选择适当的字段集。

于 2009-03-30T09:27:32.730 回答
1

嗯,这可能有帮助,也可能没有帮助。Flash AS2 的作用域非常糟糕,而且还有事件驱动的东西,“i”与“i”不同。你在哪里

trace(i) 

尽管我将其扩展为 trace("i:"+i+" this.ID:"+this.ID) 你总是会得到 5,因为虽然 i 在循环中是 1-4,但循环已经完成并且“i " 按下按钮后仍为 5(我有点不确定为什么它是 5 而不是 4...)。我发现在这种情况下向movieClips 添加一个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"]]);
    }
}

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

于 2009-03-30T10:04:37.353 回答
1

您需要定义一个变量,比如说id在您的每个videobuttonmovieClip 中。与 不同,这些变量i对每个按钮都有不同的值。然后,您this.i不再在 onRollOver 函数中使用,而是使用this.id.

另外,因为 onRollOver 是在每个 videobutton 上运行的,this所以函数内部指向的是 videobutton,而不是舞台。

新代码将是:

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 的数字。如果您的其余代码没有其他问题,它也应该与视频一起使用。

于 2009-03-30T11:56:10.097 回答