2010년 4월 7일 수요일

parent 대신 callback 함수 사용하기

Actionscript 2.0 에서는 parent를 사용하였다. Actionscript 3.0 에서는 parent를 절대 사용하면 안되다. 무조건!!!! 왜냐하면 parent를 사용하게 되면 종속관계에 있어 강한 결합이 되어 유지보수 등이 어려워진다.

 

parent를 쓰지 않고 부모 클래스에 접근하는  방법은 두가지가 있다.

 

Event

 

 

 

Main 클래스가 있고 Sample 클래스가 있다. 그런데 Sample 클래스에서 Main 클래스에 값을 전달하고 싶은때 Sample 클래스의 메서드에서 dispatcEvent를 발생시켜 Event 를 통해 메인에 값을 전달할 수 있다. 이벤트에 대해서는 다음에 자세히 알아보도록 하자.

 

CallBack 함수

 

 

 

callback 함수를 사용하게 되면 이벤트 객체 만드는 시간이 줄어들고, 또한 다이렉트로 연결할 수 있다.

 

예제를 한번 만들어보자.

 

1. 폴더 하나를 만들고 그 폴더안에 플래시 파일 하나와 CallBack.as파일 하나를 만든다.

2. 그 안에 classes라는 폴더를 하나 더 만든다.

 

 

3. classes 폴더 안에 display라는 폴더를 하나더 만든다.    display 폴더 안에 Seed.as 파일

   을 하나 만든다.

 

 

 

 

 

4. 플래시 파일의 properties에서 Class에 CallBack이라고 적는다.

 

 

자, 이제 모든 준비는 끝났다. 이제 CallBack 함수를 이용하여 만들어보자.

 

먼저, CallBack.as 파일을 작성해보자.

 

 

[code as3]
package
{
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.MouseEvent;

import classes.display.Seed;

public class CallBack extends Sprite
{
 public function CallBack()
 {
  super();  // Sprite 객체 생성

  configreListeners(); // stage 설정
 }

 /**
  *  @private
  *  화면 설정
  */
 private function configreListeners():void
 {
  stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler); // 화면 전체 영역 이벤트 등록
 }

 /**
  *  @private
  *  마우스 효과
  *
  *  seedTransparent : 내부 메서드
  *  seed.onTransparent : 외부 Seed 클래스 내부의 _onTransprarent 속성에
  *                                 seedTransparent함수 전달.
  *  scaleX, scaleY : 객체의 가로, 세로 크기 (백분율)
  */
 private function mouseMoveHandler(event:MouseEvent):void
 {
  var seed:Seed = new Seed(); // 마우스효과 줄 객체 생성

  seed.onTransparent = seedTransparent; // 함수명만 적어주면됨

  seed.x = mouseX; // 객체의 X좌표 값을 현재 마우스의 X좌표로 위치 설정  
  seed.y = mouseY; // 객체의 y좌표 값을 현재 마우스의 y좌표로 위치 설정

  var ratio:Number = Math.random(); // 임의의 비율값

  seed.scaleX = ratio; // 객체 가로크기 임의의 비율값 적용
  seed.scaleY = ratio; // 객체 세로크기 임의의 비율값 적용

  seed.alpha = Math.random(); // 임의의 알파값 적용

  addChild(seed); // 객체 화면에 표시
 }

 /**
  *  @private
  *  객체 제거
  *
  *  @param  diaplay  Seed 객체
  */
 private function seedTransparent(display:DisplayObject):void
 {
  removeChild(display); // 화면에서 제거
 }
}
}
[/code]

 

그럼 이제 Seed.as 파일을 만들어보자.

 

[code as3]
package classes.display
{
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.ColorTransform;

public class Seed extends Sprite
{
 public function Seed()
 {
  super();  // Sprite 객체 생성

  vx = Math.random() * 10 - 5; // -5 ~ 5 사이값
  vy = Math.random() * 10; //0 ~ 10 사이값 : 아래로 떨어질거라 무조건 상수값

  gravity = 1; // 중력가속도 값 설정

  addEventListener(Event.ENTER_FRAME, alphaEnterFrameHandler);
 }

 /**
  *  @private
  *  속도 : X
  */
 private var vx:Number;

 /**
  *  @private
  *  속도 : Y
  */
 private var vy:Number;

 /**
  *  @private
  *  중력가속도
  *
  *  Number사용 : 소수점나옴 : 좀더 자연스러움을 주기위해
  */
 private var gravity:Number;  

 /**
  *  @private
  *  callBack 함수
  */
 private var _onTransparent:Function;

 /**
  *  @private
  *  seeTransparent() 설정
  *
  *  @param   value  CallBack 클래스의 seedTransparent() 메서드
  */
 public function set onTransparent(value:Function):void
 {
  _onTransparent = value; // seeTransparent()를 _onTransparent로 설정
 }

 /**
  *  @private
  *  seeTransparent() 조정
  */
 public function get onTransparent():Function
 {
  return _onTransparent;
 }

 /**
  *  @private
  *  객체 알파값 설정
  */
 private function alphaEnterFrameHandler(event:Event):void
 {
  vy = vy + gravity; // 중력가속도값(gravity)에 임의의 y속도를 더하여 중력가속도가 됨

  this.x += vx; // X속도 값을 현재 객체의 x좌표값으로 설정
  this.y += vy; // Y속도 값을 현재 객체의 Y좌표값으로 설정

  this.alpha -= 0.05; // 화면에서 점점사라지게 설정

  this.scaleX += 0.05; // 가로크기 증가
  this.scaleY += 0.05; // 세로크기 증가

  var ct:ColorTransform = this.transform.colorTransform; // 객체 색상 변경

  ct.color = Math.random() * 0xFFFFFF; // 임의의 색상 설정

  this.transform.colorTransform = ct; // 설정 색상값 적용

  if(this.alpha < 0) // 객체가 화면에 보이지 않으면
  {
   removeEventListener(Event.ENTER_FRAME, alphaEnterFrameHandler); //알파로 안보일뿐 사라지지(삭제)는 않음

   if(_onTransparent != null) // _onTransparent속성에 함수가 설정되지 않으면
   {
    _onTransparent(this); // CallBack 클래스의 seedTransparent()의 파리미터로 객체를 넘겨준다.
   }
  }
 }
}
}
[/code]

 

 

 

 

댓글 없음:

댓글 쓰기