Место отправки пользовательских событий - PullRequest
1 голос
/ 30 декабря 2010

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

package{

 import flash.events.Event;
 public class CustomEvent extends Event{

 public static const TEST:String = 'test'; //what exac is the purpose of the value in the string?
 public var data:Object;

 public function CustomEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false, data:Object = null):void
 {
 this.data = data;
 super();
 }
 }
}

Насколько я знаю, должен быть создан специальный класс, в котором вы устанавливаете требования для события, которое должно быть отправлено:

package 
{
    import flash.display.MovieClip;

    public class TestClass extends MovieClip 
    {

        public function TestClass():void {


            if (ConditionForHoldToComplete == true) {

                dispatchEvent(new Event(CustomEvent.TEST));
            }

        }

    }

}

Я не уверен, что это правильно, но должно быть что-то вроде этого.

Теперь то, что я хочу, это что-то вроде мышиного события, которое можно применить кцель и не требует определенного класса.

Это должно работать примерно так:

package com.op_pad._events{
import flash.events.MouseEvent;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.events.EventDispatcher;
import flash.events.Event;

public class HoldEvent extends Event
     {
          public static const HOLD_COMPLETE:String = "hold completed";
          var timer:Timer;

          public function SpriteEvent(type:String, bubbles:Boolean=true, cancelable:Boolean=false)
          {
                super( type, bubbles, cancelable );

                timer = new Timer(1000, 1);
                //somehow find the target where is event is placed upon -> target.addEventlistener
                target.addEventListener(MouseEvent.MOUSE_DOWN, startTimer);
                target.addEventListener(MouseEvent.MOUSE_UP, stopTimer);
          }

          public override function clone():Event
          {
                return new SpriteEvent(type, bubbles, cancelable);
          }
          public override function toString():String
          {
                return formatToString("MovieEvent", "type", "bubbles", "cancelable", "eventPhase");
          }



            //////////////////////////////////
            /////   c o n d i t i o n s  /////
            //////////////////////////////////

            private function startTimer(e:MouseEvent):void 
          {
              timer.start();
              timer.addEventListener(TimerEvent.TIMER_COMPLETE, complete);
          }

          private function stopTimer(e:MouseEvent):void 
          {
              timer.stop()
          }

          public function complete(e:TimerEvent):void {

              dispatchEvent(new HoldEvent(HoldEvent.HOLD_COMPLETE));
          }
     }

}

Это, очевидно, не сработает, но должнодать вам представление о том, чего я хочу достичь.Это должно быть возможно, потому что mouseevent может применяться ко всему. Основная проблема заключается в том, что я не знаю, где мне следует устанавливать требования к событию, которое нужно выполнить, чтобы иметь возможность применять его к видеоклипам и спрайтам.

Ответы [ 2 ]

1 голос
/ 31 декабря 2010

Вы почти на самом деле, только для последней части, разве это не было бы скорее проблемой, связанной с ООП, чем просто путаницей в способе использования пользовательских событий?

Обычно события в AS3 являются объектами-значениями, единственной обязанностью которых является передача информации от диспетчера событий слушателю (-ям). Диспетчер отправляет событие каждый раз, когда достигается определенный импульс, и слушатели могут реагировать или не реагировать, когда это происходит.

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

Для вашего самого примера, вы могли бы создать обработчик, проверяющий, была ли нажата мышь?

Ниже приведен только псевдокод, и существует множество других способов получить тот же результат:

public class MouseDownHandler
{
    // ...

    public function( target:Sprite ) {
         this.target = target;
         start();
    }

    public function start():void{
        // Listen for the target's mouseUp event
    }

    public function dispose():void{
        // Stop listeners and eventually the timer
    }

    private function onMouseDown(e:MouseEvent):void{
       // Start timer + listening for the stage's mouse up event (target.stage)
    }

    private function onMouseUp(e:Event):void{
        // Cancel timer
    }

    private function onTimerComplete(e:TimerEvent):void {
        dispatchEvent(new HoldEvent(HoldEvent.HOLD_COMPLETE));
    }
}

Что можно использовать, например, таким образом:

var mc:MovieClip = new MovieClip(); ...
var mouseHandler:MouseDownHandler = new MouseDownHandler(mc);
mouseHandler.addEventListener(HoldEvent.HOLD_COMPLETE, onMcHoldComplete);

... или так:

public class TestMovieClip extends MovieClip
{
    private var mouseHandler:MouseDownHandler;

    public function TestMovieClip() {
        mouseHandler = new MouseDownHandler(this);
        mouseHandler.addEventListener(HoldEvent.HOLD_COMPLETE, onMouseHoldComplete);
    }

    private function onMouseHoldComplete(e:HoldEvent):void {
        // Do something
    }
}
0 голосов
/ 31 декабря 2010

Я просто использую сигналы грабителей.Очень прост в использовании.

http://github.com/robertpenner/as3-signals

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