scaleform.minarto.com

Document Class in as2 - 1 본문

Core

Document Class in as2 - 1

미나토 2012. 2. 25. 15:24

앞 포스팅과 이어집니다.



3. this 포인터의 변경


위 코드에는 눈에는 보이지 않지만 생략된 것이 있습니다.

var content:MovieClip = this.createEmptyMovieClip("contnet", this.getNextHighestDepth());


바로 this 입니다. 생략을 했지만 이렇게 this 가 붙어서 실행되는 것과 같다는 거죠.
(사실은 클로저로 설명해야 합니다만...쉽게 설명하려니 이렇게 해야겠군요.)

 
타임라인의 메소드나  변수는 __proto__ 를 통해 Document 클래스 객체의 것들을 가져다 쓰고 있지만 this 포인터는 여전히 Document 클래스 객체를 가르키고 있습니다.
그 객체는 스테이지에 존재하는 MovieClip 이 아니고 여전히 타임라인과는 무관한 그냥 Object 일 뿐입니다.

this 포인터를 바꿀 차례입니다. $main.__proto__ = this; 밑에 다음과 같은 명령을 추가 합니다.

this = Object($main);


이게 가능하냐고요? 가능합니다. this는 그냥 포인터일 뿐이니까요...
다시 content 를 만들어보면 해당 타임라인에 생성된 걸 확인할 수 있습니다.
(datatype 체크 문제 때문에 Object 로 형변환하여 넣어야 합니다.)



4. Event 처리
 


CLIK 컴포넌트를 꼭 쓰지 않더라도, CLIK 에서 제공하는 Event 프레임웍은 꽤나 편한 코딩을 할 수 있게 해줍니다.

그래서 다음과 같은 처리를 해주시는게 좋습니다.

import gfx.events.EventDispatcher;

class Document extends MovieClip {
public var addEventListener:Function, 
removeEventListener:Function,
hasEventListener:Function,
removeAllEventListeners:Function,
cleanUpEvents:Function,
dispatchEvent:Function;
public function Document($main:MovieClip) {
EventDispatcher.initialize(this);
$main.__proto__ = this;
this = Object($main);
}
}


이렇게 하고 나면 이후부터는 as3 이벤트 기반의 프로그래밍을 할 수 있습니다. 실제 CLIK 의 UIComponent 도 이런 식으로 구현되어있거든요. (이제야 scaleform 포스팅인 척을 ㅎㅎㅎ)



5. null 인자 처리
 


클래스를 재활용해보죠.

그런데 라이브러리에 있는 무비클립에 바로 이 클래스를 매핑하면 생성자 함수에 인자도 줄 수 없어서 $main 인자가 null로 들어올테니 처리가 되질 않습니다.

if ($main) {
$main.__proto__ = this;
this = Document($main);
}

이렇게 처리하면 되겠죠?


7. 마치며


코드만 보면 짧지만 주제가 좀 어려울 수 있다보니 글이 굉장히 길어졌네요...
하나의 포스팅으로 썼다가 너무 긴 듯 하여 나눠버렸습니다. 


아마도 지금껏 제가 포스팅한 글 중 가장 긴 글인 것 같기도...


실제 코드를 공개할 수 없음은 양해를 부탁드리지만 이번에는 코드를 상당히 많이 보여드렸으니, 살짝만 고치면 이 포스팅을 이해를 못하셔도 쓰시는데 큰 문제는 없을겁니다.


사실 as2를 이렇게 깊이(?) 고쳐서 쓰지는 않았었는데, 제가 여기까지 연구한 것에는 다름 아닌 js 프로그래밍이 상당히 도움이 되었습니다. 작년 말부터 js 스터디를 했거든요.

as2는 js를 베낀(?) 놈이라고 여러번 언급했었습니다.

as2 공부를 하려면 js 공부부터 하시는게 좋으실 겁니다 :^)