我们可以关闭MouseEvents吗?

时间:2016-10-15 14:57:30

标签: actionscript-3 mouseevent flashdevelop

我一直在做一些有关MouseEvents的测试。感谢Neal Davis,其中大部分都是为我澄清的。现在,我想设计代码,这样每当我左键单击时,它将开始沿着鼠标的x和y坐标绘制圆圈。当我松开鼠标左键时,它将停止绘制圆圈。我试图尽可能地复制这个,但这是我最终陷入困境的地方:

stage.addEventListener(MouseEvent.MOUSE_DOWN, mClickOn);
stage.addEventListener(MouseEvent.MOUSE_MOVE, mMove);
stage.addEventListener(MouseEvent.CLICK, mClickOff);

public var clickOn:Boolean;
public var clickOff:Boolean;

public function mClickOn(e:MouseEvent):void
{
    clickOn = e.buttonDown;
}

public function mClickOff(e:MouseEvent):void
{
    clickOff = e.buttonDown
}

public function mMove(e:MouseEvent):void
{
    if (clickOn) //keep drawing when left click
    {
        draw.create(e.localX, e.localY);
        addChild(draw);
    }
    else if (clickOff) //don't draw when you let go of left click
    {
        null;
    }
}

问题是左键单击时MOUSE_DOWN为真,但我认为当我们不再点击时,它会自动返回false。在我的测试中,它在第一次点击后保持不变。至于CLICK,它总是错误的。

如何使这些MouseEvent可以打开和关闭?我想制作一个铅笔工具/模拟器。

2 个答案:

答案 0 :(得分:1)

以下是这个想法:

  1. 当鼠标按钮按下时,将标志设置为true,并在鼠标按下时将其设置为false。
  2. 每个应用程序循环(定时器事件或输入帧事件)检查该标志的值
  3. 选择“绘制圆圈”工具时,开始侦听MOUSE_DOWN。
  4. 当鼠标停止并开始侦听MOUSE_UP
  5. 时,停止侦听MOUSE_DOWN
  6. 当鼠标上升时,再次开始侦听MOUSE_DOWN并停止侦听MOUSE_UP。
  7. 然后在选中工具时停止侦听MOUSE_DOWN。 (我没有在下面显示工具选举和取消选择部分。希望你能得到这个想法。对于每个工具,你需要复制这个过程)
  8. 做这样的事情:

    private function mDown(me:MouseEvent):void{
        _mDown = true;
        stage.removeEventListener(MouseEvent.MOUSE_DOWN, mDown);
        stage.addEventListener(MouseEvent.MOUSE_UP, mUp);
    }
    
    private function mUp(me:MouseEvent):void{
        _mDown = false;
        stage.removeEventListener(MouseEvent.MOUSE_UP, mUp);
        stage.addEventListener(MouseEvent.MOUSE_DOWN,mDown);
    }
    

    然后你需要一个appTick或gameLoop或者timerEvent,比如

    stage.addEventListener(Event.ENTER_FRAME, applicationLoop);
    
    private function applicationLoop(e:Event):void{
        if (_mDown == true){
            drawCircles();
        }
    

    然后

    private function drawCircles():void{
        // your draw logic
    }
    

    应该这样做。

    注意 如果你想以喷漆工具的方式绘制圆圈(即使鼠标不移动也会不断增加油漆),每帧检查_mDown标志。如果您希望它只在鼠标移动时添加圆圈,请检查MOUSE_MOVE事件上的标志。

答案 1 :(得分:0)

点击是按下鼠标按钮再次放开。这对您的情况没有用,因为您要单独查看鼠标的向下和向上,以启动或停止绘制过程。使用MouseEvent.MOUSE_DOWNMouseEvent.MOUSE_UP更合适。

要开始和停止该过程,只需添加或删除侦听器即可在两种绘图状态之间切换而不是绘图。

stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);

public function onMouseDown(e:MouseEvent):void
{
    stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); 
    stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);

    stage.removeEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
}

public function onMouseUp(e:MouseEvent):void
{
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);  
    stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);

    stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
}

public function onMouseMove(e:MouseEvent):void
{
    draw.create(e.localX, e.localY);
    addChild(draw);
}