2010-02-12 3 views
1

이것은 매우 간단한 이벤트입니다. 그것이 효과가없는 이유는 나를 미치게 만드는 것입니다.커스텀 액션 스크립트 3 이벤트 "슈퍼"기능이 작동하지 않습니다.

이 내 AsciiArt 클래스에 있습니다

package 
{ 
    import flash.events.*; 

    public class ArtEvent extends Event 
    { 
     public static const DONE_NOW = "done"; 

     public function ArtEvent() 
     { 
      super(DONE_NOW); 
      trace("constructed"); 
     } 
    } 
} 

나는 내가 AsciiArt 객체를 인스턴스화하고있어 어디에 내 .FLA로 인해 발사 것을 알고이 매우 간단한 이벤트 클래스를 발생

dispatchEvent(new ArtEvent()); 

완료되면이 코드로 "생성 됨"을 추적합니다.

나는 물론 내 이벤트 리스너를 붙인다. (어떤 것도하지 않는 것 같다.

art.addEventListener(ArtEvent.DONE_NOW, function():void{ trace("hi"); }); 

따라서 요약하면 "생성 됨"이 추적됩니다. 그러나 "안녕"은 그렇지 않습니다.

아이디어가 있으십니까? 감사 -J

편집 - 클래스 코드에 블록을 게시하는 경우 (올바른 이벤트 유형을 잡기 및 인수의 NUM 일치)

또한
art.addEventListener(ArtEvent.DONE_NOW, function(event:ArtEvent) { 
    trace("hi"); 
}); 

가 :(

+0

은 어디에서 이벤트를 전달하는? AsciiArt의 생성자에 있습니까? 이벤트가 등록되기 전에 해고되고 있는지 확인하십시오. – bhups

+0

시스템에 과부하가 걸리지 않도록이 이벤트를 실행하고 있습니다. 클래스는 노동 집약적 인 비트 맵 작업을 수행합니다. 루프가 완료 될 때까지 기다렸다가 시간 초과에 대한 걱정없이 재발행 할 수 있습니다. 그것은 생성자에 있지 않습니다, 생성자는 내 변수를 설정하고 내 비트 맵의 ​​픽셀을 통해 실행되는 루프를 호출합니다. (궁금하다면 http://blog.sugarpillfactory.com/?p=332에서 모든 것을 볼 수 있습니다.) 디스패치 이벤트는 yPos가 이미지의 맨 아래에 도달 한 후에 존재합니다. –

+0

@bhups, 나는 네가 옳았다 고 생각한다. 내 클래스에서 파견 이벤트 함수를 만들고 클래스를 인스턴스화 한 후에 호출하고 내 결과를 얻었습니다. 어떻게 든 그것은 호출되기 전에 등록하지 않습니다. 대답으로 쓰고 싶다면 초록색 체크 표시를 할 것입니다. –

답변

2

작동하지 않습니다 다음이 실제 상황이이 문제가 있습니다 : 당신이 이벤트를 전달하지

  1. , 그래서 핸들러는
  2. 를 호출되지 않을 수 있습니다
  3. ActionScript는 단일 스레드입니다. 큰 루프를 수행하면 루프가 완료 될 때까지 프로그램이 고정됩니다. 작업을 "backround에서 실행"하려면 청크로 분할하고 여러 프레임에 걸쳐 실행을 분산 한 다음 마지막 청크가 실행 된 후 이벤트를 전달해야합니다.

greetz

back2dos

+0

@ back2dos. 응답 해 주셔서 감사합니다. 당신이 알아 차 렸는지 (작은 세부 사항) 모르겠지만, 디스패치 이벤트가 루프의 끝 부분에 존재할 것이라고 쓰고 싶습니다. 작동하지 않았기 때문에 아직 내 코드에 없었습니다. 나는 당신의 대답을 좋아하지만, 나는 프레임을 사용하는 것을 좋아하지 않는다. 그래서, 내가 한 것은 내 디스패치 이벤트 함수 "fireFunction()"을 호출하는 루프의 끝 부분에 ENTER_FRAME 이벤트 리스너를 추가하는 것입니다. 여러 프레임에 대해 녹색 화살표를 줄 것입니다. . –

0

back2dos 지적 (및 bhups이 암시)으로, 플래시는 "단일 스레드"내 ArtEvent에 대한 인스턴스 기간이 없었다 그에. 내 루프의 끝에서 .. (내 스크립트에 추한 프레임을 추가하지 않고)이 문제를 해결하기 위해 나는 추가 :

if(yPos<imgData.height){ // if yPos is less than the height of the image, start over again 
      xPos = 0; 
      yPos +=detail; 
      makeArt(); 
     }else{ 
      addEventListener(Event.ENTER_FRAME, fireEvent); 
     } 
    } 
     public function fireEvent(e:Event):void 
     { 
     removeEventListener(Event.ENTER_FRAME, fireEvent); 
     dispatchEvent(new ArtEvent()); 
     } 
+0

이렇게하면 문제가 해결되지 않을 것입니다. ** 하나의 프레임에서 전체 루프 **를 실행하고, ** 핸들러를 등록하면, ** fireEvent가 트리거 될 때 한 프레임 후에'ArtEvent'를 트리거 할 것입니다. 각 프레임을'makeArt'라고 부르고, 휴식 조건이 true가되면'makeArt' 등록을 취소하고'ArtEvent'를 파견합니다. 문제가 있다면 알려주세요 ... – back2dos

+0

@ back2dos 나는 그것이 무엇인지 말해줍니다. 잘 작동합니다. 당신은 여기에 예제를 볼 수 있습니다 ... http://www.sugarpillfactory.com/projects/asciiartGIF.swf (전체 목적은 ascii 애니메이션 GIF를 만드는 것이 었습니다) –

0

메인 클래스` 패키지 { 수입 flash.display.Sprite을;

public class Test extends Sprite 
{ 
    public function Test() 
    { 
     var art:AsciiArt = new AsciiArt(); 
     art.addEventListener(ArtEvent.DONE_NOW, onArtDone, false, 0, true); 
     addChild(art); 
    } 

    public function onArtDone(event:ArtEvent):void{ 

     trace(event); 
    } 
} 

}

`

AsciiArt`패키지 { 수입 flash.display.MovieClip의; import flash.events.행사;

public class AsciiArt extends MovieClip 
{ 
    public function AsciiArt() 
    { 
     super(); 
     addEventListener(Event.ADDED_TO_STAGE, createEvent, false, 0, true); 
    } 

    private function createEvent(event:Event):void{ 
     dispatchEvent(new ArtEvent(ArtEvent.DONE_NOW)) 

    } 
} 

} `

이벤트`패키지 { 수입 flash.events.Event의;

public class ArtEvent extends Event 
{ 
    public static const DONE_NOW:String = "done"; 
    public function ArtEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) 
    { 
     super(type, bubbles, cancelable); 
    } 

} 

}

`

관련 문제