mavrick117
Messages postés6Date d'inscriptionvendredi 19 novembre 2010StatutMembreDernière intervention23 novembre 2010
-
19 nov. 2010 à 03:55
dj_ouf
Messages postés221Date d'inscriptionvendredi 15 avril 2005StatutMembreDernière intervention 6 septembre 2011
-
24 nov. 2010 à 10:19
Bonjour,
Etant complètement novice dans le codage AS3, j’ai donc utilisé le code suivant tirer d’un tutoriel.
//Nbr de flocon à générer
var quantite:uint=3000;
//Taille de la scene
var LargeurScene:uint=stage.stageWidth;
var HauteurScene:uint=stage.stageHeight;
for (var i:uint = 0; i<quantite; i++) {
//création du nouveau flocon
var FloconNouveau:Flocon = new Flocon();
//Propriété nom
FloconNouveau.name='Flocon'+i;
modifierAspect(FloconNouveau,true);
//La fonction onEnterFrame simule le déplacement de la tête de lecture
FloconNouveau.addEventListener(Event.ENTER_FRAME,animation);
}
//Fonction pour modifier l'aspect des flocons
function modifierAspect(FloconActuel:MovieClip,origine:Boolean):void {
//Positionnement sur la scene et dimension
with (FloconActuel) {
x=Math.random()*LargeurScene;
//si true donc début de l'animation le flocon apparait n'importe ou verticalement
if (origine) {
y=Math.random()*HauteurScene;
} else {
//si false en cours d'animation le flocon demarre en haut de l'écran
y=0;
}
/*scaleX scaleY alpha prennent des valeurs de 0 a 1 en AS3 */
scaleX=scaleY=alpha=.1+Math.random()*.8;
}
/*Gestion du déplacement pour chaque flocon
La vitesse est déterminé au hasard*/
FloconActuel.VitesseVerticale=2+Math.random()*5;
//Affiche le flocon sur la scene
addChild(FloconActuel);
}
//fontion pour animer les flocons
function animation(NomParticule:Event):void {
//Recupere le nom du flocon
var FloconActuel:MovieClip=NomParticule.currentTarget as MovieClip;
//trace(FloconActuel.name);
FloconActuel.y+=FloconActuel.VitesseVerticale;
//si nous atteignons le bas de la scene
if (FloconActuel.y>=HauteurScene) {
modifierAspect(FloconActuel,false);
}
}
Le problème que je rencontre survient lorsque le swf (paramétré pour une lecture en boucle) se relance, c’est-à-dire au niveau du départ du second cycle.
Ce problème est un ralentissement considérablement de mon animation donnant l’impression que mes 6 Go de Ram ne suffisent plus à la faire tourner. Mes clips s’affichent à la vitesse approximative de 1/s, de même pour la chute de mes flocons.
Je souhaiterai qu’il n’y ai aucun changement dans la vitesse d’exécution de l’animation après la lecture complète du premier cycle.
mavrick117
Messages postés6Date d'inscriptionvendredi 19 novembre 2010StatutMembreDernière intervention23 novembre 2010 19 nov. 2010 à 04:24
j'ai fait le test avec 1000 flocons
je constate une accélération de toute mon animation mais aussi un phénomène qui pourrait s'apparenter à un additionnement à chaque cycle de 1000 flocons. ce qui me donne le bon rythme à partir du 3e cycle.
dj_ouf
Messages postés221Date d'inscriptionvendredi 15 avril 2005StatutMembreDernière intervention 6 septembre 2011 19 nov. 2010 à 12:38
Salut
Y'a moyen d'optimiser à fond ton anim...
Déjà, que les flocons soient des sprites au lieu de MovieClip. (flash.display.Sprite dans le panel propriété du symbole dans le biblio), si il ne contient pas d'anim bien-sûr. Ça vire tous les fonctions inutiles.
Ensuite cacheAsbitmap = true en propriété lors de sa création dans dans ton code.
Et je vois aussi qu'a chaque fois qu'un flocon sort de la scène, on refait x fois un Math.random(), ce qui est très pompeux. Pourquoi ne pas stocker leurs position d'origine qu'on re-set tout simplement ?
flocon.x = flocon.initX;
...
Et tu es à quel framerate ? (12 fps, 30 fps ?)
ça n'est pas normal que flash rame à ce point au lancement pour quelques flocons de neige...
Ah je vois voir un gros soucis là :
Un addEventListener(Event.ENTER_FRAME,animation) sur chaque objet flocon ???? ne cherche plus c'est ça aussi.
Il en faut un seul sur le stage, et à l'intérieur tu boucle seulement sur le nombre d'enfants sur la scène, ce qui a pour effet de récupérer chaque flocon.
(for var i:uint=0; i<scene.numChildren; i++) {
var flocon:Sprite = scene.getChildAt(i) as Sprite;
}
pegase31
Messages postés6138Date d'inscriptiondimanche 21 décembre 2003StatutModérateurDernière intervention 4 septembre 201312 19 nov. 2010 à 12:51
Moi ce que je peux te conseiller c'est de placer toutes les instances de flocons dans un Vector (cs4 uniquement) et de faire tourner l'enterframe sur le tableau.
Ensuite, tu peux aussi utiliser un bitmap qui prennent moins de place qu'un Sprite niveau gestion de la transparence. (contrairement à l'as2, le bitmap et manipulable directement)
dj_ouf
Messages postés221Date d'inscriptionvendredi 15 avril 2005StatutMembreDernière intervention 6 septembre 2011 19 nov. 2010 à 14:53
Peg' a très bien complété les dernières atuces.. avec tout ça, cela devrait vraiment être fluide!
3000 flocons de 4x4 pixels, c'est vraiment pas le st graal !
Sinon moi sur mon pc, avec ton lien ça tourne déjà pas mal.
mavrick117
Messages postés6Date d'inscriptionvendredi 19 novembre 2010StatutMembreDernière intervention23 novembre 2010 19 nov. 2010 à 14:54
Avant tout merci de passer du temps sur mon projet !!
Alors je pense que tu dois avoir raison de A à Z mais je suis vraiment débutant dans ce domaine... j'ai appris tout seul la mise en scène de calques dans un scénario "whaou!^^" et là tu me propose de modifier un code que j'ai plagié sur un tuto... j'en perds mes cheveux...
J'ai bien sur tenté de modifier le code avec tes propositions et Flash Pro cs5 m'avertit d'une dizaine d'erreur de syntaxe ! Ce qui est normal vu que je ne connais pas ce langage ...
J'ai aussi tenté de convertir les MovieClips en sprites mais en vain ...
Désolé de t'infliger mon manque de connaissance mais tu es mon seul espoir !
dj_ouf
Messages postés221Date d'inscriptionvendredi 15 avril 2005StatutMembreDernière intervention 6 septembre 2011 22 nov. 2010 à 09:24
Tout d'abord, félicitations pour la mise en scène de calques
Alors pour les MovieClip à transformer en calques, va dans la bibliothèque, tu clique droit sur le symbole incriminé (Flocon) -> propriétés -> et là tu as un chap classe de base qui est à "flash.display.MovieClip", et tu changes en "flash.display.Sprite".
dj_ouf
Messages postés221Date d'inscriptionvendredi 15 avril 2005StatutMembreDernière intervention 6 septembre 2011 24 nov. 2010 à 10:19
Salut,
Alors pour le initX, c'est ça. L'astuce est simplement de stocker avant sa valeur en X de départ, pour éviter d'exécuter des Math.random() très souvent.
Ne pas oublier de définir initX par contre :
flocon.initX = flocon.x
(pendant la création des flocons).
Pour parser le liste des flocons sur la scène, tu avais ceci :
Il faut désormais le faire sur le stage, pour qu'on ai qu'une unique boucle enterFrame. Et la boucle permet de récupérer tous les flocons, à placer dans l'écouteur animation.
En enfin :
flocon.cacheAsbitmap = true
C'est une propriété de flocon (movieClip ou sprite, pour simplement en faire une "rasterisation", c-a-d transformer en bitmap pour gagner en perf.