여러 SWF 파일을 하나로 합치기

0. 실행결과

4개의 파일 N001_a.swf, N001_b.swf, N001_c.swf, N001_d.swf 를 포함하는 N001.swf 파일로 변경
N001.swf 파일에는 MovieClip 객체로 a,b,c,d 가 객체로 모두 포함됨.


1. 준비

1.1 32Bit JRE or JDK Download

http://www.oracle.com/technetwork/java/javase/downloads/index.html

1.2 Flex SDK Download

http://www.adobe.com/devnet/flex/flex-sdk-download.html

1.3 환경변수 설정

위치: 제어판-모든 제어판 항목-시스템 – 고급 시스템 속성 – 환경변수

  • JAVA_HOME: C:\Program Files (x86)\Java\jdk1.8.0_51
  • FLEX_SDK_HOME: C:\Program Files\Adobe\flex_sdk_4.6

Path에 추가
path=%JAVA_HOME%\bin;%FLEX_SDK_HOME%\bin;

[주의사항]
– 반드시 32Bit JAVA 를 Path로 설정해야 한다.

1.4 실행 확인

1.4.1 JAVA 버전 확인

C:>java -version
java version "1.8.0_51"

1.4.2 mxmlc 실행 여부 확인

C:>mxmlc
Adobe Flex 컴파일러 (mxmlc)
Version 4.6.0 build 23201
Copyright (c) 2004-2011 Adobe Systems, Inc. All rights reserved.

mxmlc [options] [defaultVar]
자세한 정보를 보려면 'mxmlc -help'를 사용하십시오.

2. Single SWF 파일 생성

2.1 ActionScript 파일 작성

아래의 예제는 3개의 SWF를 포함하는 파일

// N001.as
package {
    import flash.display.Sprite;
    import flash.display.*;


    dynamic public class N001 extends Sprite {  

        [Embed(source='./noun/N001_a.swf')] 
         private var _N001_a:Class;

        [Embed(source='./noun/N001_b.swf')] 
         private var _N001_b:Class;

        [Embed(source='./noun/N001_c.swf')] 
         private var _N001_c:Class;

         [Embed(source='./noun/N001_d.swf')] 
         private var _N001_d:Class;

         // 생성자
         public function Noun() {}              

        //
        //  외부에서 MovieClip을 호출할 때 사용하는 함수
        // 
        public function N001_a() : MovieClip { var mc:MovieClip = new _N001_a(); return mc; }
        public function N001_b() : MovieClip { var mc:MovieClip = new _N001_b(); return mc; }
        public function N001_c() : MovieClip { var mc:MovieClip = new _N001_c(); return mc; }
        public function N001_d() : MovieClip { var mc:MovieClip = new _N001_d(); return mc; }       

    }
}

2.2 파일 구조

- N001.as
- N001
    - N001_a.swf
    - N001_b.swf
    - N001_c.swf
    - N001_d.swf

2.3 명령창으로 빌드

2.2 구조로 생성된 폴더로 이동

[명령구문]

mxmlc -static-link-runtime-shared-libraries=true -use-network=false -o [출력파일 SWF 경로] -source-path="./" "[스크립트 파일 경로]" 

[실행예]

C:temp>mxmlc -static-link-runtime-shared-libraries=true -use-network=false -o ./N001.swf -source-path="./" "./N001.as" 

구성 파일 C:Program FilesAdobeflex_sdk_4.6frameworksflex-config.xml을(를)
불러오는 중
C:tempN001.swf(6488852바이트)

3. N001.swf 에서 Embed 파일 불러오기

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSwfLoadCompleteHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onErrorHandler);
//
// 상대 경로 참조
//
loader.load(new URLRequest('./N001.swf'));

function onSwfLoadCompleteHandler(event:Event) : void { 
    var loaderInfo:LoaderInfo = LoaderInfo(event.target);   

    //
    // target을 Object 타입으로 반환해야 동적으로 함수를 호출할 수 있다.
    //
    this.n001Content = event.target.content as Object;      
    if (this.n001Content == null) {
        trace('noun contents is empty');
        return ;
    }

    //
    // 동적으로 함수 호출, methodName이라는 값은 N001.as 파일에 작성한 public function 함수의 이름과 일치해야 한다.
    //
    var methodName:String = 'N001_a';
    var m:Function = this.n001Content[methodName];  
    var mc:MovieClip = m(); 
    addChild(mc);

}

Trouble Shooting

1. mlmxc 를 실행 안되는 경우

[오류메시지]
C:>mlmxc
Error loading: C:Program FilesJavajdk1.8.0_51jrebinserverjvm.dll
[해결]

mxmlc 가 32 Bit Java를 참조하기 때문에 반드시 환경변수 JAVA_HOME 설정과 Path 정보를 32Bit를 참조하도록 해야함.


2. 트랜스코딩 실패

[오류메시지]
C:UsersoskwonDownloadstempN001.as(7): 열: 3: 오류: 트랜스코딩할 './noun/N001_a.swf'을(를) 확인할 수 없습니다.
[Embed(source='./noun/N001_a.swf')] private var _N001_a:Class;      

C:UsersoskwonDownloadstempN001.as(7): 열: 3: 오류: ./noun/N001_a.swf을(를)   트랜스코딩할 수 없습니다.  
[해결]

Embed 되는 SWF의 경로가 잘못되어 발생되는 문제


3. 정의되지 않은 메소드 실행

[오류 메시지]
    C:UsersoskwonDownloadstemp>mxmlc -static-link-runtime-shared-libraries=true -use-network=false -o ./N001.swf -source-path="./" "./N001.as"
    구성 파일 C:Program FilesAdobeflex_sdk_4.6frameworksflex-config.xml을(를) 불러오는 중  C:UsersoskwonDownloadstempN001.as(17): 열: 65 오류: 정의되지 않은 메서드 _N002_a을(를) 호출했습니다.
                    public function N001_a() : MovieClip { var mc:MovieClip = new _N    002_a(); return mc; }
[해결]

Embed에서 선언한 전역변수와 메소드에서 사용되는 이름이 일치하지 않아 발생되는 문제.