【问题标题】:Emulating Mouse Event AS3模拟鼠标事件 AS3
【发布时间】:2009-10-13 08:56:20
【问题描述】:

我有一个项目,涉及在每次更新时轮询硬件开关并将其状态转换为自定义事件:

ToggleSwitchEvent.BackWardButtonDown
ToggleSwitchEvent.BackWardButtonUp
ToggleSwitchEvent.Click
etc ....

硬件开关的作用类似于两键鼠标。因此,我希望能够将自定义 ToggleSwitchEvent 事件“注入”到显示列表中,并让它像 MouseEvent 一样,从与单击相交的 InteractionObject 冒泡。这将允许我像使用 MouseEvents 一样将EventListener 添加到显示列表中。

据我了解,麻烦在于我需要引用 DisplayList 的叶节点才能手动插入我的 ToggleSwitchEvent。我想说在屏幕上的某个位置单击了开关,并让 DisplayList 找出单击相交的 InteractionObject 并调度我的 ToggleSwitchEvent 而不是 MouseEvent。

是否有一种方法可以在 AS3 中模拟 MouseEvent 但使用自定义事件?

【问题讨论】:

    标签: actionscript-3 events


    【解决方案1】:

    我不太明白...您想要自定义事件冒泡,还是自行触发MouseEvents?

    1. 如果 bubbles 属性设置为 true,任何事件都会按预期冒泡...
    2. 如果你手动分派鼠标事件,它们也会冒泡,甚至它们的stageXstageY 也计算得当...

    那么祝你好运...... ;)


    编辑:

    好的,显示列表不会真正为您解决这个问题...实际上,您有两个选择...从舞台开始,然后通过它,始终保持在鼠标下方...或者,从鼠标下的对象开始,在树中获取它的路径,并在其父链中找到正确的InteractiveObject ...后者可以使用DisplayObjectContainer::getObjectsUnderPoint 完成...这是代码...

    public static function dispatchEventUnderMouse(event:Event, stage:Stage, point:Point):Boolean {
        //return if stage is disabled
        if (!stage.mouseEnabled) return false;
        //find the topmost object
        var cur:DisplayObject = stage.getObjectsUnderPoint(point).pop();
        if (cur == null) cur = stage;
        //build the path
        var path:Array = [];
        while (cur != null) {
            path.push(cur);
            cur = cur.parent;
        }
        //traverse the path from the root to find the right InteractiveObject
        while (path.length > 0) {
            cur = path.pop();
            if (cur is InteractiveObject) {
                if (!(cur as InteractiveObject).mouseEnabled) {
                    cur = cur.parent;
                    break;
                }
                if (cur is DisplayObjectContainer) {
                    if (!(cur as DisplayObjectContainer).mouseChildren) break;
                }
            }
            else {
                cur = cur.parent;
                break;                  
            }
        }
        return cur.dispatchEvent(event);
    }
    

    您实际上可能想将正确的坐标注入事件中,但我想您会想出来的... ;)


    【讨论】:

    • 冒泡不是问题,更重要的是,我不想弄清楚应该从哪个 InteractionObject 分派 ToggleButtonEvent。如果 DisplayList 可以为我做到这一点,我希望它
    • 感谢 back2Dos,这是我认为我必须做的。感谢您的详细回复。
    猜你喜欢
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多