2010년 3월 26일 금요일

Sprite 클래쓰 - Drag & Drop( 영역 대 포인트 : hitTestPoint )

 

- hitTestPoint( x:Number, y:Number, shapeFlag:Boolean = false ) 메소드는 영영 대 영역과

   다르게 매개변수인 x와 y의 위치로 겹침 여부를 따진다. 여기서 shapeFlag는 표시 객체의 실제 픽셀과의

   겹침을 판단할 것인지 아니면 경계 상자로 판단할 것인지의 여부이다. 기본값은 false를 갖는다. 밑에서의

   예제처럼 true를 하면 별모양 무비클립의 x와 y좌표가 stage에 있는 글자와 직접적으로 겹쳐야 메소드의

   반환값을 true로 준다.

 

 

[code as3]
package classes.view
{
import flash.display.Sprite;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.TimerEvent;
import flahs.utils.Timer;

public class HitTestPoint extends Sprite
{
    public function HitTestPoint()
    {
        super();

        config();
    }

    private function config() : void
    {
        var timer:Timer = new Timer( 300, 50 );

        timer.addEventListener( TimerEvent.TIMER, timerHandler );

        timer.start();
    }

    private function timerHandler() : void
    {
        var star:Star = new Star();

        star.tx = Math.random() * 3 + 1;
        star.ty = Math.random() * 3 + 1;

        addChild( star );

        start.addEventListener( Event.ENTER_FRAME, enterFrameHandler );
    }

    private function enterFrameHandler( e:Event ) : void
    {
        var mc:MovieClip = MovieClip( e.target );

        if( mc.x < 0 || mc.x > stage.stageWidth )
        {
            mc.tx = -mc.tx;
        }

        if( mc.y < 0 || mc.y > stage.stageHeight )
        {
            mc.ty = -mc.ty;
        }

        if( kjh.hitTestPoint( mc.x, mc.y, true ) )
        {
            mc.gotoAndStop(2);
            mc.rot = -5;
        }
        else
        {
            mc.gotoAndStop(1);
            mc.rot = 5;
        }

        mc.x = mc.tx;
        mc.y = mc.ty;
        mc.rotation = mc.rot;
    }
}
}
[/code]

Timer클래스를 이용해서 300/10000초에 tiemrHandler함수를 50번 호출한다.

random()함수를 이용해서 tx라는 변수에 1~3사이의 난수를 넣어놓고, 그 난수를 star.tx에 넣어 둔다.

star에 이벤트 등록을 하고 enterFrameHandler 함수에서 이벤트를 통해 e.target(star)를 MovieClip으로

형변환 시킨다.

여기서 형변환을 하는 이유는 http://help.adobe.com/ko_KR/AS3LCR/Flash_10.0/index.html?flash/display/Graphics.html&flash/display/class-list.html 여기에서 보는 바와 같이 target 이라는 속성

자체가 Object로 인식되기 때문에 MovieClip클래스를 확장한 Star 클래스로 star라는 객체를 생성해도

MovieClip이 아닌 단지 Object라 반드시 "형 변환" 을 시켜준다.

그리고 mc의 x, y좌표가 양 쪽 끝이나 stage에 위, 아래에 닿으면 반대방향으로 튕겨 움직이도록 좌표값을

-로 바꿔 넣어준다.

hitTestPoint의 메소드로 겹침여부를 확인한 후, true이면 mc를 2번째 프레임으로 가게해서 노랑색으로

바꾸어 주고, 5도만큼 반대방향으로 각도를 바꿔주면서 tx만큼 간다.

 

 

* hitTestPoint 메소드를 위 예제처럼 TextField를 이용하여 적용시키려면 비트맵 형태로 바꾸어 주어야

      한다. TextField에서 글자를 모두 선택 후, Ctrl + "B" 를 두번 해주어야 비트맵의 형태로 바뀐다.

     

 

댓글 없음:

댓글 쓰기