1

カスタム イベント (リスナー) についてかなり長い間調べてきましたが、作成に成功したことはありません。非常に多くの異なるメソッドがあり、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 がほぼすべてに適用できるため、可能なはずです。主な問題は、イベントを実行してムービークリップやスプライトに適用できるようにするための要件をどこに設定すればよいかわからないことです。

4

2 に答える 2

1

あなたは実際にはほとんどそこにいます.最後の部分だけですが、これはカスタムイベントの使用方法に関する厳密な混乱というよりも、OOP関連の問題ではないでしょうか?

通常、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
    }
}
于 2010-12-30T22:20:14.713 に答える
0

私は強盗ペナーの信号を使用しています。とても使いやすいです。

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

于 2010-12-30T21:49:06.530 に答える