Flash AS3 - Comment faire pour centrer un objet autour d'un point d'après l'échelle
J'ai créé un mc qui fonctionne comme ma carte et des contrôles pour aller avec ce qui permettra la carte pour être déplacés et les principaux points de naviguer et de zoomer sur à différents niveaux de zoom.
Je suis en utilisant les propriétés scaleX et scaleY à l'échelle de la carte mc et une liste de positions x et y pour positionner correctement la carte pour chaque point clé.
Quand je veux aller à un certain domaine, j'ai effectuer ce calcul (offsetX et offsetY sont au centre de l'écran):
newX = posX * scale + offsetX;
newY = posY * scale + offsetY;
Puis je interpolation de la position et l'échelle de la carte de la douceur, de l'échelle et déplacer la carte à la position correcte:
var tween = new TweenLite(_background, EASING_SPEED, {x:newX, y:newY,scaleX:scale.getScale(),scaleY:scale,ease:EASING_TYPE,onComplete:moveToComplete,onCompleteParams:[room]});
J'ai maintenant besoin de mettre en œuvre un zoom in /out de fonction et c'est ce que je suis aux prises avec. Le zoom doit utiliser le centre de l'écran, comme le reg point pour l'échelle, alors j'ai essayé quelque chose le long des lignes de ce qui suit pour obtenir le positionnement correct:
var newX = offsetX - (offsetX - _background.x) * scale;
var newY = offsetY - (offsetY - _background.y) * scale;
Donc, dans mon esprit, c'obtient la distance à partir de la position actuelle de la carte par rapport au point central de l'écran (offsetX, offsetY) puis des échelles de distance par la nouvelle échelle.
Cependant, ce qui est manifestement faux, car il ne fonctionne pas et le positionnement de la carte est fausse.
J'ai aussi essayé d'utiliser une matrice de transformation pour obtenir les bonnes valeurs, mais je sais encore moins sur eux et de ne pas obtenu les résultats escomptés.
function scale(target:MovieClip, center:Point, scale:Number):Point {
var m:Matrix = new Matrix();
m.translate(-center.x, -center.y);//move the center into (0,0)
m.scale(scale, scale);//scale relatively to (0,0) (which is where our center is now)
m.translate(center.x, center.y);//move the center back to its original position
return m.transformPoint(new Point());//transform (0,0) using the whole transformation matrix to calculate the destination of the upper left corner
}
Si quelqu'un pourrait jeter quelque lumière sur l'endroit où je vais mal, je lui en serais vraiment reconnaissante!
Vous devez vous connecter pour publier un commentaire.
J'ai eu un problème similaire où j'ai voulu l'image à faire pivoter sur le centre de l'image quand j'ai changé la rotation de l'image, mais l'image serait tourner autour de l'0,0 point.
Dans les deux cas( la vôtre et la mienne ) il y a 2 travail autour de cela.
La première approche consisterait à définir avec les mathématiques lors de la mise à l'échelle des changements.
L'autre manière, qui une fois chargé nécessitera pas de code supplémentaire.
Ajouter un autre movieClip à l'intérieur de _background dans ce movieclip l'image va aller.
Cette image sera placée avec le point central 0,0 point au lieu de la topleft de l'image 0,0.
Donc, fondamentalement,
Cela fonctionne pour l'échelle et la rotation de l'image, tous centrés sur le centre de l'image.
[MODIFIER]
Ok, donc ce que vous devez faire est de commencer un nouveau projet et de créer quelque chose comme ce schéma.
Mettre l'image dans un conteneur movieclip
L'image et le conteneur ont la même hauteur et la largeur
Déplacer l'image de sorte que le centre de celui-ci est à l'0,0 point de MovieClip
Mettre le récipient sur scène.
2 boutons sur l'événement click ajouter .1 l'autre pour soustraire .1 à l'échelle sur le conteneur.
Maintenant, exécutez le test
Comme vous pouvez le voir le scaleing est centrée sur l'image
Maintenant pour le test 2 ouvrir le récipient et faites glisser l'image à gauche
Exécutez à nouveau le test.
Vous voyez l'image est maintenant mise à l'échelle et à la droite du centre(en face de l'endroit où vous l'avez déposée).
Donc, pour résumer, le décalage est mouvement inverse à partir du centre de l'image.(+2 points si vous comprenez une)
REMARQUE: la mise à l'échelle s'appliquent à l'contenant pas l'image directement sur le lieu de l'image de mouvement sera toujours de l'image.x et de l'image.y
De http://timwhitlock.info/blog/2008/04/13/scale-rotate-around-an-arbitrary-centre/
Exemple d'utilisation de la fonction ci-dessus:
Lorsque vous redimensionnez un objet , le point de focalisation devrait conserver le même système de coordonnées. Puisque vous êtes mise à l'échelle de l'objet , vous devriez probablement utiliser ce point de coordonnées par rapport à la taille de la carte.
Depuis ce point reste dans le même stade de position , il devrait alors être possible de calculer les coordonnées cartographiques par rapport à cette valeur fixe.
bien, je n'ai pas essayé, mais ce serait ma première approche 🙂
Espère que cela aide!
Disons que votre carte à un ratio de 1:1 est 800x400. Le centre aurait alors (400 , 200 ).
Si vous avez l'échelle de la carte en haut, disons 1600x800 , le point central sera déplacé à (800, 400 ). Vous devez l'interpolation de la carte afin d'obtenir que le point précédent à ( 400 , 200 ) cela aura pour effet de donner l'impression que le point central est resté en place.
L'exemple que je vous ai donné était basée sur l'idée que le "zoom" point vas variable, où les clics de la souris, par exemple . Si ce n'est pas le cas, alors il vous suffit de déplacer votre point d'enregistrement au centre 🙂
Les gens, je pense que c'est juste un problème de maths. Vous pouvez modifier la position x,y, tandis que ne l'ampleur en même temps dans une animation: