【问题标题】:AS3: Trigger artificial MouseEventAS3:触发人工 MouseEvent
【发布时间】:2010-10-12 21:14:25
【问题描述】:

我正在使用来自http://www.tuio.org/?flash 的 tuio as3 参考实现转换一个简单的 Flash 'drumset' 应用程序以支持 TUIO 多点触控

作为一个快速而肮脏的解决方案,我试图触发一个人为的 MouseEvent,但似乎什么也没发生 :( 我的错误在哪里?这甚至可能吗?已经谢谢了!

代码如下:

package {

    import org.tuio.tuio.*;
    import org.tuio.osc.*;
    import flash.display.*;
    import flash.ui.*;
    import flash.events.*;
    import flash.media.*;

    public class drumsets2 extends MovieClip implements ITuioListener {

        private var tuio:TuioClient;

        var soundS01:Sound = new S01();
        // more sounds...

        public function drumsets2(){
            this.tuio = new TuioClient(new LCConnector());
            this.tuio.addListener(this);

            drum1.hitS01.addEventListener(MouseEvent.MOUSE_DOWN, playS01);
            // more event listeners for sounds...
        }


        // this is where the 'magic' is supposed to happen

        public function addTuioCursor(tuioCursor:TuioCursor):void {
            stage.dispatchEvent(
                new MouseEvent( MouseEvent.MOUSE_DOWN, true, false, tuioCursor.x*stage.stageWidth, tuioCursor.y*stage.stageHeight )
            );
        }


        function playS01(e:MouseEvent):void
        {
            var scS01:SoundChannel = soundS01.play();
        }

        // more play functions...
    }
}

【问题讨论】:

    标签: actionscript-3 mouseevent dispatchevent


    【解决方案1】:

    您的事件侦听器不在舞台上,它在drum1.hitS01 上,我假设它是一个DisplayObject,因为它没有在您附加的代码中的任何地方定义。您需要做的就是在该对象上调度事件,而不是在舞台上:

    drum1.hitS01.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_DOWN, true, false, tuioCursor.x * stage.stageWidth, tuioCursor.y * stage.stageHeight));
    

    【讨论】:

    • +1。虽然 localX 和 localY 的代码没有任何意义。我知道您刚刚从 OP 示例中粘贴了该部分,但我认为这值得注意。也许使用drum1.hitS01.mouseXdrum1.hitS01.mouseY 更有意义;或者只是保留默认值,因为真的没有点击,所以 x 和 y 坐标在这里没有任何实际意义。
    • 谢谢!但我想要做的只是将触摸事件转发到整个舞台,所以我不必检查触摸事件是否在 hihat、basedrum 内......有没有办法完成这种行为?
    • 那么如果你想将事件转发给它,你需要在舞台上安装一个事件监听器。另外,胡安说得好,我认为这对他很重要,所以我就不管了。
    【解决方案2】:

    如果我正确理解您的问题,您似乎只是想从代码中调用 playS01 函数?如果是这样,您可以在班上的任何地方致电playS01(null)。 如果它不是来自鼠标事件,则需要将其传递为 null,这样它就不会因为没有收到预期的参数而困扰您。

    【讨论】:

    • 问题是有 很多 完美运行的鼠标事件,我不想弄乱所有这些代码。我认为也许可以人为地触发现有事件。我也需要在其他项目中这样做,所以这将是一个很酷的解决方案,我可以用于所有项目......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 2014-03-16
    • 1970-01-01
    相关资源
    最近更新 更多