【问题标题】:as3 - dispatch mouse event from external classas3 - 从外部类调度鼠标事件
【发布时间】:2014-03-11 12:55:33
【问题描述】:

我在正确理解如何调度事件并在另一个类中捕获它们时遇到问题。

在这种情况下,我试图模拟从“clickM”类发送的鼠标点击。

在舞台上,我有 2 个要测试的影片剪辑、一个自定义光标和用于捕获点击事件的侦听器。

点击M:

package {

import flash.display.MovieClip;
import flash.utils.Timer;
import flash.events.TimerEvent;
 import flash.events.Event; //dispatcher
import flash.events.MouseEvent;// mouse event



public class clickM extends MovieClip {
    private var delay: uint = 3000;
    private var repeat: uint = 0; //se va por todo el tiempo
    private var myTimer: Timer = new Timer(delay, repeat);


    public function clickM() {
        myTimer.start();
        myTimer.addEventListener(TimerEvent.TIMER, timerHandler);
    }

    private function timerHandler(e: TimerEvent): void {
        //repeat--;
        //statusTextField.text = ((delay * repeat) / 1000) + " seconds left.";
        trace ( "simulate click...");
        //dispatchEvent(new MouseEvent(MouseEvent.CLICK));
        this.dispatchEvent(new MouseEvent(MouseEvent.CLICK, true, false));
    }
}

}

Stage code、rojo 和 morado 是电影剪辑:

import flash.events.MouseEvent;

stage.addEventListener(Event.ENTER_FRAME, myFunction);

var mano: clickM = new clickM();
mano.name = "mano";

addChild (mano);

morado.addEventListener(MouseEvent.CLICK, cl);
rojo.addEventListener(MouseEvent.CLICK, cl);

stage.addEventListener(MouseEvent.CLICK, cl);

function myFunction(event: Event) {
mano.x = mouseX;
mano.y = mouseY;
}

function cl(e: MouseEvent) {
trace("click over " + e.target.name);
}

如果我点击 morado 或 rojo,没有问题 - 我可以得到他们的名字。如果我只是让代码运行,我无法得到他们的名字,我只会得到“mano”,这是我正在使用的自定义光标。

如何获得所需的行为?

问候。

【问题讨论】:

    标签: actionscript-3 message dispatch


    【解决方案1】:

    clickM 构造函数中添加mouseEnabled=false;。这应该使 Flash 在事件调度阶段忽略您的mano,因此如果有的话,底层对象应该是主要目标,否则目标将是舞台。如果您的自定义光标包含更多影片剪辑,您还应该添加mouseChildren=false;

    public function clickM() {
        mouseEnabled=false;
        // possibly add this too
        mouseChildren=false;
        myTimer.start();
        myTimer.addEventListener(TimerEvent.TIMER, timerHandler);
    }
    

    【讨论】:

    • 不幸的是它没有工作,由于某种原因它仍然将 mano 注册为点击的对象,实际上我什至在我的主文档代码中尝试了这些片段,它仍然将 mano 注册为点击的对象跨度>
    • 嗯,很奇怪。可能尝试发送 MouseEvent.MOUSE_DOWN 并跟随 MouseEvent.MOUSE_UP 代替?这些想要的坐标,你可以通过调用this.localToGlobal(new Point())获得。
    • 感谢@Vesper,肯定还有其他事情失败了。我通过避免使用外部类来简化(更多)代码,尝试使用您的建议仍然遇到问题以使其正常工作。当我直接单击时它会触发,但如果我只是将鼠标悬停在我的电影剪辑上(返回 root1)则不会。
    猜你喜欢
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2013-08-30
    • 2014-12-14
    相关资源
    最近更新 更多