2009-12-22 2 views
0

Может кто-нибудь, пожалуйста, помогите мне в этом. прилагается fla, который имеет часть кода, над которым я работаю для проекта.mouse up event не работает должным образом

с помощью мыши вы можете нарисовать круг на изображении, но по некоторым причинам событие mouse up не работает. он отлично работает, когда участники событий присоединяются к сцене, но не работают, когда он прикреплен к мувиклипу.

также как я могу ограничить круг, который будет нарисован только внутри мувиклипа, который является прямоугольником.

здесь код

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

Эй, вы должны проголосовать или отметить как ответные ответы, которые касаются вашего вопроса. Если вы чувствуете, что я мог бы быть более полезным, прокомментируйте, и я буду более полно излагать свой ответ. – alecmce

ответ

3

Если добавить MouseEvent.MOUSE_UP к объекту, который вы тащит, это событие будет только огня, если элемент находится под мышью в момент MOUSE_UP происходит , но поскольку вы обновляете элемент с помощью MOUSE_MOVE, это состояние гонки между тем, когда происходит MOUSE_UP и когда происходит MOUSE_MOVE.

Чтобы избежать таких проблем, вы хотите гарантировать, что вы получаете MOUSE_UP всякий раз, когда срабатывает MOUSE_UP во время цикла live-update. Чтобы сделать это, добавьте слушателя событий на сцену только тогда, когда это необходимо, что-то вроде этого:

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 
} 

, чтобы ваш completeRect не дозвонились неосторожно, если вы щелкаете в другом месте.

Надеюсь, что это поможет

+0

Это также может быть интересно: http://github.com/alecmce/as3geometry/blob/master/src/ui/interactive/DragMechanism.as – alecmce

+0

Только что заметил, что моя ссылка в предыдущем комментарии не соответствует действительности, date: https://github.com/alecmce/as3geometry/blob/master/src/alecmce/ui/interactive/DragMechanism.as – alecmce