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 当wmode=不透明或wmode=透明时如何检测Event.MOUSE_离开_Flash_Events_Wmode_Mouseleave - Fatal编程技术网

Flash 当wmode=不透明或wmode=透明时如何检测Event.MOUSE_离开

Flash 当wmode=不透明或wmode=透明时如何检测Event.MOUSE_离开,flash,events,wmode,mouseleave,Flash,Events,Wmode,Mouseleave,我有一个定制的拖动事件,对大多数事情都非常有效: stage.addEventListener( MouseEvent.MOUSE_DOWN, beginDrag ); function beginDrag( e:MouseEvent ) { stage.addEventListener( MouseEvent.MOUSE_MOVE, drag ); stage.addEventListener( MouseEvent.MOUSE_UP, endDrag ); stage.addE

我有一个定制的拖动事件,对大多数事情都非常有效:

stage.addEventListener( MouseEvent.MOUSE_DOWN, beginDrag );

function beginDrag( e:MouseEvent )
{
  stage.addEventListener( MouseEvent.MOUSE_MOVE, drag );
  stage.addEventListener( MouseEvent.MOUSE_UP, endDrag );
  stage.addEventListener( MouseEvent.DEACTIVATE, endDrag );
  stage.addEventListener( Event.MOUSE_LEAVE, endDrag );
  stage.addEventListener( Event.REMOVED_FROM_STAGE, stageEndDrag );

  //trigger beginDrag event
}
function drag( e:MouseEvent )
{
  //trigger drag event
}
function endDrag( e:Event )
{
  stage.removeEventListener( MouseEvent.MOUSE_MOVE, drag );
  stage.removeEventListener( MouseEvent.MOUSE_UP, endDrag );
  stage.removeEventListener( MouseEvent.DEACTIVATE, endDrag );
  stage.removeEventListener( Event.MOUSE_LEAVE, endDrag );
  stage.removeEventListener( Event.REMOVED_FROM_STAGE, stageEndDrag );

  //trigger endDrag event
}
问题是,当我将此代码与
wmode=transparent
wmode=opaque
一起使用时,当
MOUSE\u-UP
事件在舞台外发生时,不会检测到
MOUSE\u-LEAVE
事件

wmode
透明的
不透明的
时,是否有方法检测
鼠标离开
事件


有没有办法检测到
wmode
设置为
透明的
不透明的
,以便可以实施变通办法?

默认情况下,鼠标离开不是可靠的事件。有时它会被解雇,有时不会。你可以在网上浏览

不过,您可以做一件事,那就是手动检查鼠标是否在舞台上方:

var out : Boolean = false;

stage.addEventListener (Event.ENTER_FRAME, checkMouse);

function checkMouse (ev:Event) : void {
    if (
        stage.mouseX < 0 || 
        stage.mouseX > stage.stageWidth || 
        stage.mouseY < 0 || 
        stage.mouseY > stage.stageHeight) 
    {
        if (!out) 
        {
            out = true;
            stage.dispatchEvent (new Event(Event.MOUSE_LEAVE));
        }
    } 
    else if (out) 
    {
        out = false;
        stage.dispatchEvent (new Event("mouseEnter"));
    }
}
var out:Boolean=false;
stage.addEventListener(Event.ENTER_FRAME,选中鼠标);
功能检查鼠标(ev:事件):无效{
如果(
stage.mouseX<0 | |
stage.mouseX>stage.stageWidth|
stage.mouseY<0 | |
stage.mouseY>stage.stageHeight)
{
如果(!out)
{
out=真;
stage.dispatchEvent(新事件(Event.MOUSE_-LEAVE));
}
} 
否则,如果(退出)
{
out=假;
阶段调度事件(新事件(“鼠标事件”);
}
}
当光标位于舞台区域外时,这将发送MOUSE_LEAVE事件,当光标重新进入舞台区域时,将发送自定义“mouseEnter”事件。然后,您可以向stage添加事件侦听器以可靠地响应这些事件,但您必须记住,一次可能会触发多个鼠标(如果同时执行自定义和内置的鼠标)。您可以签出
变量
,以防止事件处理程序重复执行


另外,我不确定这是否适用于所有stage.align和stage.scaleMode选项。它应该适用于StageScaleMode.NO_SCALE和StageAlign.TOP_LEFT的组合,对于任何其他设置,您必须检查并可能找到解决方法。

@weltraumpirat在此之前,我从未发现
鼠标离开
事件不可靠。许多人都不清楚何时触发
鼠标离开
事件,就像用户拖动鼠标时鼠标离开舞台后发生
鼠标向上
事件一样。我发现在
wmode=transparent/opaque
中,当鼠标离开后台时,鼠标事件不会被处理,因此这种方法不太可能起作用(尽管我还是会尝试一下)。如果您遇到任何问题,您可以使用ENTER\u FRAME侦听器。如果可以的话,我更喜欢使用MOUSE\u MOVE,因为它不会经常被触发。@weltraumpirat,当鼠标离开舞台时,没有一个鼠标事件被触发(甚至是
MOUSE\u OUT
事件)。如果释放或按下鼠标,新的鼠标事件也不会为
buttonDown
注册正确的值。我看不出一个
ENTER\u FRAME
监听器有什么帮助。我的脚本测试鼠标是否在舞台边界内。如果鼠标在舞台外,则手动触发鼠标离开事件,无论玩家是否触发内置事件。我测试鼠标移动,但如果不起作用,即使玩家在后台,回车框也会继续测试。@weltraumpirat,问题是当鼠标离开舞台(wmode=transparent)时没有触发鼠标事件,回车框将获得不准确的鼠标位置。