OnEnterFrame AS2

ninodroc Messages postés 3 Date d'inscription lundi 24 novembre 2008 Statut Membre Dernière intervention 23 avril 2010 - 21 avril 2010 à 16:37
mosani Messages postés 1 Date d'inscription mercredi 4 mai 2011 Statut Membre Dernière intervention 20 mai 2011 - 20 mai 2011 à 15:30
Bonjour !
je débute en ... tout (Je fais un peu de html, php, mysql et maintenant flash AS2 et 3).
J'essaie d'animer des clips en AS2, sans utiliser les outils de dessin, ni la Timeline de flash CS3.
je suis arrivé à créer mes clips de champs texte, avec createEmptyMovieClip et createTextField depuis un fichier XML simple (4 nodes).
Et j'utilise onEnterFrame pour animer mes clips ( les formules mathématiques ne sont pas très académiques).
Le problème est le suivant :
j'obtiens un seul mouvement pour tout les clips et non pas un mouvement différent par clips.
Pouvez-vous m'aider à les animer indépendamment ?
Merci, voici mon code :
//chargement du xml
function load_xml(path:String, type:String) {
var xml:XML = new XML();
xml.ignoreWhite = true;
xml.onLoad = function() {
var nodes = this.firstChild.childNodes;
numOfItems = nodes.length;
//création du nuage
nuage(nodes);
};
xml.load("xml/"+path);
}

function nuage(nodes) {
cx = 100;
cy = 50;
monClip._x = cx;
monClip._y = cy;
monFormat = new TextFormat();
monFormat.size = 15;
monFormat.font = "maPoliceDeLettre";
monFormat.color = "0xCC3300";
monFormat.align = "center";

_root.createEmptyMovieClip("monClip",this.getNextHighestDepth());
for (var i = 0; i<numOfItems; i++) {
var texte = monClip.createEmptyMovieClip("texte"+i, i+1);
texte.angle = i*((Math.PI*2)/(1*numOfItems));
texte._x = Math.cos(texte.angle)*90+cx;
texte.createTextField("champDeTexte",this.getNextHighestDepth(),0,00,200,200);
texte.champDeTexte.border = false;
texte.champDeTexte.selectable = false;
texte.champDeTexte.embedFonts = true;
texte.champDeTexte.text = nodes[i].attributes.tag;
texte.champDeTexte.setTextFormat(monFormat);

}
var anglex = 0;
var angley = 0;
this.onEnterFrame = function() {
anglex += i/25;
angley += i/35;
this.swapDepths(Math.round(this._xscale)+100);
this._x = 70+50*Math.cos(anglex/numOfItems);
this._y = 20+30*Math.sin(angley/numOfItems);
var s:Number = (this._y)/(cy+1);
//trace(s);
this._xscale = this._yscale=s*100;
};
}
load_xml("2mei.xml");

et mon xml :




5 réponses

dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
23 avril 2010 à 10:18
HEllo,

Bienvenue dans le monde de flash alors

En zieutant ton code, voilà ce que je pense qui faudrait modifier :

var texte = monClip.createEmptyMovieClip("texte"+i, i+1);
Là, tu créer tes différents champs de texte dans le même conteneur "monClip".

this.onEnterFrame = function() {
A ce niveau là, tu fais la boucle onEnterFrame sur this, qui contient donc "monClip", le mouvement sera effectif sur toute ta scène. Car c'est le conteneur global.

Si tu veux faire un mouvement différent pour chacun de tes clips, il faut affecter une boule onEnterFrame sur chacun de tes clips crées.

Ensuite, dans ta boucle onEnterFrame, tu réutilises la variable "i". Or cette variable aura pour unique valeur la dernière affection de la boucle (ici, numOfItems), car la boucle est terminée. Donc là je l'ai affecté à texte.i, pour qu'elle soit différente pour chaque instance de "texte".
Idem pour anglex et angley, à moins bien sûr que tu veuille qu'il soient tous synchronisés.

Voilà un exemple :
_root.createEmptyMovieClip("monClip",this.getNextHighestDepth());
for (var i = 0; i<numOfItems; i++) {
var texte = monClip.createEmptyMovieClip("texte"+i, i+1);
texte.angle = i*((Math.PI*2)/(1*numOfItems));
texte._x = Math.cos(texte.angle)*90+cx;
texte.createTextField("champDeTexte",this.getNextHighestDepth(),0,00,200,200);
texte.champDeTexte.border = false;
texte.champDeTexte.selectable = false;
//texte.champDeTexte.embedFonts = true;
texte.champDeTexte.text = nodes[i].attributes.tag;
texte.champDeTexte.setTextFormat(monFormat);
texte.anglex = 0;
texte.angley = 0;
texte.i = i;

texte.onEnterFrame = function() {
this.anglex += this.i/25;
this.angley += this.i/35;
this.swapDepths(Math.round(this._xscale)+100);
this._x = 70+50*Math.cos(this.anglex/numOfItems);
this._y = 20+30*Math.sin(this.angley/numOfItems);
var s:Number = (this._y)/(cy+1);
this._xscale = this._yscale=s*100;
};

}


J'ai testé, ça fonctionne, maintenant à toi d'ajuster pour avoir ce que tu recherches
0
ninodroc Messages postés 3 Date d'inscription lundi 24 novembre 2008 Statut Membre Dernière intervention 23 avril 2010
23 avril 2010 à 14:12
Bravo et merci !
C'est encore mieux que mes dernières modifications !
L'animation est très fluide, contrairement à toute mes bidouilles.
C'EST TROP FORT !
0
dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
23 avril 2010 à 15:57
Content que ça t'ai dépanné
C'est plus fluide tu dis ? ça me semble bizarre ça..
Tu as laissé commentée cette ligne : //texte.champDeTexte.embedFonts = true;
0
ninodroc Messages postés 3 Date d'inscription lundi 24 novembre 2008 Statut Membre Dernière intervention 23 avril 2010
23 avril 2010 à 16:12
Non, j'avais créer une nouvelle boucle for sur onEnterFrame de ce style :
var angley = 0;
var a:Number = 0;
monClip["texte"+a].onEnterFrame = function() {

anglex += i/100;
angley += i/100;
this.swapDepths(Math.round(this._xscale)+100);
monClip["texte"+a]._x = (80)+(15*a)*Math.cos(a/10*anglex/numOfItems);
monClip["texte"+a]._y = (5*a)+(6*a)*Math.sin(a/2*angley/numOfItems);
a++;
if (a>=numOfItems) {
a = 0;
}
var s:Number = ((monClip["texte"+a]._y))/(20);
//trace(s);
monClip["texte"+a]._xscale = monClip["texte"+a]._yscale=s*100;
};

C'était le mieux que j'ai pu faire pour les animer séparément.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mosani Messages postés 1 Date d'inscription mercredi 4 mai 2011 Statut Membre Dernière intervention 20 mai 2011
20 mai 2011 à 15:30
pouet
0
Rejoignez-nous