as3:全屏模式下的mouse_move事件,鼠标缓慢移动时的mouseLock事件



使用flash和AS3,似乎是鼠标移动事件在全屏模式和mouseLock激活的问题,我不明白如何解决。

当我进入具有Stage.mouseLock属性的全屏模式时,enabled和我用鼠标进行非常缓慢的移动,确定鼠标位置的两个属性(MouseEvent.movementXMouseEvent.movementY)返回零(0)。

事件event.toString()返回的打印:

 [MouseEvent type="mouseMove" bubbles=true cancelable=false eventPhase=2 localX=0 localY=0  stageX=0 stageY=0 relatedObject=null ctrlKey=false altKey=false shiftKey=false buttonDown=false delta=0]

"鼠标可以移动到我想要的任何距离,如果鼠标移动非常慢,则x和y总是返回0,因此无法确定鼠标的移动。"(*)经过更好的测试,我在下面的"注释"中添加了对这句话的更正。

这很奇怪,因为当鼠标移动(也伴随着缓慢的移动)时,事件被正确触发,但是返回的移动是0。似乎运动是<1,但只报告整数移动,所以值总是返回0。

我也试过改变操作系统(Mac OSX)的鼠标设置,但没有成功。

如果你想我可以给你的示例代码进入全屏模式和激活阶段。mouseLock属性。

谢谢你的建议。


注意:

经过更好的测试,我发现flash播放器(我的flash播放器版本是11,7,700,203)有一个看起来像bug的行为:如果当前鼠标移动(movementXmovementY)等于之前的移动,那么flash返回movementX=0movementY=0。下一次鼠标移动将是正确的值,因为它将不同于零。

正因为如此,如果玩家总是朝着同一个方向不断移动(游戏邦注:非常缓慢的移动更容易重现),那么玩家每触发两次事件便会显示"零值"。

在此链接中,您可以测试一个工作示例(比自己编写示例更快)。

如果我发现的行为是正确的,那么很容易修改代码来纠正这个问题,无论如何我认为它仍然是一个bug。我要向adobe报告。

在另一个链接(感谢@nemostein)有另一个工作示例。

我试着更好地解释我:如果你移动光标非常慢(即向正确的方向),当你移动光标足够时,你会收到输出Movement( X:1 Y:0 )。如果您再次向右移动光标,您将收到输出Movement( X:0 Y:0 )。如果你重复微运动,你会收到运动报告总是这样的模式:(x:1,y:0),(x:0,y:0),(x:1,y:0),(x:0,y:0)...而不是(x:1,y:0),(x:1,y:0),(x:1,y:0)...

我认为接收像(x:0,y:0)这样的运动是错误的,在我看来,每次当你使运动等于(x和y)到你以前的运动时,都会返回这个值。

没有错误,但是MouseEvent.movementX/Y(以及MouseEvent.localX/YMouseEvent.stageX/Y)有点误导…
虽然它们是Number s,而不是int s,但没有"半像素"这样的东西,所以它们总是报告int值。

您正在寻找的精度(例如:movementX == 0.75)无法实现。

我无法重现你在注释中描述的行为("当前鼠标移动等于前一个"),这里是Stage.mouseLock = trueStage.displayState = StageDisplayState.FULL_SCREEN的一个工作示例。

请注意,如果您移动光标非常慢,您最终将收到一个MouseEvent.movementX/Y == 1(当您移动光标足够时)。

我在adobe论坛问过,他们让我打开一个bug。链接如下:https://bugbase.adobe.com/index.cfm?event=bug&id=3575123

最新更新