기존에 쓰던 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도 객체에 속하기
때문에 변수로 선언하여 값을 넘겨주는게 자연스럽게 이루어진다.
댓글 없음:
댓글 쓰기