Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash 在ActionScript 2中,如何检测鼠标何时离开舞台?_Flash_Actionscript 2 - Fatal编程技术网

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

Flash 在ActionScript 2中,如何检测鼠标何时离开舞台?,flash,actionscript-2,Flash,Actionscript 2,我运气不好,不得不将一些ActionScript3代码下载到ActionScript2,我在检测鼠标何时离开舞台时遇到问题 在ActionScript 3中有一个名为event.MOUSE_LEAVE的事件,可用于检测鼠标何时离开舞台,但据我所知,ActionScript 2中没有类似的事件 您如何最好地模拟相同的功能 监听鼠标移动并根据阶段边界检查鼠标坐标不起作用,因为当鼠标离开阶段时,鼠标坐标停止更新。我在AS2中找不到可靠的方法来做到这一点(在某些浏览器上,当鼠标在应用程序外时,您甚至会不

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

在ActionScript 3中有一个名为
event.MOUSE_LEAVE
的事件,可用于检测鼠标何时离开舞台,但据我所知,ActionScript 2中没有类似的事件

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


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

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

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


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

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

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


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

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

此问题有三类解决方案:

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

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

  • 跟踪鼠标的方向和速度,这样当您停止接收鼠标移动事件时,您可以计算鼠标应该在哪里,并查看该点是否在舞台外。在边缘情况下可能会被愚弄,但效果比1和2都好。尽管需要更多的代码


  • 此问题有三类解决方案:

  • 根据阶段边界检查鼠标位置(例如Mayhew的答案)。这是一个简单的解决方案,如果它起作用,我永远不会问这个问题。问题是当鼠标离开阶段时,鼠标坐标停止更新,它们将保留其最后位置,始终在阶段内

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

  • 跟踪鼠标的方向和速度,这样当您停止接收鼠标移动事件时,您可以计算鼠标应该在哪里,并查看该点是否在舞台外。在边缘情况下可能会被愚弄,但效果比1和2都好。尽管需要更多的代码

  • 使用数学来估计鼠标何时将超出边界: (按照西奥的第三个方案实施。)

    //舞台卷展栏检测:
    私有变量鼠标_dx:编号;
    私有变量:数字;
    私有函数detectMouseOutOfBounds():Void{
    鼠标_dx=_xmouse;
    鼠标_dy=_ymouse;
    var mouseListener:Object={};
    mouseListener.onMouseMove=委托.create(此,
    函数(){
    mouse\u dx=Math.abs(mouse\u dx-\u xmouse);
    mouse\u dy=Math.abs(mouse\u dy-\u ymouse);
    var-speed:Number=Math.max(mouse\u-dx,mouse\u-dy)+5;//添加了预防性缓冲区。
    变量willBeOutOfBounds:Boolean=(
    _xmouse-速度<0 | |
    _X移动+速度>舞台宽度||
    _ymouse-速度<0||
    _Y使用+速度>舞台高度
    );
    如果(将超出边界){
    _显示。α=10;
    }否则{
    _显示=
    
    // 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);
    }