鼠标操作不正常

时间:2009-12-22 08:38:42

标签: actionscript-3 flash-cs4

任何人都可以帮助我。 附件是fla,它包含我正在为项目工作的代码的一部分。

在鼠标的帮助下,您可以在图像上绘制一个圆圈,但由于某些原因,鼠标向上事件不起作用。当eventlisteners附加到舞台时它可以正常工作,但当它附加到动画片段时不起作用。

我怎么能限制只在一个矩形的动画片段内绘制圆圈。

这是代码

    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); 
}

1 个答案:

答案 0 :(得分:3)

如果将MouseEvent.MOUSE_UP添加到要拖动的对象,则在MOUSE_UP发生时,如果项目位于鼠标下方,则事件将仅 ,但是因为您正在更新使用MOUSE_MOVE的项目,这是MOUSE_UP发生时和MOUSE_MOVE发生之间的竞争条件。

为了避免此类问题,您希望保证在实时更新周期内,只要MOUSE_UP触发,您就会收到MOUSE_UP。要做到这一点,请在需要时将事件监听器添加到阶段,如下所示:

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就不会被无意中调用。

希望这有助于