2009-03-30 13 views
1

このForループをonRollOverで動作させることはできません。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]); 
} 

いずれにせよ、これは動作します。しかし、誰かが私にこれから作成された解決策を与えることができればそれはうまくいくでしょう。どのようにしてループ内に関数を持たせることができますか?

答えて

1

変数を定義する必要があります。videobuttonのmovieClipsにはそれぞれidとします。これらの変数は、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までの数字をトレースします。あなたのコードの残りの部分に何も間違っていなければ、ビデオでも動作するはずです。

+0

それは他のように、うまくいきませんでした。トレースは正しい番号を出力しますが、何も起こりません。 FLAをダウンロードして見てもらえますか? –

+0

さて、あなたの問題は解決されているので、この質問もあります。 forループは機能します。 – evilpenguin

+0

私が見ることができる最初の他の間違いはあなたのストリームはあなたのビデオボタンではなく、ステージ上にあることです、あなたはattachVideo(this ['stream' + this.id ])with attachVideo(['stream' + this.id]) – evilpenguin

1

以前はFlashで何もしていませんでしたが、変数iclosed 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はイベントをトリガしたボタンに関する情報を提供していないことに気付きました。それはあなたがその情報を使用することができれば適切なフィールドのセットを選択することができたので残念です。

+0

動作しませんでした。 trace(i)正しい番号を返しますが、trace(this ['stream' + i]);ただundefinedを返します。 –

+0

アイデア?私が見たい場合は、ソースファイルを追加しました;) –

1

ええと、これは役に立つかもしれません。 Flash AS2はすごく賢明なスコープを持っていますし、イベント駆動型のものもありますが、「私」は「私」とは異なるでしょう。私は( "I:" + I +」this.ID:"+this.ID)をトレースし、それを少し延長したが、あなたは

trace(i) 

を持っている場合は、あなたが常に5を取得します 、私は1-4だったがためループを終了すると、ループが終了し、ボタンを押した後に「i」が5のままになります(私はなぜそれが5で4ではないのか分かりません)。この種のケースでは、ムービークリップにIDフィールドを追加することをお勧めします。

IDは、トークンアクセサ(私はそれはそれはと呼ばれるものだと思う)、それはMovieClipクラスのネイティブプロパティ(私は「videobutton」を推測しているムービークリップから作られる)

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"]]); 
    } 
} 
ないようにアクセスされ、

私はこれがうまくいきたいと思っています。もしそうでなければ、投稿してください!

+0

それは動作しませんでした。トレースは私に与えられたものです:i:5 this ['ID']:1 i:5 this ['ID']:2 i:5 this ['ID']:3 i:5 this ['ID ']:4 –

+0

アイデア?あなたが見たい場合は、私はソースファイルを追加しました;) –