Problème d'arguments de fonction et de boucle en AS3

Résolu
Signaler
Messages postés
48
Date d'inscription
mercredi 29 avril 2009
Statut
Membre
Dernière intervention
1 novembre 2011
-
Messages postés
48
Date d'inscription
mercredi 29 avril 2009
Statut
Membre
Dernière intervention
1 novembre 2011
-
Bonsoir à tous!
Voilà plusieurs jours que je me creuse la tête sur ce petit problème... Peut-être quelqu'un pourra-t-il m'aider?

Voici mon code:
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFieldAutoSize;
import fl.transitions.Tween;
import fl.transitions.easing.*;

var list:Array=["A","B","C","D","E","F","G","H","I","J","K","L","M"];
var txt:Array=[];

for (var i:uint = 0; i<list.length; i++) {
var rX:Number=Math.random()*stage.stageWidth/1.2;
var rY:Number=Math.random()*stage.stageHeight/1.2;
 
txt[i]=creationmots(Math.round(Math.random()*72),list[i]);
addChild(txt[i]);
 
//Position initiale du champ de texte
txt[i].x=Math.random()*stage.stageWidth;
txt[i].y=Math.random()*stage.stageHeight;
 
//Propriétés de la fonction movemt
var tmps:Number=Math.random()*6;
movemt(txt[i], tmps, rX, rY);

//Propriétés de la fonction transp
var transpa:Number=(Math.floor(Math.random()*100))/100;
var transpa2:Number=(Math.floor(Math.random()*100))/400;
transp(txt[i],tmps,transpa,transpa2);


}

function creationmots(taille:uint, mot:String):TextField {
//Champ de texte
var montexte:TextField = new TextField();
montexte.autoSize=TextFieldAutoSize.LEFT;
montexte.selectable=false;



//Mise en forme du texte
var format:TextFormat=new TextFormat();
format.font="Arial";
format.size=taille;
format.color=0xFF33CC;



montexte.defaultTextFormat=format;
//Contenu du champ de texte en fonction du contenu du tableau list
montexte.text=mot;
montexte.blendMode=BlendMode.LAYER;
//montexte.alpha=alea;
return montexte;
}


//Mouvement des champs de texte
function movemt(target:TextField, duree:Number, posx:uint, posy:uint):void {
new Tween(target,"x",Elastic.easeOut,target.x,posx,duree,true);
new Tween(target,"y",Elastic.easeOut,target.y,posy,duree,true);
}

//transparence des champs de texte
function transp(target1:TextField, duree:Number, tralu:Number, tralu2:Number):void{
new Tween (target1,"alpha",Strong.easeIn,tralu2,tralu,duree,true);
}


Mon problème c'est que maintenant je voudrais ajouter un écouteur d'événement sur la scène (jusque là, pas de problème), et quand on clique, ça relance ma fonction movemt et ma fonction transp, donc les lettres se remettent à bouger. J'ai tout essayé, je ne vois pas comment mettre mon e:MouseEvent dans mes deux fonctions, et si je crée une fonction qui englobe ces deux fonctions, évidemment mes paramètres, définis dans la boucle ne sont plus reconnus...
Et si je mets mes variables en dehors de la boucle, j'ai toujours un problème pour appliquer mes tweens aux txt[i]... :(

Je ne sais plus quoi faire!

Quelqu'un a-t-il une idée?

J'espère avoir été claire...
Merci de votre aide ;)

M'zelle Flash

8 réponses

Messages postés
6146
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
10
var tableau:Array = new Array();
var monObject:Object = {variable1:128, variable2:"toto"}
tableau.push(monObject);
trace(tableau[0].variable1); //128
trace(tableau[0].variable2); //toto

voilà, rien de plus simple.
Bonne année 2010

Peg'
Messages postés
6146
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
10
Bonjour,

il suffit de stocker les données de chaque lettre dans un objet que tu placeras dans un nouveau tableau, puis d'exécuter tes deux fonction avec ces propriétés.

Peg'
Messages postés
48
Date d'inscription
mercredi 29 avril 2009
Statut
Membre
Dernière intervention
1 novembre 2011

Merci de ta réponse Pégase.
J'ai bien pensé à créer des objets avec mes lettres mais je ne sais pas trop comment m'y prendre... (c'est ce qui arrive quand on délaisse l'AS3 pendant un moment...)

Est-ce que tu pourrais illustrer ta solution avec un petit bout de code?

ça serait vraiment gentil...

Merci encore pour ta réponse.

M'zelle Flash
Messages postés
6146
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
10
un objet contient des variables, donc place tes variables dans un objet que tu place lui-même dans un array ou un Vector.<Object>.

C'est basique.

Peg'
Messages postés
48
Date d'inscription
mercredi 29 avril 2009
Statut
Membre
Dernière intervention
1 novembre 2011

Euh...
Je n'ai jamais utilisé de classe Object encore (chacun ses méthodes), et j'avoue que je patauge complètement.
J'ai tourné en rond sur Flash toute la nuit, rien à faire. Il y a toujours des erreurs de sortie.
Vraiment, un petit bout de code serait le bienvenu pour illustrer (même s'il n'a pas de rapport direct avec mon problème, c'est juste pour comprendre le principe), parce que celui de la doc Adobe est trop complexe pour moi... Désolée.

Et merci encore de ton aide Peg'

M'zelle flash
Messages postés
48
Date d'inscription
mercredi 29 avril 2009
Statut
Membre
Dernière intervention
1 novembre 2011

Euh... J'avais demandé la science infuse en AS3 comme cadeau de Noël, mais apparemment ma commande s'est égarée en route...

Voilà ce que j'ai refait:
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFieldAutoSize;
import fl.transitions.Tween;
import fl.transitions.easing.*;


addEventListener(Event.ENTER_FRAME, movemt);
addEventListener(Event.ENTER_FRAME, transp);

var list:Array=["A","B","C","D","E","F","G","H","I","J","K","L","M"];
var txt:Array=[];
var posx:Number=Math.random()*stage.stageWidth/1.2;
var posy:Number=Math.random()*stage.stageHeight/1.2;
var duree:Number=Math.random()*6;
var transpa:Number=(Math.floor(Math.random()*100))/100;
var transpa2:Number=(Math.floor(Math.random()*100))/400;

for (var i:uint = 0; i<list.length; i++) {

 
txt[i]=creationmots(12+Math.round(Math.random()*60),list[i]);
addChild(txt[i]);

 
//Position initiale du champ de texte
txt[i].x=Math.random()*stage.stageWidth;
txt[i].y=Math.random()*stage.stageHeight;



var target:Array= new Array();
var contenu:Object={cible:txt[i]};
target.push(contenu);

}



function creationmots(taille:uint, mot:String):TextField {
//Champ de texte
var montexte:TextField = new TextField();
montexte.autoSize=TextFieldAutoSize.LEFT;
montexte.selectable=false;



//Mise en forme du texte
var format:TextFormat=new TextFormat();
format.font="Arial";
format.size=taille;
format.color=0xFF33CC;



montexte.defaultTextFormat=format;
//Contenu du champ de texte en fonction du contenu du tableau list
montexte.text=mot;
montexte.blendMode=BlendMode.LAYER;
//montexte.alpha=alea;
return montexte;
}




for (var k:uint=0; k<target.length; k++){
//trace(target[k].cible);

//Mouvement des champs de texte
function movemt(e:Event):void {
new Tween(target[k].cible,"x",Elastic.easeOut,target[k].cible.x,posx,duree,true);
new Tween(target[k].cible,"y",Elastic.easeOut,target[k].cible.y,posy,duree,true);
}

//transparence des champs de texte
function transp(e:Event):void{
new Tween (target[k].cible,"alpha",Strong.easeIn,transpa2,transpa,duree,true);
}
}


Mais ça ne marche toujours pas... c'est vraiment le fait d'appliquer le Tween aux champs de texte txt[i] qui me pose problème...

Bonne Année à toi aussi.
Et merci encore Peg' !

M'zelle Flash
Messages postés
48
Date d'inscription
mercredi 29 avril 2009
Statut
Membre
Dernière intervention
1 novembre 2011

Ce que je ne comprends pas, c'est que quand je fais un
 trace(contenu.cible)
(contenu étant mon Object et cible ma variable avec mes txt[i])en sortie, j'ai bien [object TextField] qui apparait 13 fois de suite; mais quand je fais
trace (target.length);
Il me dit que la longueur du tableau est de 1, donc il n'a pas stocké mes différents txt[i] ???

Je l'avoue, là, je suis perplexe...

M'zelle Flash
Messages postés
48
Date d'inscription
mercredi 29 avril 2009
Statut
Membre
Dernière intervention
1 novembre 2011

C'est bon! J'ai trouvé!
Il suffisait que je remette une boucle dans ma fonction.
Rien de plus simple, en effet

En tout cas, merci encore pour ton coup de pouce Peg'. Tout marche comme je veux maintenant.

M'zelle Flash