如何在as3中发送事件?

时间:2011-07-25 03:34:28

标签: flash actionscript-3

我无法理解如何发送事件以及捕获它们的位置。目前我有一个文件类waterMain,另一个类叫gunner。我的waterMain创造了一个枪手的对象并将其添加为小孩,在我的炮手中有一个功能火焰弹,在其中我发送一个

  

dispatchEvent(new Event(“bulletFired”));

从我的waterMain班上我做了一个

    addEventListener("bulletFired", bulletFiredHandler); 
    private function bulletFiredHandler(e:Event):void       
{           
hudMenu.reduceBullet();         
}

hudMenu是waterMain文档类的变量,但似乎没有任何事情发生。 waterMain班级没有抓住派遣的事件吗?

package  
{
    import flash.display.MovieClip;
    import flash.display.Stage;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Point;
    /**
     * ...
     * @author ...
     */
    public class Gunner extends MovieClip
    {
        private var _stageRef:Stage;
        public var barrel:MovieClip;
        public var point:MovieClip;
        public var _hudMenu:HUD;

        public function Gunner(stageRef:Stage) 
        {   

            //trace("current rotation" + barrel.rotation);
            //barrel.rotation = -90;
            _stageRef = stageRef;
            addEventListener(Event.ENTER_FRAME, rotateTurret);
            _stageRef.addEventListener(MouseEvent.MOUSE_DOWN, fireBullet);


        private function rotateTurret(evt:Event):void 
        {
            //calculations, distance, angle etc
            var a:Number = _stageRef.mouseX - x;
            var b:Number = _stageRef.mouseY - y;
            var angRad:Number = Math.atan2(b, a);
            var angDeg:Number = (angRad * 180 / Math.PI);
            //trace(angDeg );

            barrel.rotation = (angDeg);
        }
        private function fireBullet(mouseEvt:MouseEvent):void
        {

            dispatchEvent(new Event("bulletFired"));
            _stageRef.addChildAt(new Bullet(_stageRef,x, y , new Point(mouseEvt.stageX, mouseEvt.stageY), _koiArray, _lionArray), 1);
            _stageRef.addChild(_stageRef.addChild(this));
        }
    }

}

2 个答案:

答案 0 :(得分:1)

您需要将此事件添加到炮手类,如下所示:

gunner.addEventListener("bulletFired", bulletFiredHandler);

如果我正确地阅读了你的问题,枪手类已经是一个EventDispatcher子类。

答案 1 :(得分:1)

只需添加@Neoraptor的上一个答案,您也可以通过使用“bubbles = True”调度事件来处理此问题。

冒泡事件意味着接受该事件并将其从调度程序,整个显示层次结构一直传递到文档类。只要事件未设置为可取消(或者它实际上没有取消它),那么您的事件最终将到达文档类。

@ Neoraptor提供的另一个解决方案是正确的,但应该指出的是,这不是唯一的方法。有时您希望使用bubbles = True方式,尤其是当您的事件在显示列表中向下发送得更远时。例如,如果您的项目符号是动态创建的,并且它们会调度文档类需要了解的事件,那么让事件从调度程序中冒泡比尝试定位子项的特定实例要容易得多。创建