'분류 전체보기'에 해당되는 글 134건

  1. FLVPlayback smoothing //2010/04/02 10:22
  2. SWF metadata tag //2010/02/07 12:32
  3. RegExp 4 - 특정 단어 제외 //2010/01/14 13:00 1
  4. Event.RENDER //2009/09/29 12:44
  5. RegExp 3 - 단어 경계 //2009/09/07 16:08
  6. RegExp 2 - 모든 문자 //2009/06/29 15:40
  7. 4096*4096 //2009/05/29 18:01
  8. SFont + 폰트 문자 범위 지정(Flex3 SDK) //2009/05/26 13:34
  9. SFont v1.1.1 - 런타임 폰트 공유 클래스 //2009/07/06 15:41
  10. SLoader - 순차적 로더 //2009/04/19 23:07
  11. navigateToURL이 팝업차단에 걸릴 때 //2009/05/08 16:00
  12. RegExp 1 - 최단 일치 검색 //2009/04/29 14:41
  13. 클래스 동적 로드 //2008/12/10 00:07 1
  14. Loader와 LoaderContext 그리고 crossdomain //2008/11/27 20:54
  15. ExternalInterface와 MouseEvent //2008/10/08 20:11
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");
                }
 
 
        }
}




as3.0에서

 

navigateToURL로 _blank 타겟의 새창을 열려고 할 경우 익스플로러6에서 (다른 버젼 확인 안 됨) 팝업 차단에 걸리는 경우가 있다.

 

자바스크립트로 해결이 가능한데, 이것도 약간의 문제가 있다.

 

우선은

 

ExternalInterface.call("eval", "window.open('"+url+"')");


위 처럼 url을 자바스크립트를 통해서 새창을 열게되면 팝업차단에 걸리지 않게 되는데, 이상하게 이것도 MouseEvent.MOUSE_DOWN을 통하면 차단된다.

 

(링크 참고 : http://showjean.tistory.com/92)

 

그렇기 때문에, MouseEvent.CLICK을 통해서 위처럼 자바스크립트로 새창을 열면 잘 된다.

 

OK~

 

(target이 특정 이름일 경우에는 모르겠다...)

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

 

= "<img"로 시작하고 ">"로 끝나는 문자열. 가장 긴 영역을 검색

 


var str:String = "<img src=asdflkasdfjlasdf ><br /> 우리나라 좋은 나라"


위 패턴으로 "<img src=asdflkasdfjlasdf ><br />" 검색된다.

 


 

img 태그 부분만 검색하고 싶다면 한정 기호 "?"를 이용한다.

 

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


= "<img"로 시작하고 ">"로 끝나는 문자열. 가장 좁은 영역을 검색

 

결과는 "<img src=asdflkasdfjlasdf >"

어떻게 ApplicationDomain을 이용하면 될 수 있을 것 같았는데,

 

물론,

var lc:LoaderContext = new LoaderContext()
lc.applicationDomain = new ApplicationDomain(); // or new ApplicationDomain(ApplicationDomain.currentDomain);
var cls:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("com.SourceClass")  as  Class;
var sc:Object = new cls();

위와 같이, ApplicationDomain.getDifinition()을 이용하면 문제 없지만, 클래스타입을 지정할 수 없고, 내가 원하는 건 직접 new를 통한 클래스 생성이다.

 

시나리오는 이렇다.

 

우선 필요한 클래스가 포함되어 있는 classAssets.swf파일을 생성한다. 의도에 따라서 업데이트가 이루어지는 파일이다.

이 파일을 로드해서 동적으로 클래스를 이용하는 main.swf파일이 있다. 이 파일은 처음 classAssets.swf를 로드 한 후 각각의 필요한 클래스를 생성해서 사용한다.

 

갱신 할 클래스 파일을 classAssets.swf에 포함 시키면 main.swf에서 로드후 자동으로 갱신되어 적용된다.

 

위와 같은 시나리오대로 작동시킬 방법이 우선 한 가지 있다.

 

LoaderContext.applicationDomain을 ApplicationDomain.currentDomain으로 설정하고 classAssets.swf에서 main.swf를 로드하는 것이다. 그렇게 되면, main.swf의 클래스중 classAssets.swf에 포함된 클래스는 부모의 것으로 갱신되게 된다. (F1에서는 이런 경우 에러를 발생시키고 로드가 멈춰진다고 하는데 (어느 것이 틀린건지 아니면 내가 잘 못 안 것인지) 그렇지는 않다.)

 

하지만, 내가 원하는 것은 시나리오대로 main.swf에서 classAssets.swf를 로드하는 방식이다.

 

F1은 RSL로 사용할 수 있다고 유혹하고 있는데...

계속 연구중...

 

                                                                                                                                                                                

 

검색 결과, 자식 .swf로 부모의 클래스를 갱신 할 수 없다고 한다. 그렇다면, 위 시나리오대로의 구현은 불가능하다.

 

ApplicationDomain.currentDomain.getDefinition()을 이용하거나, 위에서 언급했던 역방향으로 구현하는 방법을 조금 더 연구해봐야겠다.

일단은 이렇다.

 

loader.load(request, context); 를 실행했을때 crossdomain으로 허용되지 않은 서버에서 .swf파일을 로드하는 것이라면,

 

다른 이벤트는 작동하지 않고 HTTPStatusEvent.status 가 0으로 반환된다.

 

이미지(일단 .png)는 관계없다.

다른 브라우져에서는 잘 작동하는 것으로 확인됐지만, IE에서는

 

MouseEvent를 MOUSE_DOWN으로 하면 팝업 차단에 걸려서 정상 작동되지 않지만,

(자바스크립트의 flashUrl은 브라우저 새 창을 여는 펑션)

무슨 이유에서인지는 몰라도 CLICK으로 MouseEvent를 변경하면 잘 된다.

 

이것도 모든 서버/ 모든 컴퓨터에서 생기는 문제는 아닌것으로 보인다.

 

어쨌든 해결.

 

//grp.addEventListener(MouseEvent.MOUSE_DOWN, __click);
grp.addEventListener(MouseEvent.CLICK, __click);
// ________________________________________________ listener
protected function __click(event:MouseEvent):void {
        if(ExternalInterface.available){
                ExternalInterface.call("flashUrl", link, target);
        }
}