2009-12-22 13 views
0

quelqu'un peut-il s'il vous plaît m'aider à ce sujet. ci-joint est le fla qui a une partie du code que je travaille sur un projet.événement de la souris ne fonctionne pas correctement

Avec l'aide de la souris, vous pouvez dessiner un cercle sur l'image, mais pour certaines raisons, l'événement de la souris ne fonctionne pas. cela fonctionne bien quand l'eventlisteners est attaché à la scène, mais ne fonctionne pas quand il est attaché au movieclip.

comment puis-je limiter le cercle à dessiner seulement à l'intérieur du MovieClip qui est un rectangle.

ici est le code

const CANVAS:Sprite = new Sprite(); 
var _dragging:Boolean = false; 
var _corner:Point; 
var _corner2:Point; 

menFront.addEventListener(MouseEvent.MOUSE_DOWN, setAnchor); 
menFront.addEventListener(MouseEvent.MOUSE_UP, completeRect); 


function setAnchor(e:MouseEvent):void{ 
    trace("mouse down"); 
    if(!_dragging){ 
     CANVAS.graphics.clear(); 

     _corner = new Point(e.stageX, e.stageY); 
     _dragging = true; 
     menFront.addEventListener(MouseEvent.MOUSE_MOVE, liveDrag); 
    } 
} 

function completeRect(e:MouseEvent):void{ 
    trace("mouse up"); 
    if(_dragging){  
     _dragging = false; 
     menFront.removeEventListener(MouseEvent.MOUSE_MOVE, liveDrag); 
     CANVAS.graphics.lineStyle(0, 0, 0); 
     CANVAS.graphics.beginFill(0x222222,.5) 

     _corner2 = new Point(e.stageX, e.stageY); 
     trace(Point.distance(_corner,_corner2).toFixed(2)); 
     CANVAS.graphics.drawCircle(_corner.x, _corner.y, Point.distance(_corner,_corner2)); 
     addChild(CANVAS); 
    } 
} 

function liveDrag(e:MouseEvent):void{ 
    CANVAS.graphics.clear(); 
    CANVAS.graphics.lineStyle(0, 0x999999); 

    _corner2 = new Point(e.stageX, e.stageY); 
    //trace(Point.distance(_corner,_corner2).toFixed(2)); 
    CANVAS.graphics.drawCircle(_corner.x, _corner.y, Point.distance(_corner,_corner2)); 
    addChild(CANVAS); 
} 
+0

Hé, vous devriez voter ou marquer comme réponses qui répondent à votre question. Si vous pensez que j'aurais pu être plus utile, s'il vous plaît commenter et je vais étoffer ma réponse plus complètement. – alecmce

Répondre

3

Si vous ajoutez le MouseEvent.MOUSE_UP à l'objet que vous traînez, l'événement ne feu si l'élément est sous la souris au moment où le MOUSE_UP arrive , mais puisque vous mettez à jour l'objet avec MOUSE_MOVE, c'est une condition de concurrence entre quand le MOUSE_UP arrive et quand le MOUSE_MOVE arrive. Pour éviter de tels problèmes, vous devez garantir que vous recevez le message MOUSE_UP chaque fois que MOUSE_UP se déclenche, pendant votre cycle de mise à jour en direct. Pour ce faire, ajoutez l'écouteur d'événement sur la scène au moment où il est nécessaire, quelque chose comme ceci:

menFront.addEventListener(MouseEvent.MOUSE_DOWN, setAnchor); 

function setAnchor(event:MouseEvent):void 
{ 
    stage.addEventListener(MouseEvent.MOUSE_UP, completeRect); 
    // your other functionality 
} 

function completeRect(event:MouseEvent):void 
{ 
    stage.removeEventListener(MouseEvent.MOUSE_UP, completeRect); 
    // your other functionality 
} 

afin que votre completeRect ne soit pas appelé par inadvertance si vous cliquez ailleurs.

Espérons que cela vous aide

+0

Cela pourrait également être d'intérêt: http://github.com/alecmce/as3geometry/blob/master/src/ui/interactive/DragMechanism.as – alecmce

+0

Juste remarqué que mon lien dans le commentaire précédent est hors-of- date: https://github.com/alecmce/as3geometry/blob/master/src/alecmce/ui/interactive/DragMechanism.as – alecmce