2009-05-31 7 views
2

J'ai un grand Sprite de grande taille, et je veux faire un zoom avant et arrière en gardant la position de la souris comme point de pivot, exactement comme google maps ou le zoom photoshop quand vous faites tourner la souris roue.Zoomer un objet en fonction de la position de la souris

Pour archiver l'effet de zoom entre les propriétés scaleX et scaleY, mais le point fixe est (0,0), alors que je dois être la position de la souris (qui change à chaque fois, bien sûr).

Comment puis-je changer cela?

merci.

Répondre

2

Découvert en recherchant les mots justes sur google ... ce lien explique les transformations affines http://gasi.ch/blog/zooming-in-flash-flex/ et je peux donc Tween la transformation Matrix:

var affineTransform:Matrix = board.transform.matrix; 
affineTransform.translate(-mouseX, -mouseY); 
affineTransform.scale(0.8, 0.8); 
affineTransform.translate(mouseX, mouseY); 
var originalMatrix:Matrix = board.transform.matrix; 
TweenLite.to(originalMatrix, 0.7, {a:affineTransform.a, b:affineTransform.b, c:affineTransform.c, d:affineTransform.d, tx:affineTransform.tx, ty:affineTransform.ty, onUpdate:applyMatrix, onUpdateParams:[originalMatrix]}); 

:-)

2

Je viens de faire un Google search pour "zoomer sur un point arbitraire" (moins les guillemets) et le premier résultat semble prometteur.

Vous devez retirer le décalage d'origine de la balance et le réappliquer à la nouvelle échelle. Je l'ai fait moi-même mais je n'ai pas le code à portée de main pour le moment, donc je vais voir si je peux le déterrer et le poster plus tard.

Le pseudo-code pour cela est quelque chose comme ça (de mémoire):

float dir = UP ? 1 : -1; 
float oldXscale = Xscale; 
float oldYscale = Yscale; 
Xscale += dir * increment; 
Yscale += dir * increment; 
newX = (oldX - Xoffset)/Xscale; 
newY = (oldY - Yoffset)/Yscale; 
Xoffset += (newX * oldXscale) - (newX * Xscale); 
Yoffset += (newY * oldYscale) - (newY * Yscale); 

Tout pas déclaré est un "global"

+0

Oui, mais depuis que je suis tweening, je ne peux pas 'déplacer' l'image-objet lorsque l'interpolation se termine .. i peut interpoler x et y aussi, mais tweening 4 propriétés d'un objet complexe commence à me sembler trop (mais peut-être que je me trompe .. je dois essayer) – Carlo

+0

Eh bien, c'est la base de ce que vous feriez si vous tweening manuellement, alors pouvez-vous définir la fin de l'interpolation de ceci? – ChrisF

+0

En interpolant manuellement signifie sur enterframe ou pendant le rappel d'événement lui-même. val + = (cur - cible)/delta – FlavorScape

-1
private static function onMouseWheel(event:MouseEvent):void { 
    var zoomAmount:Number = 0.03; 

    if (event.delta < 0) 
     zoomAmount *= -1; 

    var x:int = largeLargeSprite.mouseX; 
    var y:int = largeLargeSprite.mouseY; 
    largeLargeSprite.scaleX += zoomAmount; 
    largeLargeSprite.scaleY += zoomAmount; 
    largeLargeSprite.x -= x * zoomAmount; 
    largeLargeSprite.y -= y * zoomAmount; 
} 
Questions connexes