2010-06-03 4 views
1

Comment faire dans ActionScript 3 dans Flash un MovieClip qui suit le curseur, mais qui est contraint à la forme irrégulière d'un autre MovieClip?FLASH/AS3: La figure qui suit le curseur est contrainte à une zone irrégulière

Edit: cela est un peu ce que je dois:

stage.addEventListener(MouseEvent.MOUSE_MOVE,follow); 
function follow(evt:MouseEvent){ 
     if(container.hitTestPoint(mouseX, mouseY, true)) { 
    cursor.x = mouseX; 
    cursor.y = mouseY; 
     } else { 
     var dx:int = cursor.mouseX; 
     var dy:int = ; 
    cursor.x = dx; 
    cursor.y = cursor.mouseY; 

     } 
} 

Ce que je veux accomplir est de faire que le curseur MC encore « suivre » le curseur est quand l'extérieur du conteneur MC, mais ne peut pas échapper à partir de cela.

Un vieux script AS2 qui font cela, mais je ne suis pas sûr de savoir comment convertir:

onClipEvent (mouseMove) { 
    tX = _parent._xmouse; 
    // tX/tY are 'target' X/Y. 
    tY = _parent._ymouse; 
    if (_parent.constraintzone.hittest(tX, tY, true)) { 
     _x = tX; 
     _y = tY; 
    } else { 
     // and now the hurting begins 
     // get XY of center of constraint zone 
     cX = _parent.constraintzone._x; 
     // cX/cY are 'constrained' X/Y, 
     cY = _parent.constraintzone._y; 
     // found somewhere inside the constraint zone. 
     accuracy = 1; 
     // smaller = more accurate. 
     do { 
      dX = (tX-cX)/2; 
      // dX/dY are deltas to the midpoint between 
      dY = (tY-cY)/2; 
      // target XY and constrained XY. 
      if (_parent.constraintzone.hittest((tX-dX), (tY-dY), true)) { 
       cX += dX; 
       // midpoint is in; step out towards mouse. 
       cY += dY; 
      } else { 
       tX -= dX; 
       // midpoint is out; step in towards center. 
       tY -= dY; 
      } 
      // loop end. 
      // (dD > .5) is more accurate, (dX > 10) is less. 
     } while ((Math.abs(dX)>accuracy) || (Math.abs(dY)>accuracy)); 
     _x = tX; 
     // we're done, set the final position. 
     _y = tY; 
    } 
} 

Répondre

1

Le code que vous avez collé ressemblerait à quelque chose comme ça dans AS 3:

stage.addEventListener(MouseEvent.MOUSE_MOVE,follow); 

function follow(evt:MouseEvent) { 
if (container.hitTestPoint(mouseX, mouseY, true)) { 
    cursor.x = mouseX; 
    cursor.y = mouseY; 
} else { 
    var cX:Number = container.x + (container.width/2); 
     // cX/cY are 'constrained' X/Y, 
     var cY:Number = container.y + (container.height/2); 
     // found somewhere inside the constraint zone. 
    var tX:Number = mouseX; 
    var tY:Number = mouseY; 

    var accuracy:Number = 1; 
     // smaller = more accurate. 
     do { 
      var dX:Number = (tX-cX)/2; 
      // dX/dY are deltas to the midpoint between 
      var dY:Number = (tY-cY)/2; 
      // target XY and constrained XY. 
      if (container.hitTestPoint((tX-dX), (tY-dY), true)) { 
       cX += dX; 
       // midpoint is in; step out towards mouse. 
       cY += dY; 
      } else { 
       tX -= dX; 
       // midpoint is out; step in towards center. 
       tY -= dY; 
      } 
      // loop end. 
      // (dD > .5) is more accurate, (dX > 10) is less. 
     } while ((Math.abs(dX)>accuracy) || (Math.abs(dY)>accuracy)); 
     cursor.x = tX; 
     // we're done, set the final position. 
     cursor.y = tY; 
} 
} 

Il est un peu cool et même si ce n'est pas parfait, ça fonctionne assez vite. Donc, je vérifierais avec votre forme réelle. Cela pourrait être assez bon.

+0

Cela fonctionne, mais j'ai changé container.x + (container.width/2) pour (container.x + container.width)/2. Savez-vous s'il existe un moyen d'avoir deux de ces objets? J'ai essayé en faisant une copie du MC et une copie du script avec différentes variables, mais pour une raison quelconque, celle que je mets sur le bon bordel. – peroyomas

+0

Je l'ai changé à container.x + container.width/4 et fonctionne bien dans tous mes cas. – peroyomas

0

si vous utilisez soit des événements HitTest ou déploiement de roulement, vous pouvez utiliser mouseX mouseY pour trouver la position de la souris . Si vous avez besoin de point de souris le plus proche, vous êtes dans un monde merveilleux d'essais et d'erreurs. Voir;

stackoverflow.com/questions/2389183/flash-closest-point-to-movieclip/2407510#2407510