DisplayObject.width peut être sournois !
Par Cédric Tabin le jeudi 27.03.2008, 08:00 - ActionScript - Lien permanent
Qui n'a jamais joué avec les propriétés width et height d'un DisplayObject ? Peu d'entre nous j'imagine, tant ces propriétés sont fondamentales. Et pourtant il existe quelques subtilités quant à leur utilisation !
Voici un morceau de code basique :
var r:MyRectangle = new MyRectangle(); //clip de la bibliothèque var s:Sprite = new Sprite(); s.addChild(r); this.addChild(s);
Rien de spécial, tout fonctionne parfaitement. Maintenant, juste avant l'affichage du clip, un Tween est appliqué sur le Sprite en question :
import fl.transitions.*; import fl.transitions.easing.*; var r:MyRectangle = new MyRectangle(); var s:Sprite = new Sprite(); var t:Tween = new Tween(s, "width", Back.easeOut, 0, 200, 1.5, true); s.addChild(r); this.addChild(s);
La c'est le drame ! Plus rien n'apparait à l'écran... Suite à un isolement du problème, le code se résume à ceci :
var r:MyRectangle = new MyRectangle(); var s:Sprite = new Sprite(); s.width = 0; s.addChild(r); this.addChild(s); s.width = 200;
Et le souci est toujours le même. Le comportement de la propriété width (au même titre que height) est assez spécial : pour autant que le DisplayObject soit vide, il suffit de la modifier (avec une valeur quelconque) pour que plus rien ne s'affiche. Même en essayant de réinitialiser les valeurs ensuite (et aussi avec scaleX), impossible à faire afficher quoi que ce soit !
Toutefois, la solution est imple : il suffit d'appliquer le Tween après avoir mis du contenu dedans, ce qui donne :
import fl.transitions.*; import fl.transitions.easing.*; var r:MyRectangle = new MyRectangle(); var s:Sprite = new Sprite(); s.addChild(r); var t:Tween = new Tween(s, "width", Back.easeOut, 0, 200, 1.5, true); //ou s.width = 200; this.addChild(s);
En toute logique, les propriétés width et height ne devraient être modifiées qu'après avoir mis du contenu. Le comportement est assez louche et la doc précise juste que par défaut les valeurs sont à zéro... Méfiance donc !
Commentaires
slt,
allons au plus court :
var r:MyRectangle = new MyRectangle();
var s:Sprite = new Sprite();
s.width = 200;
s.addChild(r);
this.addChild(s);
trace(s.width);
il s'agit tout simplement d'un gros bug, soit d'actionscript, soit de flash player ! (moi je penche en faveur d'un défaut de conception dans actionscript)
++
Salut,
Ouais je sais pas trop d'ou ca peut venir... A noter que je n'y avais jamais fait attention avant car c'est le genre de chose que je mets toujours après le addChild D'ailleurs si tu mets le width a zéro puis tu fais le addChild, la propriété scaleX est également à zéro. Mais même en réinitialisant ca ne marche pas
@++
Oué j'avais remarqué çà et supposé qu'il y avait de la division par zéro là-dessous (mais bon, qui sait ?).
Merci à vous ! Très surprenant comme bug quand même..