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

时间:2009-01-15 11:28:52

标签: flash actionscript-2

我不得不将一些ActionScript 3代码向下移植到ActionScript 2,但我在检测鼠标何时离开舞台时遇到了问题。

在ActionScript 3中有一个名为Event.MOUSE_LEAVE的事件,可用于检测鼠标何时离开舞台,但在我看到的情况下,ActionScript 2中没有等效内容。

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

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

4 个答案:

答案 0 :(得分:6)

我还没有找到一种可靠的方法在AS2中执行此操作(在某些浏览器上,当鼠标位于应用程序之外时,您甚至会继续获取鼠标更新)。所以我通常做的是检查鼠标是否在应用程序的外部10或20px边界之外,如果是,我将其视为MOUSE_LEAVE。听取MOUSE_MOVE而不是每帧都检查一下可能会更好,因为如果你的帧速率较低,你可能会错过一些更新。

也可以调出上下文菜单,将鼠标移到外面,然后完全点击上面的整个检查(甚至可以快速移动鼠标经过边框),所以我经常添加一个计时器,在鼠标在2-3秒内没有移动。

它并不是特别强大,但它是我管理过的最好的。

答案 1 :(得分:5)

使用数学来估计鼠标何时超出范围:

(按照Theo的第3选项执行。)

// 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 :(得分:2)

我想我曾经通过在舞台的边缘放置隐形按钮并使用它们的推出功能来解决这个问题。认为只要他们没有快速移动鼠标就行了!遥远的记忆。

答案 3 :(得分:0)

此问题有三类解决方案:

  1. 根据舞台边界检查鼠标位置(例如Mayhew的答案)。这是天真的解决方案,如果它有效,我永远不会问这个问题。问题是当鼠标离开舞台时鼠标坐标停止更新,并且它们将保留它们的最后位置,该位置始终在舞台内。

  2. 在舞台周围创建边框并检测此边框内的鼠标移动(例如grapefrukt的答案。如果边框非常宽,但是你会得到很多误报 - 如果鼠标停在边界,然后开始再次移动你得到一个错误的鼠标输入。也遇到与1相同的问题,鼠标总是能够快速移动,以至于你不会检测到它在边界上移动。

  3. 跟踪鼠标的方向和速度,这样当您停止接收鼠标移动事件时,您可以计算鼠标的位置,并查看该点是否在舞台之外。可以在边缘情况下被愚弄,但比1和2都好得多。但需要更多的代码。