ActionScript 3.0 - 替代事件侦听器声明?

时间:2010-09-08 11:44:48

标签: flash actionscript-3 actionscript event-listener

我有一些文件内的actionscript 3.0代码。此代码控制着舞台上的许多元素。这些元素每个都有一个Over,out和Click事件。

我目前定义这些事件监听器:

mc_hotspot.addEventListener(MouseEvent.MOUSE_OVER, lift);
mc_hotspot.addEventListener(MouseEvent.MOUSE_OUT, setDown);
mc_hotspot.addEventListener(MouseEvent.CLICK, select);;
mc_spinspot.addEventListener(MouseEvent.MOUSE_OVER, spinspotOver);
mc_spinspot.addEventListener(MouseEvent.MOUSE_OUT, spinspotOut);
mc_spinspot.addEventListener(MouseEvent.CLICK, spinClick);
mc_spinspot2.addEventListener(MouseEvent.MOUSE_OVER, spinspot2Over);
mc_spinspot2.addEventListener(MouseEvent.MOUSE_OUT, spinspot2Out);
mc_spinspot2.addEventListener(MouseEvent.CLICK, spin2Click);
btn_back.addEventListener(MouseEvent.MOUSE_OVER, backOver);
btn_back.addEventListener(MouseEvent.MOUSE_OUT, backOut);
btn_back.addEventListener(MouseEvent.CLICK, backClick);

正如您所看到的,这是为这些元素定义事件的一种非常漫长而复杂的方式,并且还有一个事件触发函数可以与每个元素一起使用。

我将扩展该项目,以便尽快添加三个旋转点和一个或两个以上的按钮,我只是想知道是否有任何其他方式来定义和满足这些事件。

对于spinspots,所有的over和out事件都是相同的,但每个事件都有自己的重复函数和监听器。

提前致谢

2 个答案:

答案 0 :(得分:2)

你可以建立一个像:

这样的函数
function addButtonEvents(mc:*,over:Function,out:Function,click:Function = null) {
    mc.addEventListener(MouseEvent.MOUSE_OVER,over,false,0,true);
    mc.addEventListener(MouseEvent.MOUSE_OUT,out,false,0,true);

    //if we have an optional click event
    if (click != null)
         mc.addEventListener(MouseEvent.CLICK,click,false,0,true);

}

然后你可以在一次通话中添加所有三个事件,即

addButtonEvents(mc_spinspot, spinspotOver, spinspotOut, spinClick);

答案 1 :(得分:1)

最好的方法是通过封装,ususaly过度和退出状态只影响正在过量或出的项目,因此你可以创建一个spinspot类并在其中制作过多的处理程序,并且只担心单击处理程序父母班。

否则你可以有一个over,out和click处理程序,然后按事件的目标(if (ev.target == mc_spinspot))等对行动进行排序。这样做你也可以有一个assignEvents函数,它给出了over,out和click响应传递的变量

private function addEvents(obj:Sprite){
    obj.addEventListener(MouseEvent.MOUSE_OVER, overHandler);
    obj.addEventListener(MouseEvent.MOUSE_OUT, outHandler);
    obj.addEventListener(MouseEvent.CLICK, clickHandler);

}
addEvents(mc_spinspot);