代码之家  ›  专栏  ›  技术社区  ›  Not Sure

actionScript mouseEvent.clone()是否显示为已损坏?

  •  2
  • Not Sure  · 技术社区  · 15 年前

    我在试图 redispatch 《行动脚本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成员被正确地克隆了,这让我对这里发生的事情更加困惑。

    3 回复  |  直到 11 年前
        1
  •  3
  •   Alex Jillard    15 年前

    这是一个已知的错误。您可以在这里看到bug报告: http://bugs.adobe.com/jira/browse/FP-343

    其他的一切都应该被克隆。您总是可以手动分配阶段x和阶段y,直到错误被修复。

        2
  •  2
  •   Damian    15 年前

    我意识到这个线程已经休眠了7个月,但只是稍微更新一下而已——它在fp10和flex4中仍然处于活动状态。如果您重新传播事件,也会发生这种情况。即。:

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

    DispatchEvent()调用似乎与clone()等效,因此Stagex和Stagey设置为0。

        3
  •  0
  •   Andrew Traviss    11 年前

    这是一个很古老的问题,但我在谷歌上搜索解决方案时,发现了一些问题,而这里的问题还不够全面。

    之所以没有“修复”,是因为它按预期工作。当调用getter时,使用事件的目标执行localtoglobal转换,计算stagex和stagey值。这是必要的,这样即使目标对象在调度事件后更改了位置、比例或旋转,数字也会保持正确。

    如果您真的需要使用正确的Stagex和Stagey值重新喷洒鼠标事件,您的两个选项是:

    1. 创建mouseEvent的自定义子类,该子类覆盖Stagex和Stagey getter。您可以自己存储原始目标并进行本地全局计算,也可以使用克隆原始事件时的值存储Stagex和Stagey的静态值。

    2. 扩展sprite并将调度员添加到舞台上,以便stock mousevent可以正常工作。