노무현 대통령 배너

Tag: getChildByName

도큐먼트 클래스 *.as 파일을 연결하지 않은 fla 파일의 도큐먼트 클래스 이름은?

by 세계의끝 on 2.25, 2010, under AS3.0

작년 7월에 작성한 “AS3.0 로더(Loader)로 불러온 다른 swf 의 클래스 사용하기” 를 보면, ApplicationDomain 클래스의 getDefinition() 메서드를 이용해서 다른 로더를 통해 가지고 온 다른 swf 파일의 클래스를 사용하는 방법을 알아본 바 있습니다.
그런데 이 포스트에 “료”님이, fla 파일의 타임라인에 직접 코딩한 경우에는 어떻게 해야 하느냐고 질문하셨길래 방법을 찾아 보았습니다.

우리가 Fla 에 도큐먼트 클래스를 연결해서 swf 를 만들었을 경우, Main.as 도큐먼트 클래스에서 trace( this ) 를 하면 [object Main] 이 출력 됩니다. “AS3.0 로더(Loader)로 불러온 다른 swf 의 클래스 사용하기” 의 예제 코드를 보면 다른 swf 의 도큐먼트 클래스의 이름을 통해 런타임으로 클래스로 만들고 그것을 객체화 하여 도큐먼트 클래스 내부에 있는 여러가지 자원들을 참조하게 됩니다. 도큐먼트 클래스의 이름이 곧 ApplicationDomain 이 되는 것이죠. 그것은 결국 도큐먼트 클래스의 클래스 이름을 알 수 없다면 getDefinition() 으로는 참조가 불가능하다는 이야기가 됩니다.

그런데 만약 도큐먼트 클래스를 사용하지 않은 fla 파일로 만든 swf 파일이라면 어떻게 되는 걸까요? “료”님의 질문을 받고 저역시 이 부분에서 살짝 당황했습니다. 도큐먼트 클래스 as 파일이 없는데 도큐먼트 클래스의 이름을 어떻게 알아낼 수 있을까 하는 것이었죠.

(계속 읽기…)

5개의 댓글 :, , , , , , , , , , , , , , , more...

AS2.0과 AS3.0의 무비클립 부모자식 관계 차이점 이해

by 세계의끝 on 4.30, 2009, under AS3.0

AS2.0의 무비클립의 포함 관계에서는 대상을 참조하기 위해서 . (dot:점) 을 찍고 계속 참조할 수 있습니다.
실제로 무비클립의 참조에서는 부모 무비클립 안에 자식 무비클립이 들어가 있죠.

그런데 AS3.0의 addChild 는 메소드명이 그래서 그런지 AS2.0처럼 실제 부모안으로 자식을 집어넣는다고 이해하는 경우가 종종 있는것 같습니다.

가령 아래와 같은 코드가 있을때

0
1
2
3
4
//mc는 스테이지에 놓여져 있는 무비클립
var k:MovieClip = new MovieClip();
mc.addChild( k );
 
trace( mc.k ) // 출력 : undefined

이렇게 참조하려고 할 수 있겠습니다. 그러나 출력 결과에서 보시듯이 undefined 가 나오게 됩니다. 이것은 addChild를 AS2.0의 무비클립의 포함관계, 또는 계층구조로 이해하려고 하는 습관 때문입니다.
아래의 코드를 보시면,

0
1
2
3
4
5
6
var k:MovieClip = new MovieClip();
k.name = "name_k"; // 이렇게 인식하기 좋도록 name 속성을 주고.
mc.addChild( k );
 
trace( mc.getChildByName( "name_k" ) ); //출력 : [object MovieClip]
trace( mc.getChildAt( 1 ).name ); // 출력 : name_k (mc 안에 도형이 하나만 있어서 도형이 index가 0이고 k의 index가 1이 되므로 k를 가리키게 됨.)
trace( k ); // 출력 : [object MovieClip]

이 trace 구문들을 보고 뭔가 무릎을 탁 치고 느끼는게 있다면 AS3.0 앞에 놓인 벽 하나를 넘은 셈이 됩니다.

AS2.0에서의 무비클립의 부모자식 관계와 마찬가지로, AS3.0에서도 드로잉 툴에서 무비클립을 만들어 자식을 포함시켜 나가면 AS2.0과 동일하게 점찍고 참조도 가능합니다. AS3.0에서도 당연히 물리적으로(시각적) 무비클립을 포함하는 관계를 만들수도 있죠.

그러나 addChild 로 엮어진 관계는 그런 포함관계가 아니라 수평적으로 엮인 관계 입니다. 실제 인간세상에 비유하자면 양부모와 양자녀 관계라고 할 수 있을것 같습니다.
즉 물리적으로 부모클립에 들어가는 관계가 아니라 논리적으로 엮인 관계인 것이죠.
위의 코드에서 보듯이 점찍고 호적문의 ( getChildByName ) 를 해서 참조도 가능하고, 직접 k 를 잡고 핸들링도 가능합니다. AS2.0 에 비해 참조 방법이 늘어나서 좀더 수월하다고 느낄 수도 있을 것입니다.

 

이 글은 플생사모의 질문 글에 대한 답변으로 작성되었습니다. ( http://cafe.naver.com/flashdev/37371 )

12개의 댓글 :, , , , , , , , more...

AS3.0에서의 인스턴스네임 핸들링

by 세계의끝 on 4.27, 2009, under AS3.0

instance_name

Flash CS4 의 속성 패널

이 글은 AS2.0에서는 원하는 화면을 제어할 줄 아는 사람이, AS3.0 으로 넘어갈때 겪게되는 문제점 중의 하나인 인스턴스 네임에 대해 다루는 글 입니다.

AS2.0에서는 속성패널에 instance name 을 넣고 나면, 부여한 이름으로 액션 패널에서 모든 속성을 조절할 수 있습니다.  AS3.0 에서도 Flash IDE (흔히 Flash 프로그램 으로 부르는 개발환경)의 scene(한글판 : 장면)에 그림을 그리고, F8 키를 눌러 심볼로 변환 한 후, 속성패널에서 instance name 을 지정해 주면, F9 를 눌러 나오는 액션 패널에서 프레임에 스크립트를 작성하여 동일하게 속성을 변경해 줄 수 있습니다만,  AS3.0을 사용하면서 프레임에 스크립트를 작성하는 경우는 거의 없다고 할 수 있겠죠.

일단 아래의 도큐먼트 클래스를 보시면,

0
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
package
{
	import flash.display.Sprite;
 
	public class ExampleClass extends Sprite
	{
		public function ExampleClass ()
		{
			var item:Sprite = new Sprite();
			item.graphics.lineStyle(0, 0, 0);
			item.graphics.beginFill(0x000000, 1);
			item.graphics.drawCircle(50, 50, 50);
			item.graphics.endFill();
 
			addChild(item);
 
			trace(item.name); // 출력 : instance1
			item.name = "myname";
			trace(item.name); // 출력 : myname
 
			doAction();
		}
 
		private function doAction():void
		{
			getChildByName("myname").x = 100;
		}
	}
}

도큐먼트 클래스 내부에서 런타임에 item 을 생성한 경우에, AS2.0의 감각으로 보면 Sprite 의 인스턴스 네임이 item 으로 지정된 것 처럼 보이지만, 위의 코드에서 item 은 생성자 안에 있는 지역변수명일뿐, AS2.0의 감각에서 느끼는 무비클립의 인스턴스 네임이 아닙니다.

이렇게 느끼게 되는 가장 큰 이유는 AS2.0 에서 인스턴스 네임을 주는 방식이 속성창에 입력하는 방식 이외에 액션패널에서 아래와 같이 지정할 수 있기 때문입니다.

0
1
2
//스테이지에 무비클립 mc 가 있음
mc._name = "mc2"; // _name 속성을 바꿈
mc2._x; = 0 // 올바르게 작동함

즉, 속성 패널에서 인스턴스 네임을 주는것과, 액션 패널에서 무비클립에 _name 속성을 주는것이 완전히 동일한 행위 입니다.

그러나 AS3.0 에서는 시각적 객체인 Sprite나 MovieClip 을 만들면서 name 속성을 부여해도 AS2.0과 같은 방식으로 핸들링이 불가능 합니다. 그 이유는 AS3.0 도큐먼트 클래스 생성자 안에 있는 trace(item.name); // 출력 : instance1 부분을 통해 알 수 있습니다. AS2.0 이라면 item 이라고 출력되어야 할 텐데, 위에서 보듯이 임의로 자동 설정된 인스턴스네임이 출력됩니다.
AS3.0 에서 인스턴스 네임은, 스테이지에 addChild 되는 순서대로 instance1, instance2 … 이렇게 정해집니다.

인스턴스가 어떤 name 을 가지고 있는지 확실하게 알 수 있거나 특정한 name 속성을 부여한 경우에는 가장 위의 도큐먼트 클래스의 doAction() 함수 내부에서 하는 것처럼,

0
getChildByName("myname").x = 100;

위와 같이 getChildByName() 메서드를 사용하여 인스턴스를 잡아내면 됩니다.

그러나 무비클립등이 동적으로 생성되는 경우에는, for 문 등에서 변수 이름이 지역변수로 돌기 때문에, 무비클립에 특정 인스턴스 네임을 가지도록 할수 없습니다. 다시한번 상기시켜드리지만 AS3.0에서의 인스턴스네임과 name 속성은 완전히 다릅니다. AS3.0 에서의 name 속성은 그냥 이름표 정도로 생각하시는 것이 정신 건강상 좋습니다.

인스턴스가 동적으로 생성되는 경우에는 인스턴스 네임을 알 필요가 없는 방법으로 핸들링 하게 됩니다.

0
1
2
3
4
5
6
7
var instanceArray:Array = new Array()
 
for(var i = 0; i < len; i++)
{
	instanceArray[k] = new Sprite()
}
 
instanceArray[0].x = 100; //첫번째 만들어진 Sprite 위치를 변경

위와 같은 방법으로 인스턴스를 생성함과 동시에 배열에 넣어서 배열원소로 핸들링 하면 됩니다.

2개의 댓글 :, , , , , , more...

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!