代码之家  ›  专栏  ›  技术社区  ›  Theo

在ActionScript 2中,如何检测鼠标何时离开舞台?

  •  1
  • Theo  · 技术社区  · 17 年前

    我运气不好,不得不将一些ActionScript3代码下载到ActionScript2,我在检测鼠标何时离开舞台时遇到问题。

    Event.MOUSE_LEAVE ,可用于检测鼠标何时离开舞台,但据我所知,ActionScript2中没有类似的功能。

    您如何最好地模拟相同的功能?

    监听鼠标移动并根据舞台边界检查鼠标坐标不起作用,因为当鼠标离开舞台时,鼠标坐标停止更新。

    4 回复  |  直到 17 年前
        1
  •  6
  •   Pup    16 年前

    使用数学来估计鼠标 将 禁区:

    (按照西奥的第三个方案实施。)

    // Stage rollout detection:
    private var mouse_dx:Number;
    private var mouse_dy:Number;
    
    private function detectMouseOutOfBounds ():Void {
        mouse_dx = _xmouse;
        mouse_dy = _ymouse;
    
        var mouseListener:Object = { };
        mouseListener.onMouseMove = Delegate.create(this,
            function () {
                mouse_dx = Math.abs(mouse_dx-_xmouse);
                mouse_dy = Math.abs(mouse_dy-_ymouse);
                var speed:Number = Math.max(mouse_dx, mouse_dy) + 5; // Precautionary buffer added.
                var willBeOutOfBounds:Boolean = (
                    _xmouse - speed < 0 || 
                    _xmouse + speed > Stage.width ||
                    _ymouse - speed < 0 ||
                    _ymouse + speed > Stage.height
                );
                if (willBeOutOfBounds) {
                    _display._alpha = 10;
                } else {
                    _display._alpha = 100;
                }
                mouse_dx=_xmouse;
                mouse_dy = _ymouse;
            }
        );
        Mouse.addListener(mouseListener);
    }
    
        2
  •  6
  •   grapefrukt    17 年前

    在AS2中,我还没有找到一种可靠的方法来实现这一点(在某些浏览器上,当鼠标在应用程序之外时,你甚至会不断地获得鼠标更新)。因此,我通常做的是检查鼠标是否在应用程序的外部10或20px边界之外,如果是这样,我认为这是鼠标离开。听鼠标移动可能比每帧检查鼠标移动更好,因为如果帧速率较低,可能会错过一些更新。

    也可以打开关联菜单,将鼠标移到外面,然后完全绕过上面的整个检查单击(甚至可以将鼠标快速移动到边界之外),因此我经常添加一个计时器,在鼠标在2-3秒内没有移动后触发。

    它不是特别健壮,但它是我管理过的最好的。

        3
  •  2
  •   Iain    17 年前

    我想我曾经通过在舞台边缘放置不可见的按钮并使用它们的卷展功能来解决这个问题。我认为只要他们不太快地移动鼠标,这就行了!然而,遥远的记忆。

        4
  •  0
  •   Theo    17 年前

    1. 对照阶段边界检查鼠标位置(例如Mayhew的答案)。这是一个天真的解决方案,如果它起作用,我永远不会问这个问题。问题是,当鼠标离开舞台时,鼠标坐标停止更新,并且它们将保留其最后位置,该位置始终位于舞台内部。

    2. 在舞台周围创建边框,并检测此边框内的鼠标移动(例如,grapefrukt的答案。如果边界非常宽,则有效,但会出现大量误报——如果鼠标停在边界内,然后再次开始移动,则会出现错误的鼠标输入。此外,还有与1相同的问题,鼠标移动速度总是足够快,以至于您无法检测到它在边界上移动。