Monthly Archive for May, 2007

How to access to stage and root (AS3.0)

AS3.0 에서 사용되는 stage 와 root 의 개념은 AS2.0 버전과는 차이가 있다.

우선 stage 를 살펴보면 이전 버전에서는 stage 오브젝트는 static class 로서 주로 movie size 나 onResize 이벤트를 처리하는데 사용하였지만 새롭게 바뀐 AS3.0 에서는 플래시 무비에 존재하는 모든 displayObject 를 담을수 있는 최상위 컨테이너 개념이 첨가되었다.
이는 어떻게 생각하면 기존의 _root 와 같이 생각할 수도 있다. 하지만 바뀐 모델에 있어서 stage 속성은 인스턴스 속성이다. 다시말해, 전역적으로 접근할 수 없고 반드시 displayObject 의 인스턴스 속성으로서만 참조가 가능하다는 이야기이다. 또한 DisplayObject 가  스크린상의 timeline 이나 display list 에 등록하지 않는다면 null 값을 가지게 된다. (Document class 와 screen 상에 보여지는 오브젝트는 제외)
이런 점이 stage 속성을 사용하는데 있어 상당히 제약사항으로 작용하게 된다. 만약 DisplayObject 가 아닌 다른 Object 를 사용할때 stage 속성은 정의된 속성이 아니므로 constructor 에  stage 속성값을 parameter 로 넘겨주는 방식으로 사용할 수 밖에 없다.

<non-display object classes >

package {

import flash.display.Stage;public class CustomObject {

private var _stage:Stage;

public function CustomObject(stage:Stage) {
_stage= stage;
}
}
}

root 는 상황에 따라 다를 수 있지만 일반적으로 현재의 flash movie 에서 main timeline 을 참조할 수 있는 DisplayObject 속성이다. 다시말해 상대적인 최상위 DisplayObject 를 참조한다.
이전의 _root 속성은 전역속성으로서 가장 최상의 컨테이너를 참조하였기 때문에 로더를 통해 불러왔을경우 그 갯수에 따라 _root 의 참조값이 변하였다. 하지만 root 속성은 현재의 flash movie 를 기준으로 참조값을 얻어오기 때문에 각 swf 에 해당하는 main timeline 의 참조값이다. 즉, 이전버전에서 _lockroot 를 적용한 것 같이 root 속성을 상대적으로 참조할 수 있다. 모든 displayObject 가 각각 timeline 의 참조값을 가질 수 있다는 의미이다.
하지만 root 도 stage 속성과 마찬가지로 인스턴스 속성이다. 따라서 stage 의 제한사항을 그대로 가지고 있다.

따라서 이런 문제점들을 해결하기 위해서는 위와같이 각각의 참조값을 parameter 로 넘겨주는 방법과 초기화 함수를 실행하여 addChild 이후에 참조할 수 있도록 처리해야한다.
또다른 방법으로는 Document class 를 활용하여 전역속성으로 만드는 것이다.

Document class 에서는 Stage 에 자동으로 추가되는 main timeline 으로 인해 생성되자마자 stage 속성과 root 속성을 참조할 수 있다.

<static 속성으로 참조할 수 있는 MainStage class>

package {

import flash.display.DisplayObject;
import flash.display.*;

public class MainStage extends MovieClip {
public static var stage:Stage;
public static var root:DisplayObject;

public function MainStage() {
MainStage.stage = this.stage;
MainStage.root = this.root;
}
}
}

<Document class>

package {

public class DocumentClass extends MainStage {

public function DocumentClass() {

}
}
}

위와 같이 document class 에서 MainStage class 을 상속받아 사용하면 어느 오브젝트에서라도  전역적으로 stage를 참조 할 수 있다.
하지만 이는 전역속성으로서 의미가 있는 stage 에만 유용할 뿐 각기 다른 root 속성을 참조하기에는 문제가 있다.
root 속성 참조 대한 문제는 ADD_TO_STAGE 이벤트를  이용하여 오브젝트마다 일일이 체크하는 방법이나 아니면 초기화 함수를 실행하여 처리하는 방법밖에 없는것 같다.(어떤 다른 방법이 있을까?????)

timeline 으로 부터 종속되지 않도록 stage 속성과 root 속성을 추가한것은 참 좋은 방법인것 같다. 하지만 그로 인해 개발자들이 일일이 신경쓰지 않으면 안되는 것들이 정말 많이 생긴것 같다.

timeline 과 class……….플래시의 특성상 종속적일 수 밖에 없는데……
어떤 것이 더 나은 방법일까?….의구심이 든다.

…(rest) parameter (AS3.0)

가변적인 메소드의 parameter 갯수를 이용하려면 AS2.0 버전까지는 arguments 오브젝트를 사용하여 임의의 parameter 에 접근할 수 있었다. 하지만 AS3.0 에서는 컴파일러의 좀더 철저한 데이타 타입의 체크와 parameter 관리에 의해 기존의 방법을 쓸 수가 없게 되었다.

<AS2.0>
function parameterTest():Void{
trace(arguments.length)  //parameter 갯수를 알수 있음
}

parameterTest(1,2,3);
result–> 3

<AS3.0>
function parameterTest():void{
trace(arguments.length)
}

parameterTest(1,2,3);
result–> compiler error  : Incorrect number of arguments.

AS3.0 에서는 메소드 정의시 parameter 갯수와 호출시 parameter 갯수가 일치해야만 한다.
그렇지 않으면 위와 같이 arguments 갯수에 오류가 있다고 에러를 발생시키게 된다.
이를 위해 …(rest) paremeter 구문을 새롭게 제공하였는데 사용법은 단순히 … 뒤에 사용자가 원하는 parameter array 이름을 써주면 된다.

function parameterTest(…param):void{
trace(param.length) // param 은 배열 타입이다.
}

다른 parameter 와 같이 사용하려면
function parameterTest(str1:String,str2:String,…param):void{
//…..statements
}
마지막에 …(rest) parameter 를 써주면 된다.

주의할 점은 위 방법을 사용하면서 arguments 오브젝트를 동시에 사용할 수 없다는 점이다.