'Flash/AS3.0'에 해당되는 글 25건

  1. frameRate와 timeline sound
  2. mxmlc jvm.dll error //2012/03/11 03:08
  3. Dictionary //2010/10/28 13:12 1
  4. RegExp 5 - s 플래그 //2010/10/06 13:44
  5. FileReference.load() //2010/08/15 17:32
  6. FLVPlayback smoothing //2010/04/02 10:22
  7. SWF metadata tag //2010/02/07 12:32
  8. RegExp 4 - 특정 단어 제외 //2010/01/14 13:00 1
  9. Event.RENDER //2009/09/29 12:44
  10. RegExp 3 - 단어 경계 //2009/09/07 16:08
  11. RegExp 2 - 모든 문자 //2009/06/29 15:40
  12. 4096*4096 //2009/05/29 18:01
  13. SFont + 폰트 문자 범위 지정(Flex3 SDK) //2009/05/26 13:34
  14. SFont v1.1.1 - 런타임 폰트 공유 클래스 //2009/07/06 15:41
  15. SLoader - 순차적 로더 //2009/04/19 23:07

frameRate와 timeline sound

timeline sound가 stream으로 적용되어 있는 swf를 로드하면 container의 frameRate의 설정과는 상관없이 로드된 swf의 frameRate로 맞춰지게 된다. 아마도 sound를 stream으로 sync 시키기위한 강제된 동작이 아닌가 생각된다. event 형식의 sound는 상관없다.

mxmlc 실행시 다음과 같은 에러가 난다면 %JAVA_HOME%에 64bit JDK가 지정되어 있는 경우일 것이다.


Error loading: ~ jvm.dll


32bit JDK를 설치 후 환경 변수를 변경해주면 문제 없이 작동된다.


같은 이유로 FlashDevelop에서도 flexsdk로 컴파일시 에러가 발생(컴파일은 되지만 debug 어쩌구 하면서 에러가 발생된다.)하고, 해결 방법도 동일하다.

'Flash > AS3.0' 카테고리의 다른 글

frameRate와 timeline sound  (0) 2012.06.25
Dictionary //2010/10/28 13:12  (1) 2012.06.05
RegExp 5 - s 플래그 //2010/10/06 13:44  (0) 2012.06.05
FileReference.load() //2010/08/15 17:32  (0) 2012.06.05
FLVPlayback smoothing //2010/04/02 10:22  (0) 2012.06.05

Dictionary //2010/10/28 13:12

Dictionary를 이용한 Garbage Collection

 

delete dict[key];

도트 문자(.)에 개행문자도 포함 시킬 것인지를 결정한다.


var str:String = "<p>Hello\n" + "again</p>" + "<p>Hello</p>";

 

var pattern:RegExp = /<p>.*?<\/p>/;

trace(pattern.dotall) // false

trace(pattern.exec(str)); // <p>Hello</p>

 

pattern = /<p>.*?<\/p>/s;

trace(pattern.dotall) // true

trace(pattern.exec(str));

/*<p>Hello

again</p> */


'Flash > AS3.0' 카테고리의 다른 글

mxmlc jvm.dll error //2012/03/11 03:08  (0) 2012.06.05
Dictionary //2010/10/28 13:12  (1) 2012.06.05
FileReference.load() //2010/08/15 17:32  (0) 2012.06.05
FLVPlayback smoothing //2010/04/02 10:22  (0) 2012.06.05
SWF metadata tag //2010/02/07 12:32  (0) 2012.06.05

FileReference.load() 이용시


FileReference의 레퍼런스가 지역변수라면 테스트무비에서는 이상없지만 브라우저에서는 작동하지 않는 경우가 있다.

FileReference의 레퍼런스를 클래스의 속성으로 사용하면 해결된다.

protected var file:FileReference;
 
public function doSomething():void {
       
        //var file:FileReference = new FileReference(); //FileReference.load()가 브라우져에서 제대로 동작하지 않는다
        file = new FileReference();
       
        ....
}

4시간 삽질의 결과....

flvPlayback.getVideoPlayer(flvPlayback.activeVideoPlayerIndex).smoothing=true
package 
{
 import flash.display.*;
 import flash.events.Event;
 
 [SWF( backgroundColor = "#ffffff", width = "592", height = "333", frameRate = "36")]
 
 public class Main extends Sprite 
 {
  }
}

((?!못난이).)*?

 

특정 패턴에서 '못난이'라는 글자만 제외하는 최단일치 패턴

(*뒤의 ?는 게으른 수량자로서 최단일치 검색)

 

((?!못난이|바보|응꼬).)*?

 

|를 이용해서 여러개의 단어를 동시에 제외할 수 있다.

gotoAndStop()으로 무비클립의 프레임을 이동시킨 후

stage.invalidate()로 Event.RENDER의 리스너를 작동시키면

해당 프레임의 numChildren은 정상적으로 확인되지만, 그 자식들에게는 접근이 되지 않는 현상이 있다.

 

- 프레임에 놓여져 있는 무비클립에 접근해야하기 때문에 인스턴스 네임으로 접근하는 방식을 이용한다.

- getChildAt() 이나 getChildByName()으로 접근해도 마찬가지.


 protected function dim():void
  {
   __movieClip.menus.visible = true;
   var len:int = __movieClip.menus.numChildren; // 자식들의 개수는 확인이 된다.
   trace(this, len);
    
    var mc:SimpleButton;
    for (var i:int = 0; i < len; ++i) {
     mc = __movieClip.menus["menu_" + i];
     if (mc) {    
      trace(this, mc.name);      // 하지만, 해당 자식들에게 접근은 할 수 없다.
      __movieClip.menus.mc_focus.visible = true; 
      mc.alpha = .5;
      mc.enabled = false;
      mc.removeEventListener(MouseEvent.CLICK, __clickHandler);
     }else {
      break;
     }
    }
    
    progress(0);
  }


나중에라도 이유를 알게되면 좋겠다.


메타문자 \b 는 단어와 단어 사이의 경계를 의미한다. 상대적인 의미이기때문에 사용에 주의가 필요하다.


/\bcat\b/


"cat"이라는 단어 앞 뒤로 쓰였기 때문에 단어가 아닌 문자를 검색하고



/\b-\b/


"-"는 단어문자가 아니기 때문에 여기서는 단어에 포함되는 문자를 검색한다.

 

\B 는 이와 반대의 의미로 사용된다.

var pattern:RegExp = /<.*>/;

= "<"로 시작하고 ">"로 끝나는 문자열

 

. : 임의의 단일 문자

* : 바로 앞의 항목이 0번 이상 반복된 것

+ : 바로 앞의 항목이 1번 이상 반복된 것

 

위 패턴은 개행문자를 검색하지 못한다.

개행문자를 포함하려면 s 플래그를 적용한다.

 

var pattern:RegExp = /<.*>/s;

4096*4096 //2009/05/29 18:01

- 세로 4096px이상의 스테이지에 라이브러리에 있는 무비클립을 4096이상의 y 위치에 놓으면 보여지지 않는 경우가 있다. (마치 마스크가 씌워진 것처럼)

 

- 외부에서 Loader로 로드된 이미지는 위치에 관계없이 보여진다.

 

- 익스플로러/파이어폭스 , flash player 10

 

 

버그겠지?

 

** 안보이는 객체를 BitmapData.draw(객체)를 이용해서 새로운 Bitmap에 그려주면 보인다.


sfont120605.rar



이전 포스트인 (링크)SFont에서의 폰트.swf파일 만들기로는 사용자가 원하는 범위의 문자만을 포함할 수 없다.

 

Flash CS3 단독으로는 이를 수행 할 수 없고,(내가 알기론...) Flex3 SDK를 이용해서 폰트.swf파일을 생성한다면 가능하다.

 

(참고 http://blog.jidolstar.com/414)

(참고 http://blog.naver.com/synchrong/110005825131)

(참고 http://www.action-scripter.com/blog/1092)

 


- Flex3 SDK를 이용해 문자범위를 지정할 수 있는  폰트.swf파일 만들기

 

SDK 설치 (http://blog.naver.com/moviel0ve?Redirect=Log&logNo=130034438959)

 

- SDK로 컴파일 할 폰트.as 파일

package {
        import flash.display.Sprite;
        import flash.text.Font;
       
        public class DinmedRegular extends Sprite       {              
               
                [Embed( mimeType='application/x-font', source='DinmedRegular.ttf', fontName='DinmedRegular', embedAsCFF="false", unicodeRange='U+0041-U+005A')] // 영문 대문자만 임베드
                protected var font:Class;
               
                function DinmedRegular(){
                        Font.registerFont(font);
                }
        }
}

unicodeRange에 임베드할 문자의 유니코드를 입력하면된다.

(유니코드는 (flex3sdk)\frameworks\flash-unicode-table.xml 또는 첨부한 파일을 참고)

위 처럼 폰트를 직접 등록(Font.registerFont(font);)하기 때문에 FontAsset에서는 등록작업을 별도로 하지 않는다.


flex sdk 4.6은 아래 옵션(-static-link-runtime-shared-libraries)을 추가해야 제대로 컴파일 된다.(아마 4버젼 부터 필요한 것으로 추측한다.)

mxmlc -static-link-runtime-shared-libraries DinmedRegular.as


그리고, 현재(2012.06.05) sdk에서는 폰트 임베드시 embedAsCFF="false" 옵션을 반드시 추가해야한다. 

(이것도 sdk 4부터 필요한 것으로 보인다.)

(http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7f5f.html)



- 사용법은 SFont와 같다. 단, Font Class 인자는 공백("")으로 입력한다.

import com.showjean.net.*;
import flash.net.*;
 
var sl:SFont = new SFont();
sl.addEventListener(Event.COMPLETE,completeHandler);
sl.addEventListener(IOErrorEvent.IO_ERROR,__eventHandler);
sl.addEventListener(ProgressEvent.PROGRESS, progressHandler);
sl.load("assets/DinmedRegular.swf", "");
 
 
function completeHandler(event:Event):void {
        trace(event);
 
        var tf:TextFormat=txt.getTextFormat();
        var fn:String=sl.name;
        if (fn == null) {
        } else {
                tf.font=fn;
                txt.embedFonts=true;
                txt.defaultTextFormat=tf;
                txt.text="ABCDEFG12345 "+fn;
        }
}
 
function __eventHandler(event:Event):void {
        trace(event);
}
 
function progressHandler(event:ProgressEvent):void {
        trace("progressHandler: bytesLoaded=" + event.bytesLoaded + " bytesTotal=" + event.bytesTotal);
}




Flash CS4에는 지원한다고 한다. (직접 확인은 하지 않았다.)

-> 확인 결과 CS4에서는 Flex SDK를 직접 연결해서 컴파일 가능하다. SDK로 직접 컴파일 하는 것과 다른 점이라면 fla파일이 있어야 한다는 것.






sfont090706.rar



2.0에서 꽤 까다로웠던 기술인 런타임 폰트 공유(참고 URL)를 3.0에 와서는 훨씬 간단하게 구사할 수 있게 되었다.

 

그를 이용해 일반적인 Loader처럼 폰트 로드/공유할 수 있도록 만든 클래스가 SFont이다.

 

(내부적으로 (link)SLoader를 이용하므로 참고)

 

(참조 블로그 : http://blog.jidolstar.com/468)



- 사용법 : 폰트.swf의 파일경로와 라이브러리의 Font Class를 이용해 로드 후 .name 속성으로 폰트의 이름을 TextFormat에 적용하면된다.

import com.showjean.net.*;
import flash.net.*;
 
var sl:SFont = new SFont();
sl.addEventListener(Event.COMPLETE,completeHandler);
sl.addEventListener(IOErrorEvent.IO_ERROR,__eventHandler);
sl.addEventListener(ProgressEvent.PROGRESS, progressHandler);
sl.load("assets/kroe0554.swf", "kroeger05_54");
 
 
function completeHandler(event:Event):void {
        trace(event);
 
        var tf:TextFormat=txt.getTextFormat();
        var fn:String=sl.name;
        if (fn == null) {
        } else {
                tf.font=fn;
                txt.embedFonts=true;
                txt.defaultTextFormat=tf;
                txt.text="ABCDEFG12345 "+fn;
        }
}
 
function __eventHandler(event:Event):void {
        trace(event);
}
 
function progressHandler(event:ProgressEvent):void {
        trace("progressHandler: bytesLoaded=" + event.bytesLoaded + " bytesTotal=" + event.bytesTotal);
}


- 로드될 공유용 폰트.swf파일을 만드는 법

1. 새 fla파일을 생성하고 라이브러리 메뉴>new Font... 를 선택한다.

 

2. 공유할 폰트를 고르고 Name을 적당히 입력한다.



3. 폰트가 라이브러리에 등록되었다면 Linkage...를 선택한다.




4. Export for ActionScript와 Export in first frame 을 체크하고 Class에 사용할 이름을 넣는다.



5. 컴파일 후 swf파일을 적당한 위치에 놓는다.



- SFont.as : 유저가 사용하는 주클래스로 proxy의 성격을 띤다.

/**
 * SFont -
 *
 * @author: showjean in http://showjean.com/works, mobile , mailto:showjean@hanmail.net
 * @version: 1.0.0
 * @date: 2009.5.22.
 *
 * @comment: 유저가 사용하는 클래스, FontAsset의 proxy 성격을 가지고있다.
 */
package com.showjean.net{
 
        import flash.events.*;
 
        public class SFont extends EventDispatcher {
 
                protected var fontAsset:FontAsset;
 
                function SFont() {
                }
                // _____________________________________________________ public
                /**
                 * 폰트를 로드
                 * url: swf의 위치
                 * linkage: swf 라이브러리의 Font Class
                 */
                public function load(url:String,linkage:String):void {
                        if (fontAsset == null) {
 
                                fontAsset=FontAssetManager.getInstance().getFontAsset(url,linkage);
 
                                // 폰트가 이미 로드된 경우
                                if (fontAsset.isComplete()) {
 
                                        dispatchEvent(new Event(Event.COMPLETE));
 
                                        // 이미 로드에러인 경우
                                } else if (fontAsset.isError()) {
 
                                        dispatchEvent(new Event(IOErrorEvent.IO_ERROR));
 
                                } else {
 
                                        fontAsset.addEventListener(Event.OPEN,__eventHandler);
                                        fontAsset.addEventListener(Event.COMPLETE,__eventHandler);
                                        fontAsset.addEventListener(IOErrorEvent.IO_ERROR,__eventHandler);
                                        fontAsset.addEventListener(ProgressEvent.PROGRESS,__eventHandler);
                                        fontAsset.addEventListener(HTTPStatusEvent.HTTP_STATUS,__eventHandler);
 
                                }
                        }
                }
                /**
                 * 로드를 중지 또는 제거(등록된 폰트가 제거되지는 않는다)
                 */
                public function close():void {
                        dispose();                     
                        fontAsset=null;
                }
                /**
                 * 등록된 폰트의 이름을 반환
                 */
                public function get name():String {
                        return fontAsset ? fontAsset.name : null;
                }
                // _____________________________________________________ protected
                protected function dispose():void {
                        if (fontAsset) {
                                fontAsset.removeEventListener(Event.OPEN,__eventHandler);
                                fontAsset.removeEventListener(Event.COMPLETE,__eventHandler);
                                fontAsset.removeEventListener(IOErrorEvent.IO_ERROR,__eventHandler);
                                fontAsset.removeEventListener(ProgressEvent.PROGRESS,__eventHandler);
                                fontAsset.removeEventListener(HTTPStatusEvent.HTTP_STATUS,__eventHandler);
                                fontAsset.close();
                        }
                }
 
                // ____________________________________________________________ listener
                protected function __eventHandler(event:Event):void {
                        if (event.type == Event.COMPLETE || event.type == IOErrorEvent.IO_ERROR) {
                                dispose();
                        }
                        dispatchEvent(event);
                }
        }
}



- FontAsset : 폰트를 로드, 정보를 저장하는 클래스

/**
 * FontAsset -
 *
 * @author: showjean in http://showjean.com/works, mobile , mailto:showjean@hanmail.net
 * @version: 1.1.1
 * @date: 2009.7.6.
 *
 * @comment: FontAssetManager에서 생성되는 클래스로, font.swf파일을 로드하고 fontname까지 저장하고 있는다.
 */
package com.showjean.net{
 
        import flash.display.*;
        import flash.events.*;
        import flash.system.*;
        import flash.text.*;
        import flash.net.*;
        import flash.utils.*;
 
        public class FontAsset extends EventDispatcher {
 
                protected var __linkage:String;
                protected var __name:String;
                protected var loader:Loader;
 
                function FontAsset() {
                }
                // _____________________________________________________ public
                /**
                 * url: swf의 위치
                 * linkage: swf 라이브러리의 Font Class
                 *
                 * >다른 도메인의 폰트.swf를 로드해 올경우 LoaderContext를 설정한다
                 * >crossdomain.xml이 설정되어 있어야한다.
                 */
                public function load(url:String, linkage:String):void {
                        __linkage = linkage;
                        loader = new SLoader();
 
                        // LoaderContext
                        var context:LoaderContext=new LoaderContext();
                        context.checkPolicyFile=true;
                        context.applicationDomain = ApplicationDomain.currentDomain;
 
                        // 로컬에서 작동하지 않게
                        if ( Security.sandboxType == Security.REMOTE ) {
                                context.securityDomain=SecurityDomain.currentDomain;
                        }
 
                        loader.contentLoaderInfo.addEventListener(Event.OPEN,__completeHandler);
                        loader.contentLoaderInfo.addEventListener(Event.COMPLETE,__completeHandler);
                        loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,__completeHandler);
                        loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,__completeHandler);
                        loader.contentLoaderInfo.addEventListener(HTTPStatusEvent.HTTP_STATUS, __completeHandler);
 
                        loader.load(new URLRequest(url), context);
                }
                /**
                 * 로드를 중지 또는 제거(등록된 폰트가 제거되지는 않는다)
                 */
                public function close():void {
                        dispose();
                }
                /**
                 * 등록된 폰트의 이름을 반환
                 */
                public function get name():String {
                        return __name;
                }
                /**
                 * 폰트로드가 완료되었는지 확인
                 */
                protected var _isComplete:Boolean = false;
                public function isComplete():Boolean {
                        return _isComplete;
                }
                /**
                 * 폰트로드가 실패했는지 확인
                 */
                protected var _isError:Boolean = false;
                public function isError():Boolean {
                        return _isError;
                }
                // _____________________________________________________ protected
                protected function dispose():void {
                        if (loader) {
                                loader.contentLoaderInfo.removeEventListener(Event.OPEN,__completeHandler);
                                loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,__completeHandler);
                                loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,__completeHandler);
                                loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS,__completeHandler);
                                loader.contentLoaderInfo.removeEventListener(HTTPStatusEvent.HTTP_STATUS, __completeHandler);
 
                                // 폰트를 등록한 후에는 swf파일이 필요없다.
                                try {
                                        if (loader.content) {
                                                loader.unload();
                                        } else {
                                                loader.close();
                                        }
                                } catch (error:Error) {
                                        trace(this, error);
                                }
                                loader = null;
                                prevFontArr = null;
                                //trace(this, "dispose......");
                        }
                }
                protected function getIndexByName(font:Font):int{
                        for (var i:int = 0; i < prevFontArr.length; ++i) {
                                var item:Font = prevFontArr[i] as Font;
                                if (item.fontName == font.fontName) {
                                        return i;                                      
                                }       
                        }
                        return -1;
                }
                // ____________________________________________________________ listener
                protected var prevFontArr:Array
                protected function __completeHandler(event:Event):void {
                        if (event.type == Event.OPEN) {
                               
                                prevFontArr = Font.enumerateFonts(false);
                               
                        } else if (event.type == Event.COMPLETE) {
                                try {
                                       
                                        var className:String = getQualifiedClassName( loader.content );
                                        // flash에서 new Font로 라이브러리에 등록한 파일일 경우.
                                        if (className == "flash.display::MovieClip") {
                                                var fontclass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition(__linkage)  as  Class;
                                                Font.registerFont(fontclass);
                                        } else {
                                                // flex sdk로 폰트를 임베드한 파일일 경우(unicodeRange로 캐릭터 범위를 지정할 수 있다)
                                                // 자동 등록되므로 아무것도 하지 않는다.
                                        }
                                       
                                        // 때에 따라서 배열의 앞쪽 또는 뒤쪽으로 추가되어서 어느쪽으로 추가되었는지 판별
                                        var arr:Array = Font.enumerateFonts(false);
                                       
                                        // 텍스트필드에 수동으로 임베드한 폰트들이 indexOf연산에 -1이 반환되어서 제대로 작동하지 않음
                                        /*for each(var font:Font in arr) {
                                                if (prevFontArr.indexOf(font) == -1) {
                                                        __name = font.fontName;
                                                        break;
                                                }
                                        }*/
                                        for each(var font:Font in arr) {
                                                if (getIndexByName(font) == -1) {
                                                        __name = font.fontName;
                                                        break;
                                                }
                                        }
                                        trace(this, "added font name: ", __name);
 
                                } catch (e:Error) {
                                        trace(this, "error - Font.registerFont............ ", e.toString());
                                        // 폰트 등록 에러일경우 다시 등록하거나, 폰트가 포함되지 않은 swf파일
                                }
                                _isComplete = true;
                                dispose();
 
                        } else if (event.type == IOErrorEvent.IO_ERROR) {
                                _isError = true;
                                dispose();
                        }
 
                        dispatchEvent(event);
                }
        }
}



- FontAssetManager : FontAsset을 관리하는 싱글톤 클래스

/**
 * FontAssetManager -
 *
 * @author: showjean in http://showjean.com/works, mobile , mailto:showjean@hanmail.net
 * @version: 1.0.0
 * @date: 2009.5.22.
 *
 * @comment: SFont에서 이용하는 싱글톤 클래스로, FontAsset이 중복 생성되지 않도록 관리한다.
 */
package com.showjean.net{
 
        public class FontAssetManager {
 
                private static  var instance:FontAssetManager;
 
                protected var _fontsObject:Object=new Object();
 
                // _____________________________________________________ singleton
                /**
                 * 싱글톤 생성자
                 */
                function FontAssetManager( singletonForce:SingletonForce ) {
                }
 
                /**
                 * 싱글톤 클래스 접근 메서드
                 */
                public static function getInstance():FontAssetManager {
                        if ( !instance ) {
                                instance = new FontAssetManager( new SingletonForce() );
                        }
                        return instance;
                }
                // _____________________________________________________ public
                /**
                 * url: swf의 위치
                 * linkage: swf 라이브러리의 Font Class
                 *
                 * url을 object의 속성으로 저장된 FontAsset은 같은 url에 대해서는 하나의 객체만 존재하게 된다.
                 */
                public function getFontAsset(url:String, linkage:String):FontAsset {
                        var asset:FontAsset;
                        if (_fontsObject[url] == undefined) {
                                // 아직 로드전이라면 FontAsset생성, 로드 시작
                                asset = new FontAsset();
                                _fontsObject[url] = asset;
                               
                                try {
                                        asset.load(url, linkage);
                                } catch (e:Error) {
                                        trace(this, e);
                                }
                        } else {
                                // 로드중이거나 로드완료라면
                                asset = _fontsObject[url];
                                //trace(this, "이미 로드중... ", url);
                        }
                        return asset;
                }
        }
}
/**
* @private
* 싱글톤 패턴을 위한 클래스
*/
class SingletonForce {
}








*** 5.25일, SLoader의 next()메서드에서 에러의 소지가 있어 수정.

*** 4.23일, 로드중인 SLoader를 unload()하거나 close() 시키면 이어서 연속 로드가 되지 않는 버그를 수정.

 

이전의 (link)SequenceLoader는 OOP에 적용하기에는 유연하지 못하다는 것을 이번 프로젝트에서 느끼게 되어 새롭게 만든 SLoader.

 

Loader의 동생벌로서 사용법은 같으나 싱글톤인 SequenceCenter의 지배를 받아 로딩이 순차적으로 이루어지는 클래스이다.



- 사용법 : Loader와 같다. 

for (var i:int = 0; i<_len; ++i) {
        var sl:SLoader = new SLoader();
        sl.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler);
        sl.load(new URLRequest(url));
}
 
function completeHandler(event:Event):void {
        trace("****", event);
        var ld:Loader = event.target.loader;
        ld.x =50;
        stage.addChild(ld);
}


- SLoader.as

/**
 * SLoader -
 *
 * @author: showjean in http://showjean.com/works, mobile, mailto:showjean@hanmail.net
 * @version: 1.2.2
 * @date: 2009.4.23.
 *
 * @comment:
 */
package com.showjean.net{
 
        import flash.net.*;
        import flash.display.*;
        import flash.events.*;
        import flash.system.*;
 
        public class SLoader extends Loader {
 
                //센터에서 다음 순서를 확인해서 자신이라면 로드시작
                protected var center:SequenceCenter=SequenceCenter.getInstance();
 
                protected var __uindex:int;
                protected var __request:URLRequest;
                protected var __context:LoaderContext;
 
                function SLoader() {
                        _isLoading = false;
                        center.addEventListener(SequenceCenterEvent.NEXT,__nextTurnHandler);
                        __uindex=center.index;// 시퀀스 센터에서 고유의 인덱스를 받아온다.
                }
                // _____________________________________________________ override
 
                // 로드를 하기전 시퀀스센터에 등록, 차례를 기다린다.
                override public function load(request:URLRequest,context:LoaderContext=null):void {
                        __request=request;
                        __context=context;
 
                        center.add(__uindex);
 
                        center.next();
                }
                override public function close():void {
                        dispose();
                        super.close();
                }
                override public function unload():void {
                        dispose();
                        super.unload();
                }
 
                // _____________________________________________________ public
                // _____________________________________________________ protected
                protected function dispose():void {
                        if (center) {
                                // 로딩중 멈추는 것이라면 다음을 로드
                                if(_isLoading && center.isActive){
                                        next();
                                }
                                removeEvent();
                                center.remove(__uindex);
                                center = null;
                                __request = null;
                                __context = null;
                        }
                }
                protected var _isLoading:Boolean
                protected function __load():void {
                        // 센터의 현재(자신)을 제거
                        center.removeEventListener(SequenceCenterEvent.NEXT,__nextTurnHandler);
                        center.shift();
 
                        addEvent();
 
                        center.isActive=true;
                        super.load(__request, __context);
                }
                protected function next():void {
                        if (center) {
                                center.isActive=false;
                                center.next();
                        }
                }
                protected function addEvent():void {
                        _isLoading = true;
                        this.contentLoaderInfo.addEventListener(Event.COMPLETE, __completeHandler);
                        this.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, __ioErrorHandler);
                }
                protected function removeEvent():void {
                        _isLoading = false;
                        this.contentLoaderInfo.removeEventListener(Event.COMPLETE, __completeHandler);
                        this.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, __ioErrorHandler);
                }
                // ____________________________________________________________ listener
                protected function __nextTurnHandler(event:SequenceCenterEvent):void {
                        //다음 로더가 자신이라면
                        if (__uindex == event.index) {
                                event.stopImmediatePropagation();
                                __load();
                        }
                }
                protected function __completeHandler(event:Event):void {
                        removeEvent();
                        next();
                }
                protected function __ioErrorHandler(event:IOErrorEvent):void {
                        removeEvent();
                        next();
                }
        }
}


- SequenceCenter.as

/**
 *  SequenceCenter
 *
 * @author: showjean in http://showjean.com/works, mobile , mailto:showjean@hanmail.net
 * @version: 1.0.2
 * @date: 2009.4.19.
 *
 * @comment: SequenceLoader를 순서대로 실행시키는 싱글톤
 */
package com.showjean.net{
 
        import flash.net.*;
        import flash.events.*;
 
        public class SequenceCenter extends EventDispatcher {
 
                static private  var instance:SequenceCenter=new SequenceCenter();
 
                private var _dataArr:Array;
                private var _isActive:Boolean = false;
                private var _index:int = 0;
 
                function SequenceCenter() {
                        if (instance) {
                                throw new Error("Singleton can only be accessed through Singleton.getInstance()");
                        }
                        _dataArr = new Array();
                }
                static public function getInstance():SequenceCenter {
                        return instance;
                }
                // _______________________________________________ public
                public function set isActive(b:Boolean):void {
                        _isActive = b;
                }
                // 로드 중인지 확인
                public function get isActive():Boolean {
                        return _isActive;
                }
                public function get index():int {
                        return _index++;
                }
                public function remove(idx:int):void {
                        var idx:int = _dataArr.indexOf(idx);
                        if(idx > -1){
                                _dataArr.splice(idx, 1);
                        }
                }
 
                public function add(idx:int):void {
                        _dataArr.push(idx);
                }
                public function shift():void {
                        _dataArr.shift();
                }
                public function next():void {
                        if (_dataArr.length > 0 && isActive==false) {
                                //trace("center next : ", _dataArr[0]);
                                dispatchEvent(new SequenceCenterEvent(SequenceCenterEvent.NEXT, int(_dataArr[0])));
                        }
                } 
 
        }
}


- SequenceCenterEvent.as

/**
 *  SequenceCenterEvent
 *
 * @author: showjean in http://showjean.com/works, mobile , mailto:showjean@hanmail.net
 * @version: 1.0.1
 * @date: 2008.9.26.
 *
 * @comment:
 */
package com.showjean.net{
 
        import flash.events.*;
        import flash.net.*;
        import flash.display.*;
 
        public class SequenceCenterEvent extends Event {
 
                public static  const NEXT:String = "next";
 
                private var _slIndex:int;
                public function SequenceCenterEvent(type:String, idx:int, bubbles:Boolean=false, cancelable:Boolean=false) {
                        super(type, bubbles, cancelable);
                        _slIndex = idx;
                }
                public function get index():int {
                        return _slIndex;
                }
                override public function clone():Event {
                        return new SequenceCenterEvent(this.type,_slIndex,this.bubbles,this.cancelable);
                }
                override public function toString():String {
                        return formatToString("SequenceCenterEvent","type","index","bubbles","cancelable","eventPhase");
                }
 
 
        }
}