scaleform.minarto.com

scaleform 3&4 - 3 : MouseEvent 1/ 2 본문

Scaleform

scaleform 3&4 - 3 : MouseEvent 1/ 2

미나토 2011. 8. 28. 18:01

as2 와 as3간의 차이에서 헷갈릴 수 있는 하나가 또 있는데 MouseEvent 이다...


as2 와 as3 MouseEvent 의 차이는 다음과 같다.

as3.DOWN == as2.PRESS
as3.UP == as2.RELEASE
as3.CLICK == as2.(PRESS + RELEASE)
as3.stage.DOWN == as2.DOWN
as3.stage.UP == as2.UP

꽤 많은 차이가 남을 알 수 있을 것이다...

rollOver 와 rollOut 빼고는 다 차이난다고 보면 된다.
게다가 scaleform 에서 지원하는 다중컨트럴/마우스 지원, 다중마우스 버튼 등을 지원하기 위한 차이 또한 있다.


clik 프레임웍에서는 as3 의 click 과 doubliclick  타입만을 추가로 지원해준다.

말 그대로 타입만이다... as3의 MouseEvent 에서 받을 수 있는 alt, ctrl, shift 키등이 눌러져 있는지의 여부라거나, 마우스의 위치 등은 받을 수 없다.

그리고 as2의 큰 문제가 있는데(문제라기 보다는 스펙상) 마우스 이벤트를 걸면 해당 무비클립 안의 무비클립들은 인터랙션이 일어나지 않는다는 것...
그러다 보니 그냥 불필요하게 히트영역이라던가 별개의 드래그 영역 버튼 들을 만들어 배치하는 식의 꼼수를 부리기도 한다


인터랙션이 생명인 UI 작업을 위해 이 부분만은 개선하고 넘어가야 한다고 생각한다... 

down과 up은 바로 press 와 release 로 매칭되고 click 도 press와 release 의 조합으로 어찌어찌 니 그냥 쓰면 되겠는데 stage 가 문제다.

stage down 보다는 up이 문제인데... 이게 대부분 drag 이벤트 시에 많이 일어난다. 버튼의 이동이라거나 스크롤의 이동 말이다.


해당버튼의 up으로 하면 되지 않겠냐고 하시겠으나... 플래시로 개발해 보신 분은 알 듯이... 마우스가 화면 밖으로 드래그 한채 나가버렸다거나 할때가 문제다


그래서 as2에서는 release 와 releaseOutSide 를 같이 써주는 방식으로 개발을 한다... 그렇다고 요 두개로 할 필요는 없다.

우리에게는 Mouse class 가 있기 때문이다...


버튼마다 걸어주는 것은 이벤트의 낭비일 뿐더러, 어차피 스케일폼에서는 mouseWheel 을 처리하기 위해 Mouse class 를 사용해야 한다.


그리고 스케일폼의 확장기능을 사용하면 Mouse class 의 이벤트를 사용하면 화면의 마우스 포인트가 있는 위치의 객체경로를 뽑아주는데 (_root.main.button 뭐 이런식) 이걸 유심히 생각해보자


바로 as3에서 활용할 수 있는 버블링단계를 거치는 컨테이너 구조가 아니겠는가...

Mouse class 의 이벤트리스너 객체에 다음과 같이 메소드를 만들면,

function onMouseWheel($delta:Number, $targetPath:String, $controllerIdx:Number, $x:Number, $y:Number):Void

$targetPath 로 위의 경로가 떨어지는데 이건 


function targetPathToObject($targetPath:String):Object
{
var a:Array = $targetPath.split(".");
var path:Object = _root;
var length:Number = a.length;
var i:Number = 0;
while(++ i < length)
{
path = path[a[i]];
}
return path;
}

뭐 이런식으로 주면 경로 String 을 플래시 객체로 뽑아낼 수 있다


그러면 객체가 바로 as3의 MouseEvent class 의 currenTarget 속성이 되는 것이고 최상위 객체는 target 속성이 될 수 있다 
 


요 이벤트 리스너 객체를 CStage class 라고 명명짓자(Stage class 는 이미 있으니)... 앞서 말했던 EventDispatcher 는 상속받아야 한다.

Stage 는 유일한 녀석이니, 싱글턴 형태가 되어야 할 것이고... 이제 여기다가 키보드 리스너까지 붙여버리면 그 활용성은 더 높아질 것이다...