노무현 대통령 배너

Tag: Sprite

AS3.0 getDefinitionByName() 메서드를 이용한 라이브러리 자원 이용 – AS2.0 attachMovie 대응

by on 6.25, 2009, under AS3.0 API

blue_swf_iconAS2.0 시절, 프레임에서 신나게 코딩할때 라이브러리 패널에 링키지 네임을 준 무비클립을 attachMovie() 메서드를 이용해 스테이지에 불러와서 자유롭게 사용할 수 있었습니다.

AS3.0 에 들어와서는 라이브러리 패널의 링키지는 사용할 수 없지만 클래스 네임을 부여하여 별도의 클래스 파일을 만들지 않고도[01] new ClassName() 을 하여 마찬가지의 기능을 수행할 수 있습니다.

그런데 new ClassName() 에서 ClassName 부분은 정확한 클래스 이름이 와야 하고, this["str"] 나 _root["str"] 같이 AS2.0에서 흔히 사용했던 레퍼런스 참조 방법을 new 연산자 다음에는 사용할 수 없으므로 AS3.0에서 new ClassName() 으로는 아래와 같은 AS2.0의 for 문을 이용한 동적인 attachMovie() 는 사용할수가 없습니다.[02]

0
1
2
3
4
5
6
//AS2.0의 동적 attachMovie 예시
var arr:Array = new Array( "메뉴1", "메뉴2", "메뉴3" )
var len:Number = arr.length;
for ( i = 0; i < len; i++ )
{
	 attachMovie( "mc", "mc"+i, i )
}

그럼 어떻게 해야할까요?

(계속 읽기…)

  1. 정확하게는 컴파일 타임에 자동으로 클래스 파일이 생성됩니다. 그러나 개발자가 이에 관여할 필요는 없습니다. []
  2. new this["mc"+i]() 이런식으로 될리가 없다는거죠. []
4개의 댓글 :, , , , , , , , , , , , , , more...

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

by on 4.27, 2009, under AS3.0 API

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...

Timer Class를 이용한 원하는 시간에 원하는 일 하기 F1 대로 구현

by on 12.12, 2008, under AS3.0 API

플생사모에 올라온 글에 대한 답변입니다.

http://cafe.naver.com/flashdev/34255

Timer Class 의 F1에 있는 예제 그대로 사용하였습니다.

http://livedocs.adobe.com/flash/9.0_kr/main/00000074.html

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
29
30
31
32
33
34
35
36
37
package {
	import flash.display.Sprite;
	import flash.events.TimerEvent;
	import flash.utils.Timer;
 
	public class ShortTimer extends Sprite {
		public function ShortTimer() {
			// creates a new five-second Timer
			var minuteTimer:Timer = new Timer(1000,5);
 
			// designates listeners for the interval and completion events
			minuteTimer.addEventListener(TimerEvent.TIMER, onTick);
			minuteTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
 
			// starts the timer ticking
			minuteTimer.start();
		}
 
		public function onTick(event:TimerEvent):void {
			// displays the tick count so far
			// The target of this event is the Timer instance itself.
			trace("tick " + event.target.currentCount);
 
			//원하는 시간에 원하는 일 간단하게 if 문으로 실행
			if (event.target.currentCount == 3) {
				trace("3초에 할일");
				//A1.addChild (B);
			} else if (event.target.currentCount == 4) {
				trace("4초에 할일");
				//A1.addChild (C);
			}
		}
 
		public function onTimerComplete(event:TimerEvent):void {
			trace("Time's Up!");
		}
	}
}

네이버 카페, 트랙백좀 지원했으면….

댓글남기기 :, , , , , more...

  • Page 2 of 2
  • <
  • 1
  • 2

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!

Meta