본문 바로가기

동강의AS3.0 강좌

[Base] 8강 - Timer, Loader 클래스의 사용.


요즘엔 구글링을 하면서, 이 사이트 저 사이트 많이 돌아 다니고 있는데, 정말 세상을 넓고, 대단한 사람들은 많다 라고 세삼 느껴지네요.  

월요일 입니다. 다들 피곤하시져?? 주말에도 일하신 분들도 있으실테고, 주말 동안 푹 쉬신 분들도 있을 겁니다.  월요일이고, 새롭게 시작하는 느낌으로 일주일을 시작하는것도 좋을듯 싶습니다.  

이번에 볼 내용은 Timer class 와 Loader class 입니다. 두 클래스 모두 강력한 기능으로 작업의 능률을 높여 주는 그런 클래스들 입니다. 우선 Timer class 부터 레퍼런스를 살펴 봅시다.  

 Timer 

클래스  public class Timer
상속 Timer  EventDispatcher  Object

언어 버전 :  ActionScript 3.0
Player 버전 :  Flash Player 9

 

 
  Timer(delay:Number, repeatCount:int = 0)
  지정된 지연 및 반복 횟수 상태를 사용하여 새 Timer 객체를 만듭니다.  
 
  1. var time:Timer = new Timer(1000,5);
  2. time.start();

  delay 시간은 ms 단위로 합니다. 1000 = 1초가 되는 거지요. repeatCount 는 이 timer을 몇번 반복해서 실행 시키겠는가?

  위에서는 5번 실행 시키고 실행을 중단하게 됩니다.

 꼭 start() 를 해줘야 시작이 되고, 멈추는건 stop(); 으로 멈출수 있습니다. 그러면 저거 두개만 으로 어떻게 Timer 를 활용하는가? 보통 TimerEvent 라는 Timer 가 가지고 있는 기본 이벤트와 함께 사용됩니다.

 

 
  1. package{
  2.        
  3.         import flash.display.Sprite;                  
  4.         import flash.events.TimerEvent;                // 기본 import
  5.         import flash.utils.Timer;
  6.        
  7.         public class TimerExample extends Sprite
  8.         {
  9.                 private var time:Timer;                   // 객체 정의
  10.                
  11.                 public function TimerExample():void
  12.                 {
  13.                         time = new Timer(1000,5);
  14.                         time.start();
  15.                         time.addEventListener(TimerEvent.TIMER,ontimerhandler);
  16.                         time.addEventListener(TimerEvent.TIMER_COMPLETE,onCompletehandler);
  17.                
  18.                 }
  19.                 private function ontimerhandler(event:TimerEvent):void
  20.                 {
  21.                         trace("1초");
  22.                        
  23.                 }
  24.                 private function onCompletehandler(event:TimerEvent):void
  25.                 {
  26.                         trace("타임 끝");
  27.                 }
  28.                
  29.         }
  30. }

 

time.addEventListener(TimerEvent.TIMER,ontimerhandler);
1초 마다 실행되는 함수를 정의합니다. 지정한 시간에 호출되는 함수를 정의(이벤트를 생성시켜줌)

time.addEventListener(TimerEvent.TIMER_COMPLETE,onCompletehandler);
time 이 모두 실행 된 후에 실행되는 함수를 지정 (이벤트를 생성시켜줌)

//output

1초
1초
1초
1초
1초
타임 끝

우리가 쓰고 있는 enterframe 이 fps 단위로 실행되는 반면, Timer 는 초 단위로 실행 됩니다. Timer 가 enterframe 에 비해서 정확할수 있다고 말하는것도 여기에 있는듯 합니다. 다른 속성도 있으나 잘 쓰이지 않으므로 레퍼런스를 한번 보시는것도 좋을듯  싶습니다.

 

 Loader

 

 
  클래스 public class Loader
  상속 Loader  DisplayObjectContainer InteractiveObject  DisplayObject  EventDispatcher  Object

 

 
 Loader()
 SWF, JPEG, GIF 또는 PNG 파일 등을 로드하는 데 사용할 수 있는 Loader 객체를 만듭니다.
 
 
  1. var ld:Loader = new Loader();
  2. ld.load(new URLRequest("image.jpg"));

 ld 라는 로더를 만들어서 URLRequest 로 정의된 주소값의 jpg나 gif png swf 파일을 로드 합니다.

 

참고 ) URLRequest

URLRequest 클래스는 하나의 HTTP 요청에 포함된 모든 정보를 캡처합니다.

말이 어려워지므로, 걍 주소를 정의하기 위해서는 URLRequest 타입으로 해야 된다는것만 알아 주세요

(2.0 과의 차이점입니다. )

 

 

 
  1. package{
  2.        
  3.         import flash.display.Sprite;
  4.         import flash.display.Loader;
  5.         import flash.events.*;
  6.         import flash.net.URLRequest;
  7.         import flash.display.DisplayObject;
  8.  
  9.         public class LoaderExample extends Sprite{
  10.                
  11.                 private var ld:Loader;
  12.                
  13.                 public function LoaderExample():void
  14.                 {
  15.                         ld = new Loader();
  16.                         var url:URLRequest = new URLRequest("image.jpg");
  17.                         ld.load(url);
  18.                         ld.contentLoaderInfo.addEventListener(Event.COMPLETE, completehandler);
  19.                         ld.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progresshandler);
  20.                        
  21.                         addChild(ld);                  
  22.                 }
  23.                 private function completehandler(event:Event):void
  24.                 {
  25.                          var mObject:DisplayObject = event.target.content;
  26.                          mObject.width=100;
  27.                          mObject.height=100;
  28.                        
  29.                 }
  30.                 private function progresshandler(event:ProgressEvent):void
  31.                 {
  32.                         var mPercent:Number =int( event.bytesLoaded/event.bytesTotal*100.0);
  33.  
  34.                         trace(mPercent);
  35.                 }
  36.                
  37.         }
  38.        
  39. }

 

같은 폴더에 image.jpg 라는 파일이 있어야 로드가 됩니다. 없으면 URL 에러를 일으킴니다.

 

//output

로드중
로드중
로드중
로드중
로드끝

 

여기서 contentLoaderInfo 는 뭔가?

  contentLoaderInfo : LoaderInfo
[read-only] 로드 중인 객체에 해당하는 LoaderInfo 객체를 반환합니다.
 

LoaderInfo 란 Loader 에 의해 불러와지는 데이터의 정보 입니다. 예를 들면 jpg 이미지라면 크기 (width, height 가 있겠지요?)

Loader 는 이러한 LoaderInfo 를 참조하여 그 값들을 변경할수 있습니다. 어쩌피 이미지가 swf 파일이 로드 되는 것도 bitmapdata 를 거쳐서 들어 오는것이기 때문에 변환이 가능합니다. ( 하지만 크로스 브라우징 문제가 발생할수도 있습니다 )

 

  1.  
  2. package{
  3.        
  4.         import flash.display.Sprite;
  5.         import flash.display.Loader;
  6.           import flash.display.DisplayObject;
  7.         import flash.events.*;
  8.     import flash.net.URLRequest;
  9.  
  10.         public class LoaderExample extends Sprite{
  11.                
  12.                 private var ld:Loader;
  13.                
  14.                 public function LoaderExample():void
  15.                 {
  16.                         ld = new Loader();
  17.                         var url:URLRequest = new URLRequest("image.jpg");
  18.                         ld.load(url);
  19.                         ld.contentLoaderInfo.addEventListener(Event.COMPLETE, completehandler);
  20.                         ld.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progresshandler);
  21.                        
  22.                         addChild(ld);                  
  23.                 }
  24.                 private function completehandler(event:Event):void
  25.                 {
  26.                          var mObject:DisplayObject = event.target.content;
  27.                          mObject.width=100;
  28.                          mObject.height=100;              // 로드된 이미지는 100 / 100 으로 사이즈 변경
  29.                        
  30.  
  31.                 }
  32.                 private function progresshandler(event:ProgressEvent):void
  33.                 {
  34.                         var mPercent:Number =int( event.bytesLoaded/event.bytesTotal*100.0);
  35.  
  36.                         trace(mPercent);                // 로드 되는 과정을 알수 있다.
  37.                 }
  38.  
  39.                
  40.         }
  41.        
  42. }

 

위의 completehandler 함수에서는 event.target.content 로 정보를 받은 뒤 변경을 해 주게 되고 progresshandler 에서는 byteLoaded 를 이용해서 실시간 로드된 값을 알수 있습니다. 이것을 이용해서 로딩 바를 만들수 있습니다.  앞으로 만들어 볼것의 기본이 되는 두 클래스를 설명해 보았습니다. 잘 이해 안되는 부분은 질문 날려 주시고요 . 잘못된 부분이나 추가 내용은 댓글이나 답글 달아 주세요. 이 공간의 저 만의 강좌 공간이 아니라, 강좌라는 주제에 대해 토의하는 공간입니다. 쑥스러워 하지 마시고, 참여 부탁드립니다. 그럼 두 클래스를 이용한 간단한 해보기 입니다.  

1. 5장의 이미지를 준비

2. 배열에 5장의 이미지를 저장

3. Timer class 를 이용해 2초에 한번씩 로드 되는 겔러리를 만든다.   

겔러리를 만들면서 Ctrl + Alt + del 을 눌러 메모리가 늘어 나는 상황을 관찰해 봅시다! 기초 스터디 팀에게는 미리 낸 해보기라, 미리 올라온 소스를 참고해 보시는것도 좋을듯 합니다. 다하신 분들은 꼭 메모리가 늘어 나는 상황을 관찰해 보시기 바람니다.   

수고 하셨습니다. 기분좋은 한주 시작 하세요!