2010년 3월 25일 목요일

Sprite 클래쓰 - Drag & Drop( 영역대영역 : hitTestObject )

 

- hitTestObject( obj : DisplayObject ) 메소드는 표시 객체의 경계 상자를 평가하여 obj 표시객체의

   경계 상자와 겹치거나 교차하는지 확인한다. obj는 테스트할 표시 객체이다. 반환값은 true, false로..

 

 

예제를 보면,

 

[code as3]
package classe.view
{
import flash.display.Sprite;
import flash.events.MouseEvent;

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

        alpha_a.buttonMode = true;
        alpha_b.buttonMode = true;

        alpha_a.addEventListener( MouseEvent.MOUSE_DOWN, AstartDragHandler );
        alpha_a.addEventListener( MouseEvent.MOUSE_UP, AstopDragHandler );
        alpha_b.addEventListener( MouseEvent.MOUSE_DOWN, BstartDragHandler );
        alpha_b.addEventListener( MouseEvent.MOUSE_UP, BstopDragHandler );
    }

    private function AstartDragHandler( e:MouseEvent ) : void
    {
        alpha_a.startDrag();
        alpha_a.alpha = 0.5;
    }

    private function AstopDragHandler( e:MouseEvent ) : void
    {
        if( alpha_a.hitTestObject( alphaFrame_a ) )
        {
            alpha_a.x = alphaFrame_a.x;
            alpha_a.y = alphaFrame_a.y;
        }

        alpha_a.alpha = 1;
    }

    private function BstartDragHandler( e:MouseEvent ) : void
    {
        alpha_b.startDrag();
        alpha_b.alpha = 0.5;
    }

    private function BstopDragHandler( e:MouseEvent ) : void
    {
        if( alpha_b.hitTestObject( alphaFrame_b ) )
        {
            alpha_b.x = alphaFrame_b.x;
            alpha_b.y = alphaFrame_b.y;
        }

        alpha_b.alpha = 1;
    }
}
}
[/code]

-> buttonMode가 true이면, 마우스 포인터를 Sprite객체위에 놓으면 모양을 손가락 모양으로 바꾼다.

* 그런데 만약 Sprite 객체로 버튼을 만들어 꾸며서 사용할 경우에는 buttonMode = true 속성 뿐 아니라,

useHandCursor = true 속성과 mouseChildren = false 를 함께 적용해주면 예기치 않은 동작에서 벗어 날

수 있다.

useHandCursor는 기본값이 true인데 이 속성은 buttonMode = true인 상태에서 손 모양 커서를 표시하겠다는 뜻이고, mouseChildren 해당 객체의 자식에서 마우스의 기능을 사용할 것인지의 여부이다. 결론적으로 false인데 그 이유는 예를 들어

 

[code as3]
var spriteArea Sprite = new Sprite();
addChild( spriteArea );

var circle Sprite = new Sprite();
circle.graphics.beginFill( 0xFFFF00 );
circle.graphice.drawCircle( 0, 0, 100, 100 );
addChild( circle );

spriteArea.mouseChildren = false;
[/code]

이런식으로 자식 인스턴스에서만 마우스가 표시되어야지 부모까지 적용이 되게하면 마우스 포인터를 궂이

손 모양으로 지정해주는 의미가 없어지기 때문이다. 더 정확히 http://67740420.textcube.com/?page=9

여기 예제에서 Search 버튼인 자식 인스턴스에서는 손 모양이 적용되고 버튼 바깥부분인 부모 인스턴스에서

는 평범한 화살표 모양으로 바뀌게 되는 것이다.

 

if문 조건에서인 alpha_a인 지한 A무비클립(Sprite 객체)과 alphaFrame_a인 연한 색의 stage에 있는 A무비클립(DisplayObject 표시 객체) 영역의 겹침 부분을 감지하여 Boolean값으로 반환한다. 그런데 여기서 영역 대 영역으로 감지란 눈에 보이는 무비클립의 모양이 아닌, 네모 영역으로 겹침을 판단한다.

이렇게 되면 if조건을 true로 인식하고 alpha_a의 x와 y좌표 위치를 alphaFrame_a의 x와 y좌표 위치로 이동

시키는 것이다.

 

 

댓글 없음:

댓글 쓰기