Starling에는 별도의 마우스 이벤트가 존재하지 않습니다.
대신 Touch이벤트로 마우스 이벤트를 대신할 수 있는데...
(Mouse 이벤트를 Touch이벤트에 통합한게 아닐까 생각합니다.)
MouseOver와 MouseOut을 구현하기에는 Touch이벤트의 Hover이벤트 뭔가 부족합니다.
이유는 이 Hover라는 이벤트가 마우스가 Over상태에서도 Out상태에서도 그냥 Hover이라는 이벤트만 알리기 때문에 실제 프로그래머는 Over인지 Out인지 알 수가 없기 때문입니다.

MouseOver와 MouseOut을 어떻게 구현해야 할지 고민해야 하다니...
그래서 구글링도 하고 설명서도 뒤져가며 방법을 찾아냈습니다.
구글링을 하다보면 

private function _hitTouchHandler(e:TouchEvent):void
{
	if (e.getTouch(this).phase == TouchPhase.HOVER)
	{
		// MouseOver Here
	}
	else
	{
		// MouseOut Here
	}
}

형태로 Over, Out을 구별할 수 있다고 나온곳이 많은데 적용해보면 생각대로 되지 않습니다;;
왜냐하면 위 형태대로라면 객체에서 마우스가 나갈 때 e.getTouch(this).phase 값이 null을 반환해야 하지만 객체가 마우스를 나갈때는 TouchPhase.HOVER값을 호출하기 때문입니다.

Over, Out을 재대로 구분하려면 마우스가 객체위에 있는지 밖에 있는지 구분할 수 있는 값이 필요합니다.
그래서 Starling 참조 설명서를 봤더니 
interactsWith라는 함수가 있었습니다.
이 함수는 파라미터로 객체를 넣어주면 현재 TouchEvent가 객체와 충동하는지 여부를 알려줍니다.
객체와의 hitTest결과를 반환(Boolean)하는거죠.
그래서 TouchPhase.HOVER와 interactsWith함수를 활용하면 Over와 Out을 구별해 낼 수 있습니다.

private function hitTouchHandler(e:TouchEvent):void 
{
	var touch:Touch = e.getTouch(this);
	
	if (touch)
	{
		if (touch.phase == TouchPhase.HOVER && e.interactsWith(e.target))
		{
			if (!_isOver)
			{
				// MouseOver here!
				_isOver = true;
			}
		}
		else if (touch.phase == TouchPhase.HOVER && !e.interactsWith(e.target))
		{
			// MouseOut here!
			_isOver = false;
		}
	}
}

위와 같이 Over와 Out을 구현할 수 있습니다.

그리고 _isOver값이 있는데요...
객체에 마우스가 올라가면 마우스가 객체위를 움직일 때마다 계속해서 TouchPhase.HOVER을 남발하게 됩니다;;
마우스 오버시 명령어를 한 번만 실행하기 위해서 _isOver값을 넣었습니다.
이상 Starling에서 MouseOver, MouseOut 구현하기였습니다.

'FLASH > Starling' 카테고리의 다른 글

Starling - MouseOver? MouseOut? 구현하기;;  (0) 2013.06.21
Posted by 레들러 트랙백 0 : 댓글 0

댓글을 달아 주세요