我运气不好,不得不将一些 ActionScript 3 代码移植到 ActionScript 2,并且在检测鼠标何时离开舞台时遇到了问题。
在 ActionScript 3 中有一个名为 的事件Event.MOUSE_LEAVE
,可用于检测鼠标何时离开舞台,但据我所知,在 ActionScript 2 中没有等效的。
您将如何最好地模拟相同的功能?
侦听鼠标移动并根据舞台边界检查鼠标坐标不起作用,因为当鼠标离开舞台时鼠标坐标停止更新。
我运气不好,不得不将一些 ActionScript 3 代码移植到 ActionScript 2,并且在检测鼠标何时离开舞台时遇到了问题。
在 ActionScript 3 中有一个名为 的事件Event.MOUSE_LEAVE
,可用于检测鼠标何时离开舞台,但据我所知,在 ActionScript 2 中没有等效的。
您将如何最好地模拟相同的功能?
侦听鼠标移动并根据舞台边界检查鼠标坐标不起作用,因为当鼠标离开舞台时鼠标坐标停止更新。
我还没有在 AS2 中找到可靠的方法来执行此操作(在某些浏览器上,当鼠标在应用程序之外时,您甚至会不断获取鼠标更新)。所以我通常做的是检查鼠标是否在应用程序的外部 10 或 20 像素边界之外,如果是,我认为这是 MOUSE_LEAVE。最好听 MOUSE_MOVE 而不是每帧都检查这个,因为如果你的帧速率较低,你可能会错过一些更新。
也可以调出上下文菜单,将鼠标移到外面,然后完全绕过上面的整个检查(或者甚至将鼠标快速移过边框),所以我经常添加一个在鼠标没有触发后触发的计时器t 移动了 2-3 秒。
它不是特别强大,但它是我管理过的最好的。
(按照 Theo 的第三个选项的实现。)
// 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);
}
我想我曾经通过在舞台边缘放置隐形按钮并使用它们的滚动功能来解决这个问题。认为只要他们没有移动鼠标太快就可以了!虽然遥远的记忆。
此问题的解决方案分为三类:
根据舞台边界检查鼠标位置(例如 Mayhew 的回答)。这是一个幼稚的解决方案,如果它有效,我永远不会问这个问题。问题是当鼠标离开舞台时鼠标坐标停止更新,它们将保留它们的最后位置,该位置始终在舞台内。
在舞台周围创建一个边框并检测此边框内的鼠标移动(例如grapefrukt的回答。如果边框非常宽,但您会得到很多误报 - 并且如果鼠标停在边框内然后再次开始移动你得到一个错误的鼠标输入。也遇到与 1 相同的问题,鼠标总是可以移动得足够快,以至于你不会检测到它在边界上移动。
跟踪鼠标的方向和速度,以便当您停止接收鼠标移动事件时,您可以计算鼠标应该在哪里,并查看该点是否在舞台之外。在边缘情况下可能会被愚弄,但比 1 和 2 都好得多。不过需要更多的代码。