본문 바로가기

Starling

Starling - TouchEvent



Starling 은 게임(중에서도 모바일) 을 대상으로 만들어져있어 그런지 이벤트쪽 클래스들이 몇개 없다.

(이후 특별한 언급이 없으면 모든 클래스들은 동일이름의 표준 클래스가 아닌 Starling 의 클래스를 지칭함)

가장 중요한 이벤트는 역시 TouchEvent


EventIDispatcher 를 상속받은 클래스는 터치이벤트를 받는다. DisplayObject는 EventDispatcher 를 상속받는다.
고로 모든 표시객체는 터치이벤트를 받는다.

TouchEvent 클래스는 기존의 표준 TouchEvent와 상당히 다름에도 불구하고 이름이 같아 처음에 좀 헷갈린다.


TouchEvent는 아래와 같다.




TouchEvent 클래스의 이벤트종류는 딱 하나다.


두둥...

TOUCH_BEGIN,END,MOVE,OUT,OVER,TAP 이딴건 없다. 쿨하게 TOUCH 끝.
손으로 터치하든 문지르르든 마우스 클릭이든 심지어 마우스오버까지도 걍 TOUCH 하나로 종결

주목할것은  touches 라는 속성인데 현재 일어난 모든 터치에 대한 정보를 가진 Touch객체의 벡터다.
Touch 클래스는 터치이벤트에 대한 정보를 가지고 있다.

실제로 이객체를 통해서 방금일어난 이벤트가 "터치"인지 "드래그" 인지 "마우스오버" 인지를 판단한다.


그럼 손가락을 누르고  때고 움직이고 하는 다양한 상황에서 어떻게 원하는 이벤트에 해당하는 touch 객체를 찾느냐...
Starling은 touches 속성으로 얻은 벡터를 귀찮게 while과 for 를 통해 검사하지 않게 2가지의 메소드를 준비해주셨음.


target은 터치이벤트가 일어난 대상이다.

phase는 기존 표준 API의 GestureEvent의 phase와 비슷하다. Starling 에선 TouchPhase클래스의 상수로 정의되어있다.
종류는 아래와 같다.



살짝 바꼈긴 하지만  기존 표준 API의 GestureEvent 상수와 비슷하다.
개인적으로 Starling 쪽이 더 직관적인것같다. 

언뜻보면 정체를 알수 없을지도 모를 상수가 2개있는데 HOVER 와 STATIONARY 이다.

HOVER :  눌러지지 않은 버튼에서 커서가 호버어쩌고 하는데 쉽게말하자면 마우스포인터가 오버된 상태를 말한다.

  대체로 마우스오버라고 생각하면 되지만 마우스 포인터가 꼭 마우스로만 이동하지 않는다는 점을 고려만 하면

  될것 같다.(터치펜등등)

STATIONARY : 손가락이나 마우스가 버튼을 누른상태에서 이전프레임이후로 이동하지 않은상태......뭔말이야 모르겠음;                     



어째든 이 getTouch 혹은 getTouches 메서드에 위 2가지 파라메터를 통해 로 원하는 Touch객체를 얻어낼 수 있다.

아래는 stage에서 일어난 Touch Move 즉 드래그에 관련된 Touch 객체를 얻는 코드이다. 

addEventListener(TouchEvent.TOUCH,onTouchHandler);
private function onTouchHandler($e:TouchEvent):void{

var touches:Vector.<Touch> = $e.getTouches(stage, TouchPhase.MOVED);

}



Touch 클래스는 다음과 같다.


심플하다.

기존의 표준 TouchEvent를 적절히 2개의 클래스(TouchEvent,Touch) 로 나눈기분이다.

TouchEvent는 기존의 이벤트클래스구조에서 Touch 객체를 관리하는 Manager 기능을 추가된 느낌이랄까.


예를 들어 컨트롤키를 눌렀는지 쉬프트키를 눌렀는지를 확인하는 것은 TouchEvent 클래스에 있다.
터치할 손가락은 여러개지만 키보드를 여러개 꼽아 컨트롤키를 2개 동시에 누르는 경우는 없으니
다수가 존재할 수 있는 touch 객체가 아닌 TouchEvent 클래스에서 지원한다.

결국 큰 흐름은 대상에서 모든 Touch 관련 이벤트가 일어나면
원하는 이벤트에 관련된 Touch객체를 TouchEvent클래스를 이용하여 얻은 뒤
Touch객체의 속성을 이용하여 기능을 구현하는 방향으로 이루어지게 된다.