2009-03-30 6 views
1

Ich kann diese For-Schleife mit onRollOver nicht funktionieren.For Schleife mit onRollOver Problem

Es denkt, es hat mit variablen Bereich und das i zu tun, aber ich weiß nicht, wie es zu beheben ist.

Die Spur gibt mir: 5

Irgendwelche Ideen?

Hier ist die Quelldatei: http://drop.io/gqdcyp3

aktualisieren
ich es gelöst mich, aber ich glaube nicht, dass es die optimale Lösung:

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

Wie auch immer, das funktioniert. Aber es wäre toll, wenn mir jemand eine Lösung daraus erstellen könnte, da es funktioniert. Wie kann ich die Funktionen in der Schleife haben?

Antwort

1

Sie müssen eine Variable definieren, sagen wir id in jedem Ihrer videobutton MovieClips. Diese Variablen haben im Gegensatz zu i unterschiedliche Werte für jede Schaltfläche. Dann verwenden Sie this.i nicht mehr innerhalb Ihrer onRollOver Funktionen, verwenden Sie this.id.

Auch, weil der onRollOver auf jedem Videobutton läuft, this innerhalb der Funktion zeigt auf den Videobutton, nicht auf die Bühne.

Der neue Code wird sein:

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

Es Zahlen von 1 bis 5 Spuren, je nachdem, was Taste, die Sie über auf rollen. Es sollte auch mit den Videos funktionieren, wenn sonst nichts mit dem Rest deines Codes verkehrt ist.

+0

Es hat nicht funktioniert, wie die anderen. Die Ablaufverfolgung gibt die richtige Zahl aus, aber nichts passiert. Können Sie die Fla herunterladen und einen Blick darauf werfen? –

+0

Nun, dann ist Ihr Problem gelöst und so ist diese Frage. Die for-Schleife funktioniert. Sie sollten diese Frage schließen und eine andere, vielleicht .. – evilpenguin

+0

Der erste andere Fehler, den ich sehen kann, ist, dass Ihre Streams nicht in Ihren Videobuttons sind, aber auf der Bühne, so sollten Sie AttachVideo ersetzen (dies ['stream' + this.id ]) mit attachVideo (['stream' + this.id]) – evilpenguin

1

Ich habe noch nie etwas mit Flash gemacht, aber es sieht so aus, als ob die Variable iclosed over ist. Der Code innerhalb des Rollover-Handlers wird nur beim Rollover ausgeführt, und i wird zu diesem Zeitpunkt ausgewertet. nicht zu dem Zeitpunkt, zu dem die Funktion definiert ist.

Durch die Handler-Funktion innerhalb einer anderen Funktion zu schaffen, sollte jeder Handler seine bekommt eigene 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]); 
     }; 
} 

Sie werden wahrscheinlich für Actionscript-Syntax anpassen müssen aber die allgemeine Idee soll Ton der Funktionsparameter unter der Annahme, sein sind nach Wert übergeben. Jeder Aufruf von MakeRollOverHandler erstellt eine eindeutige i.

Ich bemerke aus den ActionScript-Dokumenten, dass onRollOver keine Informationen darüber gibt, welche Schaltfläche das Ereignis ausgelöst hat. Es ist eine Schande, wenn Sie diese Information verwenden könnten, wählen Sie die entsprechenden Felder aus.

+0

Hat nicht funktioniert. Trace (i) gebe die korrekte Zahl zurück, aber trace (das ['stream' + i]); gibt nur undefined zurück. –

+0

Irgendwelche Ideen? Ich habe die Quelldatei hinzugefügt, wenn Sie einen Blick darauf werfen möchten;) –

1

Ähm, das kann oder kann nicht helfen. Flash AS2 hat beschissenes Scheiß-Scoping und auch mit ereignisgesteuertem Zeug, was "ich" war, wird anders sein als das, was "ich" ist. Wo haben Sie

trace(i) 

obwohl ich es ein wenig erweitert zu verfolgen ("i:" + i +“this.ID:"+this.ID) Sie immer 5 bekommen, denn obwohl ich war 1-4 durch die Schleife ist die Schleife beendet und "i" bleibt 5, nachdem Sie einen Knopf gedrückt haben (ich bin ein bisschen unsicher, warum es 5 und nicht 4 ... ist). Ich habe es empfohlen, in solchen Fällen ein ID-Feld zu MovieClips hinzuzufügen.

ID wird mit dem Token-Accessor zugegriffen (ich glaube, das ist, was es heißt), da es keine native Eigenschaft der Movieclip-Klasse ist (ich nehme an „videobutton“ wird aus einem 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"]]); 
    } 
} 

Ich hoffe, das funktioniert .... wenn nicht, weiter schreiben!

+0

Es hat nicht funktioniert. Hier ist, was die Spur gab mir: i: 5 dies ['ID']: 1 i: 5 dies ['ID']: 2 i: 5 dies ['ID']: 3 i: 5 dies ['ID ']: 4 –

+0

Irgendwelche Ideen? Ich habe die Quelldatei hinzugefügt, wenn Sie einen Blick darauf werfen möchten;) –