Coordonnées globales
Par Gwenn Guihal :: 24/03/2009 :: AS3
Hello,
Erratum
Après quelques recherches au fond de moi-même, j'ai, enfin je crois avoir compris comment utiliser la méthode localToGlobal dans mon cas : J'ai un clip Albert sur ma scène, il contient un clip Bertand qui contient lui un clip Clément. Je veux, dans Bertrand, connaitre la position de Clément par rapport à la scène (stage). Il suffit de faire :
// je suis dans Bertand.as, classe liée au clip Bertrand var pt:Point = clement_mc.localToGlobal(new Point(0,0)));
Le point 0,0 représente le point 0,0 dans clément_mc. Et donc, Flash me retourne ce point mais relativement à la scène. Bien entendu, il s'agit du même résultat qu'obtenu avec la classe Coord.as. Cette dernière n'est donc plus trop utile... Mais bon, je laisse tout de même la suite...
Je ne sais pas vous, mais moi, j'ai pas encore tout compris aux fonctions globalToLocal et localToGlobal... En tout cas elles ne fonctionnent pas toujours comme j'aimerais l'entendre...
Par exemple, dans un projet Flash, vous avez besoin de tooltips. Le tooltip doit toujours se trouver au dessus de tous les autres clips. Donc, logiquement, il est placé sur la scène, tout au dessus. Maintenant, au rollover de votre bouton, le tooltip doit venir se placer sur votre bouton ou pas loin. Le problème, c'est que votre bouton, est placé dans un clip, qui est lui même placé dans un clip, [...], qui est enfin placé sur la scène. On doit donc donner au tooltip les coordonnées du bouton relatives à la scène.
Voici une simple classe, amenée à être complétée avec d'autres fonctionnalités qui va faire le travail pour vous :
package fr.myrddin.utils
{
import flash.display.DisplayObject;
import flash.geom.Point;
public class Coord
{
/**
* Renvoie les coordonnées d'un clip par rapport à la scène
* @param $mc Le clip
* @return Les coordonées du clip par rapport à stage
*/
public static function getCoordGlobal($mc:DisplayObject):Point
{
var pt:Point = new Point();
return incrementeCoord($mc,pt);
}
private static function incrementeCoord($mc:DisplayObject,$pt:Point):Point
{
$pt.x += $mc.x;
$pt.y += $mc.y;
if ($mc.parent)
{
return incrementeCoord($mc.parent,$pt);
}
else
{
return $pt;
}
}
}
}
Et quand vous en avez besoin :
var btn:MovieClip = $e.currentTarget as MovieClip; var pt:Point = Coord.getCoordGlobal(btn);
