Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.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
Actionscript 3 模拟鼠标事件AS3_Actionscript 3_Events - Fatal编程技术网

Actionscript 3 模拟鼠标事件AS3

Actionscript 3 模拟鼠标事件AS3,actionscript-3,events,Actionscript 3,Events,我有一个项目,涉及在每次更新时轮询硬件交换机,并将其状态转换为自定义事件: ToggleSwitchEvent.BackWardButtonDown ToggleSwitchEvent.BackWardButtonUp ToggleSwitchEvent.Click etc .... 硬件开关的作用类似于两个按钮的鼠标。因此,我希望能够将定制的ToggleSwitchEvent事件“注入”到显示列表中,并让它像MouseeEvent一样工作,从单击所相交的InteractionObject冒泡

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

ToggleSwitchEvent.BackWardButtonDown
ToggleSwitchEvent.BackWardButtonUp
ToggleSwitchEvent.Click
etc ....
硬件开关的作用类似于两个按钮的鼠标。因此,我希望能够将定制的ToggleSwitchEvent事件“注入”到显示列表中,并让它像MouseeEvent一样工作,从单击所相交的InteractionObject冒泡出来。这将允许我将ventListener添加到显示列表中,就像我使用MouseEvents一样

据我所知,问题在于我需要一个对DisplayList的叶节点的引用来手动插入我的ToggleSwitchEvent。我想说的是,在屏幕上的某个位置单击了开关,并让DisplayList计算出单击与什么InteractionObject相交,并发送我的ToggleSwitchEvent而不是MouseeEvent


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

我不太明白。。。您希望自定义事件冒泡,还是自己触发
MouseEvent
s

  • 如果其
    bubbles
    属性设置为true,则任何事件都将按预期冒泡
  • 如果手动分派鼠标事件,它们也会冒泡,甚至它们的
    stageX
    stageY
    也会被适当地计算出来
  • 那么祝你好运……;)


    编辑:

    好的,那么显示列表将不会真正为您处理这些。。。事实上,你有两个选择。。。从舞台开始,一直保持在鼠标下,通过舞台。。。或者,从鼠标下的对象开始,获取其在树中的路径,然后在其父链中找到右侧的
    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);
    }
    
    你可能真的想在事件中注入正确的坐标,但我想你会发现…;)



    冒泡不是问题,更重要的是,我不想弄清楚ToggleButtonEvent应该从哪个InteractionObject发出。我想如果DisplayList可以为meThanks back2Dos做到这一点,这就是我认为我必须要做的。谢谢你的详细回复。