Problème classe Tween

carton99 Messages postés 103 Date d'inscription vendredi 29 janvier 2010 Statut Membre Dernière intervention 18 mars 2012 - 30 nov. 2010 à 11:52
carton99 Messages postés 103 Date d'inscription vendredi 29 janvier 2010 Statut Membre Dernière intervention 18 mars 2012 - 30 nov. 2010 à 13:31
Bonjour,
la classe Tween est très utile ,mais présente quelques bugs.

Je crée à la volé des "Tween" (effet 3d) , il y a généralement 1 raté sur 1000. Ce qui exclut totalement l'utilisation de cette classe dans un projet professionel.

De plus l'utilisation de gc() , détruis instentanément les "Tween" crée à la volé.

Y'a t'il une solution pour résoudre ces problèmes ?
Je cherche une solution de niveau professionel ,avec une gestion de la mémoire réaliste .

Merci

6 réponses

pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
30 nov. 2010 à 12:03
Bonjour, la gestion des tweens est parfaitement fonctionnelle et je n'ai jamais eut de soucis avec leurs utilisations.
Je pense que le problème vient de ton code qui n'est pas fait de façon correct.

La preuve en est que le passage du Garbage Collector les détruit en les considérant comme non définie correctement....

Donc la solution est de faire un code professionnel pour avoir réellement un projet professionnel.

Peg'
0
carton99 Messages postés 103 Date d'inscription vendredi 29 janvier 2010 Statut Membre Dernière intervention 18 mars 2012
30 nov. 2010 à 12:24
Mouai ,
reprenons je crée un "Tween" à la volé dans une fonction.
La question est pourquoi après être sortit de cette fonction la Tween continue .
Elle devrais être instentanément déréférencé, on est dans un comportement hazardeux.

Car à partir de la , comment je fait pour réduire la pile qui contient tous les objets qui référence mon objet à 0.
Si je met tous mes conteneur à "null" je l'enlève du conteneur graphique et je suprime les "event", il restera toujours cette Tween qui se ballade quelque par.

Ensuite ,la classe Tween n'est pas très véloce , test très simple tu applique deux Tween sur le même objet sur le même atribut sur deux frames diférents.
Et la tu vera que quelque fois Tween se bloque.

Alors oui ,je pourais , classer toutes mes Tween dans un tableau ,et les gérer corectemrent afin de suprimer la première Tween si elle n'est pas finit.
Mais avant de faire sa , j'aimerais vérifier si il n'exite pas un moyen moin lourd ,en terme de performance (utilisation d'un extend MovieClip avec enterFrame + parcourt d'un Array )

Merci
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
30 nov. 2010 à 12:38
il faut que tu définisses tes tweens en dehors de ta fonction pour les instancier, c'est une erreur classique de débutant qui se retrouve régulièrement.

function toto () {
var tween:Tween = ...
}

Ton Tween continueras même après la fonction car c'est un processus global (tout comme les setInterval ou les setTimeout), mais "tween" n'existera plus physiquement parlant.

Peg'
0
carton99 Messages postés 103 Date d'inscription vendredi 29 janvier 2010 Statut Membre Dernière intervention 18 mars 2012
30 nov. 2010 à 12:59
Oui malheuresement ,
du coup la classe est moin intérésente.

pour finir je te propose la demo :
package 
{
import flash.display.Sprite;
import flash.display.Shape;
import fl.transitions.Tween;
import fl.motion.easing.Elastic;
import flash.events.MouseEvent;
public class testTween extends Sprite
{
private var sh:Shape;
public function testTween()
{
stage.addEventListener(MouseEvent.MOUSE_MOVE, MOVE);
for( var i:Number = 0 ; i<100 ; i++){
sh = mkRect();
var r = Math.random();
var myTween1:Tween = new Tween(sh, "x", Elastic.easeOut, 0, Math.cos(r)*300, 100);
var myTween2:Tween = new Tween(sh, "y", Elastic.easeOut, 0, Math.sin(r)*300, 100);
var myTween3:Tween = new Tween(sh, "rotationY", Elastic.easeOut, 0, 360, 200);
}
}
public function mkRect():Shape
{
var child:Shape = new Shape();
           	        child.graphics.beginFill(0xFFCC00);
  	child.graphics.drawRect(0, 0, 20, 20);
                        addChild(child);
return child;
}
public function MOVE(e:MouseEvent):void
{
for( var i:Number = 0 ; i<numChildren ; i++){
sh = Shape(getChildAt(i));
var r = Math.random();
var myTween1:Tween = new Tween(sh, "x", Elastic.easeOut, 0, Math.cos(r)*300, 100);
var myTween2:Tween = new Tween(sh, "y", Elastic.easeOut, 0, Math.sin(r)*300, 100);
var myTween3:Tween = new Tween(sh, "rotationY", Elastic.easeOut, 0, 360, 200);
}
}
}
}

je tinvite à compilé ce code.
Le code ne présente aucun intéret à par faire apparaitre le bug.
Tu vera que quelquefois ,les Tween se bloque completement .
0

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

Posez votre question
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
30 nov. 2010 à 13:06
normal : tu définis les tweens dans ta fonction ...
Pourquoi ne crées-tu pas de classes contenant tes tweens ?

Ensuite tu démultiplies les tweens sans grande raisons alors qu'une seule suffirait pour tout faire :

var tween:Tween;
var prop:Object = {tween:0};
tween = new Tween(prop, "tween", Regular.easeIn, 0, 1, 100);
tween.addeventListener(TweenEvent.MOTION_CHANGE, tweenHandler);

function tweenHandler(evt:TweenEvent):void {
sh.x = prop.tween*Math.cos(r)*300;
sh.y = prop.tween*Math.sin(r)*300;
}

peg'
0
carton99 Messages postés 103 Date d'inscription vendredi 29 janvier 2010 Statut Membre Dernière intervention 18 mars 2012
30 nov. 2010 à 13:31
Exact ,
"MOTION_CHANGE" à l'air très la meilleur solution .


J'essairais sa plus tard.

Merci ,pour l'aide.
0
Rejoignez-nous