블로그 이미지
플래시로 밥먹고 살고 있습니다... 하지만 여긴 플래시 전문 블로그가 아닌 그냥 개인 블로그랍니다
미나토

Recent Comment

calendar

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      
  • 56,002total
  • 9today
  • 173yesterday
2012/01/18 11:22 Scaleform


1. 스케일폼은 플래시와 달라요

플래시 웹앱 환경과 scaleform 의 환경은 상당한 차이가 있습니다...

첫째, http 통신을 할 수가 없다
둘째, 기본적인 키보드와 마우스 왼쪽 버튼 이벤트 말고도 여러 인터랙션이 있다.
세째, 가상폴더에서 실행된다...(udk 기준입니다... 다른 엔진도 그런지는...)...그렇기에 절대 경로를 찾기 어렵다.

이외에도 여러가지 제한이 있고, 반대로 추가적인 기능들이 있지만 일단 이렇습니다...


스케일폼에서 제공하는 scaleform.gfx.* 패키지를 보면 많은 클래스들이 있습니다. 이는 스케일폼의 여러 확장기능들을 이용하게 하기 위한 클래스들입니다.

다른 것은 둘째 치고 일단 Extensions.enabled 함수를 확인하셔야 합니다. (멤버변수가 아닌 set/get 함수입니다)
기본값은 false 이지만 이걸 true로 해두면 위에서 언급한 여러 확장기능들을 사용할 수 있게 됩니다. 



아무튼 위에서 말한대로 스케일폼은 여러 세팅할 값들이 일반적인 플래시앱과는 꽤 다르게 해줘야 합니다

그런 세팅을 해야할 곳은 바로 시작점 클래스 입니다...



2. 시작점 클래스


플래시에서는 시작점 클래스란 것이 있습니다

바로 Document Class 인데, vm이 최초에 실행할 class 를 말하는겁니다.
엄밀히 말하자면 해당 class를 인스턴스로 만들어 stage에 addChild 하는 행위를 말합니다... 그렇게 인스턴스화 되는 과정에서 해당하는 class 의 생성자 함수가 실행되는 것이지요...

시작점 클래스에 관한 포스팅이 아니니, 자세한 내용은  http://www.diebuster.com/flash/98 을 읽어보시기 바랍니다...



3. 본격적으로~

function Main(){
    addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}

function onAddedToStage($e:Event):void{
    removeEventListener(Event.ADDED_TO_STAGE,  onAddedToStage);
}




자, 여기서부터입니다. 우리는  onAddedToStage 를 구현해줘야 하죠... 사실 다른 분들은 생성자 함수부터 많은 세팅들을 하는 경우가 있을겁니다.
뭐, 여러가지 이유가 있지만... 일단 제가 저기서부터 세팅을 시작하는 이유가 있습니다...

스케일폼 UI 개발 특성상 여러개의 swf로 나눠지게 됩니다... 최상위 컨테이너인 Main 에서 여러 인벤토리, 캐릭터 정보창, 상점 등등... 여러 swf를 불러서 사용하는 형태가 되는 것이지요.

툴팁의 컨테이너를 따로 만들 수도 있을 거고, 클라이언트와 통신하는 객체를 따로 만들어 불러들일 수도 있을겁니다...


그럼 제가 인벤토리를 만들고 있는 상황이라면 인벤토리의 Main은 테스트할 때 말고는 실제 구동시에는 Main이 아니라는 뜻입니다... 최상위 컨테이너인 Main에서 부른 형태일테니까요...

자, 그럼 현재의 Main이 진짜 Main인지 아닌지를 판단하는 방법이 필요한데 바로

(stage === this.parent)  로 판단하시면 됩니다...

그럼 다음과 같은 코드가 이어질 겁니다...

if (stage === this.parent) {
    Extensions.enabled = true;
    stage.align = StageAlign.TOP_LEFT;
    stage.scaleMode = StageScaleMode.NO_SCALE; 
}



뭐, 이정도일 겁니다... Extensions.enabled 에 대해서는 처음에 설명했지요???

이 다음 실행될 구문은 바로 

if (stage === this.parent) {
    Extensions.enabled = true;
    stage.align = StageAlign.TOP_LEFT;
    stage.scaleMode = StageScaleMode.NO_SCALE;

    if (Extensions.enabled) {
    }
    else{
    }
}


입니다. 여기서부터가 이제 아스트랄해지는 부분입니다...

바로 앞선 구문에서  Extensions.enabled 에 true 값을 대입연산자인 = 로 줬습니다...
그런데 바로  Extensions.enabled 값이 true 인지를 판단한다라...?

이제  Extensions class를 다시 열어봐야할 시간이 됐습니다.


4.  Extensions class

 // Enable/disable GFx extensions
static public function set enabled(value:Boolean) : void {}
static public function get enabled() : Boolean { return false; }



Extensions class의  enabled 함수가 구현되어 있는 모습입니다... 뭔가 이상하지 않나요??? 보통 set/get 함수를 만들면 다음과 같이 해야 하지 않나요?

static private var _enabled:Boolean = false;

static public function set enabled(value:Boolean) : void {
     _enabled = value;
}
static public function get enabled() : Boolean { return  _enabled ; }



이렇게 말이죠... 그런데 Extensions class 안에는 _enabled 이 없습니다...

이녀석은 바로 scaleform 에 저장되는 값이기 때문입니다.

그렇다면 if (Extensions.enabled) 문의 비밀이 나옵니다.

Extensions.enabled = true;
if (Extensions.enabled) {
    // 이 swf 가 돌아가는 vm은 scaleform 플레이어입니다
}
else{
    // 이 swf 가 돌아가는 vm은 Flash 플레이어입니다
}



이 구문은 현재의 vm을 판단하는 부분입니다... 플래시 플레이어에는 _enabled 값이 저장될 곳이 없으니 언제나 get enabled() 가 false 만을 반환하기 때문이죠...


그런데 여기서 의문이 남습니다... 어차피 scaleform으로 돌릴 것을 만드는데, 왜 flash player 에서 돌리려고 하는건가요???



5. 그러니깐 그게 왜 필요한데... 어따 쓸거냐고...


스케일폼 플레이어는 디버깅에 제한을 받습니다... trace는 찍어주는데 break point 가 안먹어요...(제가 방법을 모르는 것인지는 모르겠습니다만...)

물론 하려고만 하면야 trace만으로도 잘 개발할 수 있습니다만... break point 가 좀 필요할 때가 있는 것도 사실이지요...
바로 디버깅의 편리함을 가져다 주기 위함이예요...

고작 브레이크포인트 디버깅 때문에 코드를 더럽히냐고 하실 수 있지만... 어차피 저 코드는 어떤 상황에서건 최초에 딱 한번만 실행됩니다. 런타임의 실행속도와 무관하지요...

이외에도 뭔가 다른 곳에 필요치 않을까요??? :^)


p.s. 사실 저는 다르게 만들어써요 ㅋㅋㅋ
p.s. 써놓고 보니깐 제목을 vm 판단하기...라고 지을걸 그랬나 싶다는... 이놈의 필력이란...

 
크리에이티브 커먼즈 라이선스
Creative Commons License
posted by 미나토
2008/01/17 11:07 Flash Platform



회사에서 교육을 위해 강의 자료를 만들고 있는 중... 졸립고 귀찮다. 어차피 회사 내 플래시 개발자는 나랑 부사수 뿐인데...


////////////////////////////////////////////




AS3.0 의 Document Class 를 이용한 작업

1. AS2.0 까지의 개발 방법


타임라인 애니메이션이 없는 어플리케이션을 플래시로 제작할 때 대부분의 개발자는 원프레임 개발을 한다. 플래시의 타임라인에 있는 1 프레임만을 사용한다고 해서 불려지는 이름이다.

타임라인을 이용한 개발은 메뉴나 에니메이션과 같이 모션이 들어가 있어서 프레임을 이용한 개발이 더 효율적일 때나 사용하게 된다.
이런 상황 이외에는 대부분 원프레임 개발을 한다.

그 이유는 타임라인이라는 것은 일반적인 랭귀지의 순차실행이 아닌 시간이라는 요소가 영향을 끼치기 때문이다. 그러다 보면 클라이언트 PC 에 따라 그 시간이라는 요소가 불규칙 적일 수 있고 어떠한 이벤트 발생을 예측하기가 어려워진다.
그리고 타임라인 이라는 요소는 ActionScript 란 언어(이하 AS) 만의 고유한 특징으로 다른 쪽 개발자가 이해하기가 어렵다.


그리고 플래시 라이트(모바일용 플래시) 보다야 덜하지만 플래시 어플리케이션의 규모가 커지면서 그 성능과 최적화가 중요요소로 자리잡게 되면서 메모리를 잡아먹을 필요없는 자원은 과감히 버려야 할 필요가 있게 되었다.


as2.0까지의 기존의 방식대로 타임라인에 메인 파일을 인클루드하여 사용하는 방법은 결과물이 MovieClip Class 로 생성된다. as 2.0의 플래시 플레이어 자체가 커다란 무비클립으로 이루어져있기 때문이다.
타임라인이라는 것은 MovieClip Class 에 들어있는 기능이고 지금까지의 개발은 사용하지도 않는 타임라인 관련 메소드와 속성을 어플리케이션에 담아왔다고 할 수 있다.


이제는 그것을 버려야 할 때가 왔다.





2. Document Class 를 사용하는 방법


일단 기우에서 먼저 말하자면 Document Class는 개인이 만들어낸 메인 파일이지 어떠한 내장 클래스가 아니다. 자바의 Main 파일을 생각하면 된다

Document Class 는 보통 Sprite Class 를 상속받아서 사용한다. Sprite Class 는 MovieClip Class 의 부모 클래스로서 타임라인이 빠진 무비클립이라고 생각하면 이해하기가 쉽다.
Sprite Class 는 다음과 같은 상속 관계를 가진다

MovieClip Class > Sprite Class > DisplayObjectContainer > InteractiveObject > DisplayObject

DisplayObject : 클라이언트가 눈으로 보게 되는 화면을 이루는 모든 종류의 객체
InteractiveObject : DisplayObject 중 마우스와 키보드이벤트에 반응하는 객체
DisplayObjectContainer : 자신 안에 다른 DisplayObject 를 담을 수 있는 객체 (무비클립 안에 다른 무비클립, 그래픽심볼, 텍스트 필드가 들어가 있듯이...)

어플리케이션은 일단 눈으로 보여야 하고 사용자의 입력장치에 반응해야 하며 안에 무언가는 담겨 있어야 하니 기본적으로 Sprite Class 를 사용하게 되는 것이다. 당연히 타임라인을 사용할 일이 생기면 MovieClip Class 를 상속받아서 만들면 된다


기본적으로 다음과 같이 시작하게 된다.


package    // 패키지 경로
{
    import flash.display.Sprite; // Sprite class 를 사용하기 위하여 클래스 임포트

    public class Main extends Sprite // Sprite class 를 상속받은 Main 클래스
    {
        public function Main() // Main 클래스의 생성자
        {
            trace("welcome to AS3.0"); // 아웃풋 창에 "welcome to AS3.0" 문자열 출력
        }
    }
}


이렇게 만들어놓고 Main.as 라는 파일명으로 저장하면 된다. 이걸 컴파일 해서 swf 파일로 만들어보자


flash 에서 File > New 클릭
팝업으로 뜨는 New Document 창에서 맨 위의 Flash File (ActionScript 3.0) 더블클릭 후 Main.fla 로 저장
새로 만들어진 문서의 아래쪽 Properties 탭에서 비어있는 Document Class 에 위에 저장해 놓은 파일명인 Main 라고 기입
Control > Test Movie 로 컴파일하여 Main.swf 파일 생성

이렇게 하면 아웃풋창이 뜨면서 "welcome to AS3.0" 를 확인하게 된다. 드디어 Main.swf 란 어플리케이션을 만들게 되었다.


p.s. package 의 경로를 설정하였다면 Properties 탭에도 똑같이 쓰면 된다.

예를 들어

package com.minarto.app
{
    import flash.display.Sprite;

    public class Main extends Sprite
    {
    }
}



이렇게 만들었다면 Properties 탭에 com.minarto.app.Main 이라고 쓰면 된다.



크리에이티브 커먼즈 라이선스
Creative Commons License
posted by 미나토