как события отправляются в as3? - PullRequest
2 голосов
/ 25 июля 2011

У меня проблемы с пониманием, как отправлять события и где их отлавливать. в настоящее время у меня есть класс документа waterMain и еще один класс под названием gunner. мой waterMain создает объект наводчика и добавляет его как ребенка, в моем наводчике есть функция firebullet, в которой я посылаю

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 ]

1 голос
/ 25 июля 2011

Просто чтобы добавить к предыдущему ответу @Neoraptor, вы также можете обработать это, отправив событие с "bubbles = True".

Создание пузыря означает получение этого события и его передачу от диспетчера по всей иерархии отображения вплоть до класса документа. Пока событие не установлено как отменяемое (или оно есть, и ничто на самом деле не отменяет его), ваше событие в конечном итоге достигнет класса документа.

Другое решение, предоставленное @Neoraptor, является правильным, хотя следует отметить, что это не единственный способ. Иногда вы хотите использовать пузыри = Истинный способ, особенно когда ваше событие отправляется намного дальше вниз по списку отображения. Например, если ваши маркеры создаются динамически, и они отправляют событие, о котором должен знать класс документа, тогда гораздо проще просто пустить событие от диспетчера, чем пытаться нацелить конкретные экземпляры маркера создано.

1 голос
/ 25 июля 2011

Вам нужно добавить событие в класс наводчиков примерно так:

gunner.addEventListener("bulletFired", bulletFiredHandler);

Класс наводчика уже является подклассом EventDispatcher, если я правильно прочитал ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...