Forums Développement Multimédia

Aller au contenu

Le_Pioo

Inscrit(e) (le) 02 Feb 2010
Déconnecté Dernière activité Dec 11 2018 19:13 PM
-----

Sujets que j'ai initiés

Qu'est-ce la methode getRect() a dans le ventre?

09 December 2018 - 20:29 PM

Bonjour,

Je tente actuellement de recoder la méthode getRect() de la classe DisplayObject à la main pour la raison suivante... je suis un fou furieux ! Et puis aussi j'aimerais comprendre ce que cette méthode a dans le ventre et comment elle fonctionne réellement.

J'ai réussi à calculer le rectangle d'un clip enfant au sein de son clip parent en appliquant la matrice (position,rotation,scale) de ce dernier aux coordonnées du clip enfant.
En revanche lorsque les deux clips ne sont pas enfant ou parent l'un de l'autre mon calcul est erroné...

Auriez-vous une piste, voir même les sources de cette méthode ?

J'ai conscience que ma demande est un peu "poussée" et je remercie quiconque s'y penchera!

PS:J'ai décompilé les sources en .swf mais la classe DisplayObject fait apparemment appel à du code C++ et toutes les méthodes sont natives et "vides".


package  {
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.display.Shape;
import flash.display.DisplayObjectContainer;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.geom.Matrix;
import flash.display.DisplayObject;

public class Main extends MovieClip {
 
  private var parentClip:Sprite ;
  private var childClip:Sprite;
 
  public function Main() {
   parentClip=new Sprite();
   childClip=new Sprite();
 
   var shape=new Shape();
   shape.graphics.beginFill(0x0000FF);   //
   shape.graphics.drawRect(0, 0, 100,100);  //Drawing a 100*100 square
   shape.graphics.endFill();     //
 
   parentClip.scaleX=parentClip.scaleY=1.5;
   parentClip.rotation=15;
   parentClip.x=parentClip.y=5;
 
   childClip.scaleX=childClip.scaleY=1.2;
   childClip.rotation=13;
   childClip.y=childClip.x=10;
 
   childClip.addChild(shape);  
   //parentClip.addChild(childClip);    //When this line is commented the myOwnGetRect won't work anymore
 
   trace(childClip.getRect(parentClip));
   trace(myOwnGetRect(childClip, parentClip));
  }
 
  private function myOwnGetRect(source:DisplayObjectContainer,target:DisplayObjectContainer){
   var minX:Number=Number.POSITIVE_INFINITY;
   var maxX:Number=Number.NEGATIVE_INFINITY;
   var minY:Number=Number.POSITIVE_INFINITY;
   var maxY:Number=Number.NEGATIVE_INFINITY;
 
   var topLeft:Point=new Point(source.getChildAt(0).x,source.getChildAt(0).y);
   var topRight:Point=new Point(source.getChildAt(0).x+source.getChildAt(0).width,source.getChildAt(0).y);
   var botLeft:Point=new Point(source.getChildAt(0).x,source.getChildAt(0).y+source.getChildAt(0).height);
   var botRight:Point=new Point(source.getChildAt(0).x+source.getChildAt(0).width,source.getChildAt(0).y+source.getChildAt(0).height);
   var directParent:DisplayObjectContainer=source;
 
   while(directParent  && directParent != target && directParent != stage){
   topLeft=applyMatrix(topLeft,directParent);
   topRight=applyMatrix(topRight,directParent);
   botLeft=applyMatrix(botLeft,directParent);
   botRight=applyMatrix(botRight,directParent);
   directParent=directParent.parent;
   }
 
   var pts = [topLeft,topRight,botLeft,botRight];
 
   for (var i:int = 0; i < pts.length; i++) {
         var pt:Point = pts[i];
         if (pt.x < minX) minX = pt.x;
         if (pt.x > maxX) maxX = pt.x;
         if (pt.y < minY) minY = pt.y;
         if (pt.y > maxY) maxY = pt.y;
   }
   return(new Rectangle(minX,minY,maxX-minX,maxY-minY));
  }
 
  private function applyMatrix(point:Point, matrixSource:DisplayObject){
   var matrix:Matrix=new Matrix();
   matrix.scale(matrixSource.scaleX, matrixSource.scaleY);
   matrix.rotate(matrixSource.rotation * Math.PI / 180);
   matrix.translate(matrixSource.x,matrixSource.y);
   return(matrix.transformPoint(point));
  }
}

}
 

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP