2009-07-02 5 views

Répondre

0

Je ne sais pas pourquoi c'est un problème - c'est un comportement attendu. La largeur d'un clip est le nombre réel de pixels entre le bord le plus à gauche et le bord le plus à droite, ce qui change si un clip est pivoté. Si votre clip contient un sous-clip, la largeur de ce clip ne changera pas, puisque sa rotation ne changera probablement pas.

+0

Ceci est un bug dans Flash. Bien que le BoundingBox (que vous décrivez) doit changer, la largeur doit renvoyer la largeur réelle du contenu, non mise à l'échelle et non redimensionnée. – Virusescu

+0

Un bug impliquerait que ce comportement est errouneous d'une certaine façon - ce n'est pas le cas. La signification de la largeur et de la hauteur dans Flash signifie toujours au point d'affichage réel, pas avant la mise à l'échelle, la rotation, etc. Si vous voulez ignorer ces informations, vous devez empiler le contenu et mesurer les clips internes. –

+0

S'il vous plaît voir ma réponse pour un exemple de pourquoi je pense que ce comportement est erroné. D'après ce que vous dites, récupérer la taille d'origine d'un Sprite serait une tâche difficile. – Virusescu

1

Ceci est un bug dans Flash Player. Il y a quelques choses que vous pouvez faire:


Option 1 (probablement la meilleure façon):

Créer une sous-classe de MovieClip et remplacer les méthodes get et set pour la largeur et la hauteur. Demandez aux setters d'appeler super et de stocker les valeurs en tant que variables privées (par exemple _width/_height) Lorsque get est appelé, renvoyez vos variables privées. Puisque vous utilisez une matrice, remplacez les fonctions de matrice get et set, définissez les facteurs de mise à l'échelle avec vos nouvelles fonctions et réglez-les pour ne pas mettre à l'échelle avant d'appeler super. Pourquoi ça marche: Les setters ne sont pas affectés par ce bug.


Option 2:

utilisation scaleX/scaleY place pour obtenir la largeur/hauteur, et multiplier par les valeurs de largeur et de hauteur de 0 rotation, échelle de 1,0. Pourquoi ça marche: Les scaleX/scaleY ne sont pas affectés par ce bug.


Happy Coding!

+1

ce n'est pas un bug. le lecteur flash a toujours fonctionné de cette façon. – grapefrukt

+0

http://www.gskinner.com/blog/archives/2007/08/annoying_as3_bu.html – bgw

+1

Ceci est un bug dans Flash. Le Flash Player se comporte comme ça à partir du FP8 si je me souviens bien. Ou, si vous ne voulez pas le nommer un bug, alors c'est un changement majeur qui déroute néanmoins. – Virusescu

0

La largeur/hauteur change lorsque vous faites pivoter le clip. Si vous ne voulez pas ce comportement, utilisez plutôt les propriétés scaleX/scaleY.

1

OK .. MON MAUVAIS .. J'ai vu mon erreur finalement :). J'étais convaincu que c'était un bug avant. Bien que Branden avait raison, je trouve toujours cela assez confus. Ceci est finalement un exemple pour montrer que Branden avait raison et qu'il n'y a pas de divergence entre les deux dernières valeurs.

var box = new Sprite(); 
box.graphics.beginFill(0xFF0000); 
box.graphics.drawRect(0, 0, 100, 100); 
this.addChild(box); 

trace(box.width); 
box.rotation = 45; 
trace(box.width); 
box.width = 141.4; 
trace(box.width); 

Edit: Vous souhaitez toujours pourriez vouloir vérifier sous forme de lien de PiPeep de grantskinner décrire quelque chose que je voulais prouver ci-dessus, mais successuly (dans Flash CS3 - AS3) - http://www.gskinner.com/blog/archives/2007/08/annoying_as3_bu.html

1

Je sais que cela est un joli post vieux, donc mes excuses si cela brise l'étiquette du forum sur necroposting ou quoi que ce soit. Cependant, ce fut le premier résultat sur une recherche google pour un problème assez trivial et ne semble pas vraiment offrir un moyen décent de récupérer la largeur ou la hauteur non-réorientée d'un objet d'affichage. Le problème est qu'en demandant la largeur et la hauteur, vous semblez obtenir les limites globales de l'objet, quand ce que vous voulez sont les limites locales, voici comment vous faites cela: (il suffit de copier et coller l'ensemble chose dans un fichier flash et compiler pour voir ce que je veux dire).

import flash.display.Sprite; 

var spr=new Sprite() 
spr.graphics.beginFill(0xff0000); 
spr.graphics.drawRect(-25,-100,50,200); 
addChild(spr); 

spr.y=150 
spr.x=300 
function myOEF(e) 
{ 
    spr.rotation++ 
    trace(spr.width,spr.height); 
    var bounds=spr.getBounds(this) 
    trace("A: Global bounds: "+bounds); 
    var bounds=spr.getBounds(spr) 
    trace("B: Local bounds: "+bounds); 
} 

addEventListener("enterFrame",myOEF); 
+0

Les bonnes réponses sont toujours les bienvenues –

Questions connexes