scaleform.minarto.com

Document Class in as2 - 0 본문

Core

Document Class in as2 - 0

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



오늘도 주말에 회사에 나와 회사 코드를 좀 개선하려고 뜯어보고 고치고 하다가 만들어버린(실제로는 어제부터) 코드가 있습니다.

바로 as2 용 Document Class 입니다.

혹시 제가 포스팅에만 열중할거라 생각하시는 분이 있을까 하는 기우에 몇마디 드리자면,

보통 제가 포스팅을 할 때는 이렇습니다.

1. 회사 업무에 필요한 코드가 생겼다...
2. 개발
3. 파트원들에게 교육
4. 파트원들이 직접 적용하도록 함 (강의만 들으면 까먹으니깐...)
5. 그 중에서 외부에 오픈해도 될만한 주제로 선별하여 포스팅


게다가 회사 팀원들에게는 더 개선된 실제 코드를 보여주면서 강의를 하죠...

머랄까, 회사원으로서의 일종의 암묵적인 룰을 지킨다고나 할까요?


포스팅은 사실 빙산의 일각...(아니아니, 일각 보다는 좀 많이 포스팅하는군요 :^) 인 셈이죠...



1. Document Class 를 만들 수 없는 as2


as2 에서는 as3처럼 Document Class 를 만들 수 없습니다.

앞선 글에서 잠시 언급했 듯 as2 에서는 Document Class 의 부모 클래스가 되어야 할 MovieClip 이 네이티브 클래스가 아닌, DOM 으로 취급하기 때문입니다.


처음부터 as2만 쓰신 분이면 몰라도 as3의 Document Class 의 편리함을 접한 분이라면 불편한 것이 여간 많은게 아닙니다.
일반적으로 include 로 as 파일을 불러들여서 작업을 하기도 합니다만, class 문법을 사용하지 않으니 코드 재활용하기가 꽤 불편한 편입니다.

최상위 컨테이너라면 그냥 위에 언급한대로 include 만 써도 어찌어찌 짜게 되니 그럭저럭 해결되지만, 로드해서 사용하게될 swf 들이 문제입니다.


암튼 각설하고 만드는 법을 써보죠...



2. prototype


일단 만들게 될 Document class 는 MovieClip 을 상속받아야 합니다... 뭐 당연하겠죠?
Document 라고 이름지어보죠


class flashx.display.Document extends MovieClip {
public function Document($main:MovieClip) {
$main.__proto__ = this;
this = Document($main);
}
public function alert($msg:String):Void {
trace($msg)
}
}



생성자 함수는 $main 이라는 무비클립을 인자로 받습니다. 그리고 $main 의 __proto__ 라는 속성에 현재의 클래스 객체의 포인터인 this 를 연결합니다.

as2레퍼런스에는 __proto__ 라는 속성에 대해 다음과 같이 나옵니다.

객체를 만드는 데 사용되는 클래스(ActionScript 2.0) 또는 생성자 함수(ActionScript 1.0)의 prototype 속성을 참조합니다. 모든 객체는 만들어질 때 자동으로 __proto__ 속성이 지정됩니다. ActionScript 인터프리터는__proto__ 속성을 사용하여 객체의 클래스 또는 생성자 함수의 prototype 속성에 액세스하여 객체가 수퍼 클래스에서 상속하는 속성과 메서드를 알아냅니다. 


그리고 플래시의 메인 타임라인에 다음과 같이 실행합니다.

new Document(this);



자, 이러면 일단 1차 작업이 끝난겁니다.

해당 메인 타임라인에서 alert("1") 를 실행하시면 예상한 대로 alert 함수가 실행됩니다.

메인 타임라인은 무비클립입니다. 그 무비클립의 __proto__ 속성이 Document 객체를 가르키기 때문에 무비클립에서 바로 Document 클래스의 멤버변수와 함수들을 사용할 수 있게 된겁니다.

그럼 이제 생성자 함수 맨 밑에 무비클립을 생성하는 명령어를 넣어볼까요?

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


어라? _level0.contnet 라고 콘솔에 찍혀야 할 것 같지만 undefined 가 떠버립니다.
alert 는 잘 실행되었는데 말이죠.

도대체 뭐가 잘못된 걸까요?




너무 길어진 듯 하여 다음 포스팅으로 넘어갑니다 :^)