2010년 4월 3일 토요일

callBack - 콜백함수를 이용한 paricle예제

 

기존에 쓰던 parent속성은 종속관계가 있어 강한 결합을 만들기 때문에 대신 약한 결합인 콜백함수를 써보자

 

 

Particle.as

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

import classes.display.Seed;

public class Particle extends Sprite
{
    public function Particle()
    {
        super();
   
        config();
    }

    /**
     *    @private
     *    stage에 MouseMove이벤트 등록
     */
    private function config() : void
    {
        stage.addEventListener( MouseEvent.MOUSE_MOVE, mouseMoveHandler );
    }

    /**
     *    @private
     *    seed객체 생성과 초기화
     */
    private function mouseMoveHandler( e:MouseEvent ) : void
    {
        var seed:Seed = new Seed(); //seed객체 Sprite로 생성

        seed.onTransParent = seedTransParent; //Seed.as에 함수에 seedTransParent 대입

        seed.x = mouseX; //seed의 x좌표값을 현재 마우스의 x좌표로 대입
        seed.y = mouseY; //seed의 y좌표값을 현재 마우스의 y좌표로 대입

        var ratio:Number = Math.random(); //ratio라는 변수에 랜덤값 생성

        seed.scaleX = ratio; //seed의 scaleX를 ratio로 대입
        seed.scaleY = ratio; //seed의 scaleY를 ratio로 대입

        seed.alpha = Math.random(); //seed의 alpha값을 랜덤하게 만듦

        addChild( seed ); //화면에 seed를 붙임
    }

    /**
     *    @private
     *    display라는 매개변수로 표시객체를 제거
     */
    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();

        vx = Math.random() * 10 - 5; //x좌표의 속도를 -5~5사이
        vy = Math.random() * 10; //y좌표의 속도를 0~10사이

        gravity = 1; //중력가속도의 값은 1

        addEventListener( Event.ENTER_FRAME, alphaEnterFrameHandler );
    }

    //-----------------------------------------------------
    //    variables
    //-----------------------------------------------------
    private var vx:Number; //x 속도
    private var vy:Number; //y 속도
  
    private var gravity:Number; //중력가속도 변수

    private var _onTransParent:Function; //function객체 생성. _onTransParent = null

    //-----------------------------------------------------
    //     properties
    //-----------------------------------------------------
    public function set onTransParent( value:Function ) : void
    {
        _onTransParent = value;
    }

    public function get onTransParent() : Function
    {
        return _onTransParent;
    }

    /**
     *    @private
     *    중력가속도와 속도, alpha와 scaleX scaleY, color 등 효과 적용
     */
    private function alphaEnterFrameHandler( e:Event ) : void
    {
        vy = vy + gravity; //속도y좌표에 중력가속도를 더함

        this.x += vx; //seed의 x좌표에 속도x씩 더함
        this.y += vy; //seed의 y좌표에 속도y씩 더함

        this.alpha -= 0.05; //seed의 alpha를 0.05씩 감소시킴

        this.scaleX += 0.05; //seed의 scaleX에 0.05씩 더함
        this.scaleY += 0.05; //seed의 scaleY에 0.05씩 더함

        var ct:ColorTransform = this.transform.colorTransform; //colorTransform객체 생성

        ct.color = Math.random() * 0xFFFFFF; //위에서 생성한 ct에 랜덤 색상을 넣어줌

        this.transform.colorTransform = ct; //seed의 색상을 ct의 랜덤컬러로 변경

        if( alpha < 0 ) //seed의 알파가 0.05씩 줄어서 0보다 작으면 true, 아니면 false
        {
            removeEventListener( Event.ENTER_FRAME, alphaEnterFrameHandler ); //alpha가 0이면 enterFrameEvent제거

            if( _onTransParent != null )
            {
                _onTransParent( this );
            }
        }
    }
}
}
[/code]


- Particle클래스에서 Seed클래스에 있는 Function으로 생성된 함수를 참조하는 것이다.

  마치 매개변수를 넘겨주듯이 하면 된다. 데이터를 넘겨줄 때 이벤트를 써서 하는 방법도 있는데

  그 방법은 이벤트 클래스를 만들고 dispatch해주는 작업에서 딜레이가 되기 때문에 보다 빠르고

  다이렉트한 방법으로 콜백함수를 쓴다
 

  Particle클래스에서 26번째줄에 stage에 MouseMove이벤트를 등록해준 것은 마우스를 stage어느 곳에서

  이리저리 움직일 때마다 원이 나왔다 사라지게 하기 위해 MouseMove이벤트를 등록해준 것이다.

  mouseMoveHandler함수는 앞에 예제에서 해보았던 것들 처럼 seed의 객체를 생성해서 그 seed에 여러

  가지 color, alpha, x와 y좌표 등의 효과를 적용시키는 부분이다.


  객체는 여는 중괄호와 닫는 중괄호로만 존재한다면 객체라 할 수 있다. 따라서 function도 객체에 속하기

  때문에 변수로 선언하여 값을 넘겨주는게 자연스럽게 이루어진다.

 

댓글 없음:

댓글 쓰기