2

我在尝试在 ActionScript 3 中重新分配鼠标事件时遇到了问题,我对此感到有些怀疑。我已经把它缩小到MouseEvent.clone()出现的方法,好吧,完全坏了。以下事件处理程序:

    private function handleMouseMove( evt : MouseEvent ) : void
    {
        trace("mousemove", evt.stageX, evt.stageY);
        var newEvt : MouseEvent = evt.clone() as MouseEvent;
        trace("mousemoveclone", newEvt.stageX, newEvt.stageY);
    } 

产生以下输出,无穷无尽:

mousemove 167 206 
mousemoveclone 0 0

这与我将 MouseEvent 重新分派到的代码相匹配,因此我假设克隆函数损坏。

这与链接文档表明应该发生的内容直接矛盾,除非我遗漏了什么。对于可能导致这种行为的我做了(或没有做)的事情,我完全不知所措。AS3 的家伙真的忘记阅读他们自己的文档了Event.clone()吗?

我可以通过针对我的特定用例使用函数对象来解决这个问题,但我不希望这样做。有任何想法吗?

编辑: localX 和 localY 成员似乎被正确克隆了,这让我对这里发生的事情感到更加茫然。

4

3 回答 3

3

那是一个已知的错误。您可以在此处查看错误报告:http: //bugs.adobe.com/jira/browse/FP-343

其他一切都应该被克隆。您始终可以手动分配 stageX 和 stageY 直到修复错误。

于 2009-04-08T00:21:24.570 回答
2

我意识到这个线程已经休眠了 7 个月,但只是为了更新一点——它在 FP10 和 Flex4 中仍然有效。如果您重新调度事件,也会发生这种情况。IE:

private function mouseListener( e:MouseEvent ):void
{
    dispatchEvent( e );
}

dispatchEvent() 调用似乎相当于 clone(),所以 stageX 和 stageY 设置为 0

于 2009-11-27T16:50:02.377 回答
0

这是一个相当古老的问题,但这是我在谷歌上搜索解决方案时提出的问题,而这里的内容还不够全面。

这没有被“修复”的原因是因为它按预期工作。stageX 和 stageY 值是在您调用 getter 时计算的,使用事件的目标进行 localToGlobal 转换。这是必要的,这样即使目标对象在事件被调度后已经改变了位置、比例或旋转,数字也能保持正确。

如果您确实需要使用正确的 stageX 和 stageY 值重新调度 MouseEvent,您的两个选择是:

  1. 创建覆盖 stageX 和 stageY getter 的 MouseEvent 的自定义子类。您可以存储原始目标并自己进行 localToGlobal 计算,也可以使用克隆原始事件时的值存储 stageX 和 stageY 的静态值。

  2. 扩展 Sprite 并将您的调度程序添加到舞台,以便股票 MouseEvent 可以正常工作。

于 2013-03-10T23:44:19.140 回答