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를 모든 것에 적용 할 수 있기 때문입니다. 주요 문제는 영화 클립과 스프라이트에 적용 할 수 있도록 실행해야 할 이벤트에 대한 요구 사항을 어디에 설정해야하는지 모르는 것입니다.

+1

귀하의 예는 종류의 혼란이다. 시도하고 당신이 정말로 달성하고 싶은 것을 설명하는 질문을 편집하고 도와 드리겠습니다. 일반적으로 이벤트 클래스 자체는 추가 이벤트 추가, 타이머 사용 등을해서는 안됩니다. 이러한 유형의 로직은 이벤트 리스너에서 수행되어야합니다. – sberry

답변

0

방금 ​​강도 페넌트 신호를 사용합니다. 매우 사용하기 쉽습니다. 당신은 실제로 거의가

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

+0

나는 실제로이 문제에 휘말 렸지만 "eventlistener"메서드는 훨씬 더 깨끗해졌습니다. 제안 tho 주셔서 감사합니다! – omgnoseat

1

, 단지 마지막 부분이 사용자 정의 이벤트를 사용하는 방법에 대한 stricly 혼란보다는 OOP 관련 문제의 더되지 않을 것?

일반적으로 AS3의 이벤트는 이벤트 디스패처에서 수신자에게 정보를 전송하는 것이 단독 업무 인 값 객체입니다. 디스패처는 정의 된 모멘텀에 도달 할 때마다 이벤트를 전달하며,이 경우 리스너가 반응 할 수도 있고 그렇지 않을 수도 있습니다.

위 예제에서 마우스 다운이 감지되었을 때 타이머를 시작하는 것은 리스너에 달려 있다고 생각합니다. 보다 정교한 컨텍스트에서 Event는 Dispatcher 나 Event 자체가 신경 쓰지 않아야하는 별도의 작업을 수행하는 둘 이상의 청취자를 독립적으로 트리거 할 수 있습니다. 이는 디스패처 나 이벤트 자체를 어떤 논리로도 수정하는 것을 피하는 것이 좋습니다.

예를 들어, 마우스를 누르고 있었는지 확인하는 처리기를 만들 수 있습니까? 다음

단지 의사이며, 같은 결과를 얻을 수있는 다른 방법의 톤이 분명히있다 :

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

: 예를 들어 이런 식으로 재사용 할 수

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)); 
    } 
} 

...또는이 방법 : 당신은 기본적으로 두 기존의 내장에서 이벤트를 포함하려고하는 사용자 정의 이벤트를 사용하고 있기 때문에

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

아주 좋은 설명 :)이 예제의 문제점 : "var mouseHandler : MouseDownHandler = new MouseDownHandler (mc);" 나는 mousehandler에 대한 변수를 만들어야한다는 사실을 싫어한다. 이벤트 수신기를 곧바로 원하는 객체에 붙일 수 있기를 원한다. 하지만 의심 스럽지만 이벤트 리스너 대상이 testmovieclip과 같은 디스패치 기능을 가지고 있어야하는 것처럼 보입니다. 어떻게 든 보류 배정을 구현하지 않고는 일반 무비 클립에 리스너를 연결할 수 없습니다. 늦게 응답하여 죄송합니다. btw! – omgnoseat