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

id各ムービークリップ内で変数を定義する必要がありますvideobutton。これらの変数は、 とは異なりi、ボタンごとに異なる値を持ちます。次に、this.ionRollOver 関数内ではもう使用しません。使用します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 に答える
1

ええと、これは役立つかもしれないし、役に立たないかもしれません。Flash AS2 のスコーピングはくだらないし、イベント ドリブンのものもあるから、「i」と「i」は違う。あなたが持っている場所

trace(i) 

trace("i:"+i+" this.ID:"+this.ID) に少し拡張しましたが、常に 5 を取得します。これは、i がループで 1-4 だったにもかかわらず、ループが終了し、"i " はボタンを押した後も 5 のままです (なぜ 4 ではなく 5 なのか少しわかりません...)。このような場合、ID フィールドを movieClips に追加することをお勧めします。

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 に答える