2009-03-30 11 views
1

Je ne peux pas obtenir cette boucle For avec onRollOver pour fonctionner. Il pense que cela a à voir avec la portée variable et le i, mais je ne sais pas comment le réparer.Pour boucle avec problème onRollOver

La trace me donne: 5

Des idées?

Voici le fichier source: http://drop.io/gqdcyp3

Mise à jour
Je l'ai résolu moi-même, mais je ne pense pas que c'est la solution optimale:

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

Quoiqu'il en soit, cela fonctionne. Mais ce serait génial si quelqu'un pouvait me donner une solution créée à partir de cela, car cela fonctionne. Comment puis-je avoir les fonctions dans la boucle?

Répondre

1

Vous devez définir une variable, disons id dans chacun de vos MovieClips videobutton. Ces variables, contrairement à i, auront des valeurs différentes pour chaque bouton. Ensuite, vous n'utilisez plus this.i dans vos fonctions onRollOver, vous utilisez this.id.

De plus, étant donné que l'onRollOver est exécuté sur chaque bouton vidéo, this à l'intérieur des points de fonction vers le bouton vidéo, pas vers la scène.

Le nouveau code sera:

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

Il trace des nombres de 1 à 5, en fonction de ce bouton rouler sur. Il devrait aussi fonctionner avec les vidéos, s'il n'y a rien d'autre qui ne va pas avec le reste de votre code.

+0

Cela n'a pas fonctionné, comme les autres. La trace produit le bon nombre, mais rien ne se passe. Pouvez-vous télécharger le fichier et jeter un coup d'oeil? –

+0

Eh bien, alors votre problème est résolu et ainsi est cette question. La boucle for fonctionne. Vous devriez fermer cette question et en poster une autre, peut-être .. – evilpenguin

+0

La première autre erreur que je peux voir est que vos flux ne sont pas dans vos boutons vidéo, mais sur scène, donc vous devriez remplacer attachVideo (this ['stream' + this.id ]) avec attachVideo (['stream' + this.id]) – evilpenguin

1

Je n'ai jamais rien fait avec Flash auparavant, mais il semble que la variable i soit closed over. Le code à l'intérieur du gestionnaire de survol est uniquement exécuté lors du survol et i est évalué à ce moment-là; pas au moment où la fonction est définie.

En créant la fonction de gestionnaire dans une autre fonction, chaque gestionnaire doit obtenir son propre 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]); 
     }; 
} 

Vous aurez probablement à régler pour la syntaxe d'ActionScript, mais devrait assumerons son l'idée générale, les paramètres de la fonction sont passé par valeur. Chaque invocation de MakeRollOverHandler va créer un i distinct. Je remarque à partir des documents ActionScript que onRollOver ne fournit aucune information sur le bouton qui a déclenché l'événement. C'est dommage car si c'était le cas, vous pouviez utiliser cette information pour sélectionner l'ensemble de champs approprié.

+0

Ne fonctionne pas. trace (i) renvoie le nombre correct, mais trace (this ['flux' + i]); retourne juste undefined. –

+0

Des idées? J'ai ajouté le fichier source, si vous voulez jeter un oeil;) –

1

Um, cela peut ou ne peut pas aider. Flash AS2 a une portée de merde merdique, et aussi avec des trucs axés sur les événements, ce que "je" était différent de ce que "je" est. Où avez-vous

trace(i) 

bien que je tendis un peu de trace ("i:" + i + » this.ID:"+this.ID) vous obtiendrez toujours 5, parce que même si j'étais 1-4 à travers la boucle, la boucle est terminée et "i" reste 5 après avoir appuyé sur un bouton (je ne sais pas très bien pourquoi c'est 5 et non 4 ...). J'ai trouvé une bonne pratique d'ajouter un champ ID à MovieClips dans ce genre de cas.

ID est accessible avec l'accesseur jeton (je pense que ce qu'il appelle) car il est pas une propriété native de la classe MovieClip (je devine « videobutton » est fait d'un 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"]]); 
    } 
} 

J'espère que cela fonctionne ... sinon, continuez à poster!

+0

Cela n'a pas fonctionné. Voici ce que la trace m'a donné: i: 5 this ['ID']: 1 i: 5 ce ['ID']: 2 i: 5 ce ['ID']: 3 i: 5 this ['ID ']: 4 –

+0

Des idées? J'ai ajouté le fichier source, si vous voulez jeter un oeil;) –